Projekt 2: Arduino als Controller
Ziel dieses Projektes ist es, einen Controller mithilfe des Arduinos zu bauen. Der Arduino wird dann in der Lage sein, mithilfe von DirectInput mit dem Computer zu kommunizieren. Dabei wird die Firmware des USB-Controllers mit einer modifizierten Version überschrieben, weshalb diese Anleitung nur mit Arduinos kompatibel ist, welche den ATmega328 verwenden.
Original Arduino (ATmega328):
Abb. 1: Original Arduino
Dritthersteller Arduino (CH340G/CH341G):
Abb. 2: Dritthersteller Arduino
Falls Sie einen Dritthersteller-Arduino verwenden, welcher einen kleinen quadratischen Chip besitzt, ist dieser mit großer Wahrscheinlichkeit inkompatibel.
A. Komponentenliste
1x Arduino Uno
2x Analog Sticks
11x Taster
B. Installation der benötigten Software und Treiber
1. Atmel Flip Installieren
Mithilfe von Atmel Flip wird die Firmware des USB-Controller überspielt.
Flip herunterladen:
http://www.microchip.com/developmenttools/ProductDetails.aspx?PartNO=FLIP
Abb. 3: Download von Atmel Flip auf microchip.com
Auf der Seite finden Sie den Download für Flip, es wird empfohlen das Installationsprogramm mit der integrierten Java Runtime herunterzuladen, da Flip hierbei wählerisch ist und den Start sonst verweigert. Bei der Installation selbst ist hierbei nichts weiter zu beachten.
2. UnoJoy
Damit der Arduino auch als Controller verwendet werden kann, kommt UnoJoy zum Einsatz. Hierbei handelt es sich um eine schon vorgefertigte Firmware für den USB-Controller und eine Arduino Bibliothek. UnoJoy ist auf GitHub zu finden:
https://github.com/AlanChatham/UnoJoy
Die benötigten Dateien bekommen Sie, wenn die auf „Clone or download“ drücken und hier „Download ZIP“ wählen.
Abb. 4: Download von UnoJoy auf GitHub.com
Entpacken Sie das Archiv nach dem Herunterladen an einen beliebigen Ort. Gehen Sie dann in den Ordner Drivers und dort den Unterordner Windows. Starten Sie hier dpinst-amd64.exe wenn sie ein 64-Bit Windows verwenden und dpinst-x86.exe wenn Sie ein 32-Bit Windows verwenden.
Abb. 5: Installation des Treibers
Es kann sein das die Installation des Atmel Corporation Treibers fehlschlägt, das ist allerdings kein Problem solange der libusb Treiber betriebsbereit ist.
C. Arduino vorbereiten
Erstellen Sie einen neuen Arduino Sketch und speichern Sie diesen als Controller.ino ab. In den eben entpackten Ordner gehen Sie in den UnoJoy Unterordner und kopieren Sie die „UnoJoy.h“ Datei. Fügen Sie diese bei den eben gespeicherten Arduino Sketch ein.
Öffnen Sie die Controller.ino und fügen Sie folgenden Beispiel-Quelltext ein:
#include "UnoJoy.h" byte DPadUp = 10; byte DPadDown = 12; byte DPadLeft = 11; byte DPadRight = 9; byte ButtonA = 5; byte ButtonB = 4; byte ButtonX = 3; byte ButtonY = 2; byte ButtonStart = 6; byte ButtonSelect = 8; byte ButtonHome = 7; byte lAnalogHorizontal = A0; byte lAnalogVertical = A1; byte lAnalogClick = A2; byte rAnalogHorizontal = A3; byte rAnalogVertical = A4; byte rAnalogClick = A5; byte buttonArray[] = { DPadUp, DPadDown, DPadLeft, DPadRight, ButtonA, ButtonB, ButtonX, ButtonY, ButtonStart, ButtonSelect, ButtonHome, lAnalogClick, rAnalogClick, lAnalogHorizontal, lAnalogVertical, rAnalogHorizontal, rAnalogVertical}; void setup(){ setupPins(); setupUnoJoy(); } void loop(){ dataForController_t controllerData = getControllerData(); setControllerData(controllerData); } void setupPins(void){ for (int i = 0; i < sizeof(buttonArray)-4; i++){ pinMode(buttonArray[i], INPUT); digitalWrite(buttonArray[i], HIGH); } } dataForController_t getControllerData() { dataForController_t controllerData = getBlankDataForController(); controllerData.crossOn = !digitalRead(ButtonA); controllerData.circleOn = !digitalRead(ButtonB); controllerData.triangleOn = !digitalRead(ButtonY); controllerData.squareOn = !digitalRead(ButtonX); controllerData.dpadUpOn = !digitalRead(DPadUp); controllerData.dpadDownOn = !digitalRead(DPadDown); controllerData.dpadLeftOn = !digitalRead(DPadLeft); controllerData.dpadRightOn = !digitalRead(DPadRight); controllerData.startOn = !digitalRead(ButtonStart); controllerData.selectOn = !digitalRead(ButtonSelect); controllerData.homeOn = !digitalRead(ButtonHome); controllerData.r1On = !digitalRead(rAnalogClick); controllerData.l1On = !digitalRead(lAnalogClick); (void) analogRead(lAnalogHorizontal); controllerData.leftStickX = analogRead(lAnalogHorizontal) >> 2; (void) analogRead(lAnalogVertical); controllerData.leftStickY = analogRead(lAnalogVertical) >> 2; (void) analogRead(rAnalogHorizontal); controllerData.rightStickX = analogRead(rAnalogHorizontal) >> 2; (void) analogRead(rAnalogVertical); controllerData.rightStickY = analogRead(rAnalogVertical) >> 2; return controllerData; }
Mithilfe der UnoJoy.h haben Sie Zugriff auf die Funktion setControllerData(), diese gibt den Status der Taster an den Computer weiter. In der Funktion getControllerData() werden die Pins ausgewertet und den entsprechenden Tastendrücken zugewiesen. Schließen Sie den Arduino an den Computer und Laden das Programm auf ihn.
1. DFU-Modus
Damit Sie die Firmware des USB-Controllers überspielen können, müssen Sie den Arduino in den DFU-Modus (Device Firmware Upgrade) versetzen.
Abb. 6: Arduino in DFU-Modus versetzen
Um in den DFU-Modus zu wechseln, müssen Sie die beiden rot markierten Pins überbrücken, dazu können Sie z.B. ein Kabelende verwenden. Nach dem Überbrücken sollten Sie ein Ton von Windows hören, dass ein Gerät abgeschlossen und wieder angeschlossen wurde. Wechseln Sie erneut in das UnoJoy Verzeichnis und in den UnoJoy Unterordner, starten Sie TurnIntoAJoystick.bat um die neue Firmware aufzuspielen. Die Ausgabe sollte wie folgt aussehen:
Abb. 7: Ausgabe TurnIntoAJoystick.bat
Der DFU-Modus ist immer nur so lange aktiv wie der Arduino eingeschaltet ist. Um den DFU-Modus zu beenden, trennen Sie das USB-Kabel vom Computer und schließen es wieder an, Windows erkennt den Arduino jetzt als Controller. Es ist jetzt nicht mehr möglich, Programme auf den Arduino hochzuladen, dazu müssen Sie erst wieder die Firmware wechseln. Dies ist mithilfe der TurnIntoAnArduino.bat möglich.
D. Aufbau
Das folgende Bild zeigt einen Beispielaufbau eines Controllers. Die Pinbelegung entspricht der aus dem Beispiel Quelltext.
Abb. 8: Beispielaufbau eines Controllers
E. Funktionstest
Der Controller ist somit fertiggestellt und einsatzbereit. Den Controller können Sie unter http://html5gamepad.com/ testen. Hierbei meldet sich dieser direkt als „UnoJoy Joystick“.
Abb. 9: Controller Test von html5gamepad.com
Auch können Sie den Controller am Raspberry Pi verwenden. Er wird von den gängigen Spielesystemen wie RetroPie sowie Recalbox OS erkannt.
Sie können jetzt dank des Arduinos verschiedene Kombinationen aus Bauteilen zu einem Controller umfunktionieren, so wäre eine Steuerung durch Gyroskop, Mikrofon oder Lichtsensor denkbar.
Diese Seite wurde noch nicht kommentiert.