Interaktives Motherboard

Aus toolbox_interaktion
Wechseln zu: Navigation, Suche


Idee

Im Rahmen des Praktikums im Fach Interaktion während des Sommersemesters 2016 wurde uns die Aufgabe übertragen eine Projekt-Idee zu finden, die es einem Benutzer ermöglicht Hard-bzw. Software interaktiv zu steuern. Die Entscheidung fiel auf ein interaktives Lernspiel mit dem Namen "Interaktives Motherboard". In diesem Spiel kann eine Hauptplatine (Motherboard) eines PCs (Personal Computer) mit den für die Funktionalität wichtigen Hardwarekomponenten bestückt werden. Es sollen Beschreibungen zu den Schnittstellen und zu den Komponenten bereitgestellt werden, um es dem Benutzer zu ermöglichen alle Komponenten auf die entsprechende Schnittstelle auf dem Motherboard bewegen zu können und dadurch das Spiel erfolgreich zu beenden.

Für die Umsetzung einer interaktiver Steuerung, d.h. durch Handbewegungen, bzw. Körperbewegungen im Allgemeinen, gibt es viele mögliche Ansätze. Wichtig für ein Projekt im Bereich der Interaktion ist die "Usability" (Anwenderfreundlichkeit) des fertigen Produktes. Es galt also darauf zu achten, dass die Bedienung der Software so intuitiv wie möglich zu gestalten. Ein beliebtest Eingabegerät bei Menschen aller Altersgruppen, das in der Kategorie Interaktion zu finden ist, ist der Controller der Nintendo Spielkonsole "WII". Dieser Controller verfügt über mehrere Sensoren, wie Bewegungs-und Rotationssensoren, sowie einiger Tasten, die zur Bedienung verwendet werden können. Auf Grund der Beliebtheit des Controllers und seiner einfachen Beschaffenheit entschieden wir uns diesen für unser Projekt zu nutzen.

Das Projekt bestand somit grob aus drei Teilen:

  - Hardware (Wii-Controller und dessen Daten Richtung PC senden)
  - Umsetzung der Signale (Verarbeitung der Wii-Controller-Signale und Umsetzung in die Software-Umgebung)
  - Software (Planung und Implementierung der Bedienoberfläche und der Programm-(Spiel-)Logik)

Die genutzte Entwicklungsumgebung war das Visual Studio 2015 und die gewählte Programmiersprache C++. Für die Umsetzung wurde ein Projekt auf der Basis des OpenFramework erstellt und deren Funktionen genutzt.

Software

Die Softwarekomponente des Projektes unterscheidet sich in zwei Teilen:

  - Verarbeitung des Inputs vom Wii-Controller und Aufruf der entsprechenden Funktionen
  - Entwicklung und Implementierung der aufzurufenden Funktionen und der Spiellogik

Für diese Teile wurden jeweils C++-Klassen implementiert, die die Softwarearchitektur möglichst objektorientiert und strukturiert gestalten sollten.

Klassendiagramm

Die grundlegende Klasse des openFrameworks ofApp bietet bereits viele Funktionen die auf Systemaktionen reagiert. Folgende wurden für dieses Projekt genutzt:

- ofApp::setup()   [wird genutzt um Daten zur Nutzung vorzubereiten, Objekte anlegen, Variablen initialisieren]
- ofApp::update()   [wird zyklisch ausgeführt, meist zur zyklischen Abfrage von Variablen genutzt]
- ofApp::draw()   [wird zyklisch ausgeführt, zum zeichnen von Bildern]
- ofApp::mousePressed(int x, int y, int button)   [wird ausgeführt sobald eine Maustaste gedrückt wird, liefert Koordinaten und gedrückte Maustaste]
- ofApp::mouseReleased(int x, int y, int button)   [wird ausgeführt sobald eine Maustaste losgelassen wird, liefert Koordinaten und gedrückte Maustaste]
- ofApp::keyPressed(int key) [wird ausgeführt sobald Tastaturtaste gedrückt wird, liefert gedrückte Taste]

Es wurden noch weitere Klassen angelegt:

- Motherboard [Klasse für das Motherboard]
- Mother_Interface [Klasse für die auf dem Motherboard befindlichen Schnittstellen]
- Item_Class [Klasse für die einzelnen Komponenten]
- GridPosition [Klasse für Koordinaten]

Folgendes Klassendiagramm zeigt die Abhängigkeiten unter den Klassen: InteraktivesMotherboard Klassendiagramm.png

Spiellogik

Für die einzelnen Komponenten des Spieles und deren Klassen wurden eigene draw-Mehtoden implementiert, die das in dem jeweiligen Objekt befindliche ofImage-Objekt auf dem Bildschirm zeichnet. Nach jeder Änderung an den, auf dem Bildschirm befindlichen, Objekten wurde ein Picture-mode angepasst. Dieser entscheidet in welcher Ansicht die Komponente angezeigt wird. Es kann zwischen vier Ansichten unterschieden werden:

- Visitenkarte [Anzeige bei Start des Spiels]
- Info-Seite [Anzeige nach druck der B-Taste auf der Visitenkartenansicht]
- Einstecken [Komponenten wird beim bewegen in der Ansicht präsentiert in der sie auf das Board gesteckt wird]
- Eingesteckt [Komponente auf Motherboard]

Die ofApp-Methoden mousePressed(...), mouseReleased(...) und keyPressed(...) wurden genutzt um Steuerungsaktionen, die auf dem Spielbildschirm ausgeführt wurden abzufangen und zu interpretieren.

mousePressed(int x, int y, int button)

Diese Funktion wurde genutzt um einen Maus-klick an den Koordinaten (x,y) abzufangen, die variable button enthielt die Information welche Maustaste gedrückt wurde (links oder rechts). Wurde mit der linken Maus-Taste auf eine Visitenkarten einer Komponente gedrückt und die Taste gedrückt gelassen konnte die Einstecken-Ansicht der Komponente angezeigt werden. Während die linke Maustaste bei Bewegung gedrückt gelassen wurde folgte die Einstecken-Grafik der Komponente dem Mauszeiger

War die betätigte Taste jedoch die rechte Maustaste wurde die Info-Seite der Komponente angezeigt.

mouseReleased(int x, int y, int button)

Nachdem die linke Maustaste nach bewegen der Komponente losgelassen wurde, wird in dieser Funktion überprüft, ob sich die Komponente während des Loslassens über der richtigen Schnittstelle auf dem Motherboard befindet. Zwei mögliche Szenarien ergeben sich aus dieser Situation:

- Komponente über korrekten Schnittstelle => wechseln in Eingesteckt-Ansicht
keyPressed(int key)

Für verschiedene Tasten wurden in verschiedenen Phasen des Spiel diverse Aktionen festgelegt.

InteraktivesMotherboard Keys.png

Umsetzung der Signale

Die empfangenen Nachrichten vom Arduino müssen richtig interpretiert werden und die zugeordneten openFrameworks internen Funktionen auslösen. Die Kommunikation erfolgt, wie bereits erwähnt, Seriell (siehe [[1]]).

Die Klasse "communication" beinhaltet die Routinen zum empfangen und senden von Seriellen Nachrichten. In dieser Klasse besteht die Möglichkeit die benötigten Parameter bzw. Nachrichten vom Arduino quasi zu "Abonnieren".

Dies erfolgt nachfolgendem Schema:

send("AT+BTN=A,1\r\n"); // "Abo" auf Button A mit 1 aktiviert bzw. 0 deaktiviert

Nach dem "Abonnieren" werden die Daten zyklisch empfangen. Das Auswerten der Empfangenen Strings wird in der Klasse "decode" durchgeführt. Dort wird mithilfe von regulären Ausdrücken der empfangene String durchsucht, decodiert und abschließend zu einen command string zusammengesetzt. Dieser beinhaltet die notwendigen Informationen um die in openFrameworks vorhandenen Funktionen, mittels Switch/Case Logik, aufzurufen. Das auswerten des command string geschieht in der ofApp::update() Funktion, welche zyklisch aufgerufen wird.

Oberflächendesign

Der Aufbau der Oberfläche sollte sich wie folgt gestalten. Bei Starten des Programmes wird der Benutzer durch einen Willkommensbildschirm begrüßt. Die Navigation durch die einzelnen Teile des Spieles werden jeweils als Bilder der zudrückenden Tasten visualisiert. Nach einem Druck einer beliebigen Taste gelangt der Benutzer zu einer Spielanleitung. Dort wird kurz die gestellte Aufgabe beschrieben, sowie die Belegung der Wii-Controller Tasten. Durch einen druck auf die A-Taste wird der eigentliche Spielbereich angezeigt. Diese Ansicht kann in zwei Teile getrennt werden.

Bedienung

Folgende Abbildung zeigt die Bedienungsanleitung, im Spiel erreichbar durch druck auf die +-Taste

InteraktivesMotherboard Instructions.png

Linke Bildschirmhälfte

- Bild von Motherboard (unbestückt) mit Schnittstellen

Rechte Bildschirmhälfte

- Komponenten im Visitenkartenformat

InteraktivesMotherboard Spieloberfläche.png

Quellcode

Der Quellcode zum Projekt ist zu finden unter: InteraktivesMotherboard - Projekt

Hardware

Zum steuern des Spieles soll ein Wii-Controller verwendet werden. Da es in früheren Jahrgängen zu größeren Problemen mit den Treibern für den Wii-Controller gab, wollten wir einen neuen Ansatz verfolgen. Dabei wird ein Arduino über RS232 angesteuert. Dies hat den Vorteil, dass es Betriebssystemunabhängig leicht anzusteuern geht.
Bei der Implimentierung wurde vorallem darauf geachtet, dass das Protokoll später auch von möglichst vielen anderen Projekten verwendet werden kann. Die ausführliche Dokumentation ist unter 'Wii - Anbindung über Arduino' zu finden.
Wii Arduino Schema.png Wii Arduino.jpg

Dateien für Arduino