Donnerstag, 14. Februar 2019

Projekt: Nintendo DS Lite als Gamepad für den PC

Schon von Anfang an war es bei Erstellung dieses Blogs nicht das Ziel nur Reviews und News zum Thema Homebrew zu bringen, sondern es sollten die Konsolen auf eine positive, DIY-Art zweckentfremdet werden. Leider sind solche Projekte immer recht zeitaufwändig und häufig nicht einfach umzusetzen, weshalb es erst jetzt zu einem richtigen DIY Projekt kommt.
Die erste und einfachste Modifikationsmöglichkeit wenn man an Konsolen denkt sind zumindest bei mir Controller.

Inspirationen

Wie es sich für ein gutes Projekt gehört gab es einige Inspirationsquellen für dieses Projekt. Einerseits den Youtubekanal Insert Controller Here, der alle möglichen Gegenstände zu Controller zweckentfremdet (zum Beispiel Mayonnaise) und zum anderen InsideGadgets Wireless Gameboy Controller mit dem man Gameboys und Gameboy Advances als Controller für einen Computer umfunktionieren kann (über die GBA Cartridge auch DS und DS Lite Konsolen - allerdings fehlen einige Tasten).

Die Theorie

Dadurch, dass ich noch eine DSerial EDGE herumfliegen habe war der Plan relativ schnell vorhanden. Die DSerial EDGE schickt die gedrückten Tasten über eine UART-Verbindung zu einem Microcontroller, der dann als Gamepad für den Computer erscheint; sozusagen als "UART zu Gamepad" Converter.

Zuerst war der Plan einen Digispark Microcontroller mit einem ATTINY85-Chip zu verwenden. Hier hat sich allerdings das Problem herausgestellt, dass er neben den USB Anschlüssen kein zweites in Hardware implementiertes UART Interface hat wodurch es per Software emuliert werden müsste. Dies birgt ein weiteres Problem: die Digispark SoftwareSerial Library ist nicht ohne Veränderungen mit der DigiSpark Joystick Library kompatibel. Deshalb wurde diese Idee verworfen.
Der nächste (und schlussendliche) Microcontroller, der verwendet wurde, ist ein arduinoartiger Pro Micro Chip, der auf dem Leonardo basiert aber etwas kleiner ist. Dementsprechend sollte auch ein Arduino Leonardo oder ein Arduino Micro nutzbar sein.
Nachdem dieses Problem gelöst war ist die Hardware ziemlich trivial. Die DSerial EDGE wird über 2 UART Pins und den Ground mit dem Pro Micro verbunden; der Pro Micro über USB mit dem PC. Da der Pro Micro mit 5V läuft, die DSerial EDGE allerdings nur mit 3V3, kann man noch einen Spannungswandler einbauen.

Als nächstes kam die Frage wie das Protokoll aussehen soll. Wann werden welche Daten gesendet? Benötigt man eine Sequenznummer oder eine Prüfsumme?
Nach einigem Probieren habe ich mich für folgendes Protokoll entschieden:
Ein übertragener Byte besteht aus einer Art Sequenznummer (4 Bit) und den eigentlichen Daten (4 Bit). Die Sequenznummer gibt allerdings nicht die richtige Reihenfolge der Pakete vor sondern nur die Tasten für die die Daten sind. Jedes Datenbit steht für den Zustand einer Taste: 0 bedeutet nicht gedrückt, 1 bedeutet gedrückt. Es gibt insgesamt 4 unterschiedliche Byte
Sequenznummer 0000: Steuerkreuz, also RIGHT, UP, LEFT und DOWN
Sequenznummer 0001: A, B, X und Y
Sequenznummer 0010: L, R, START und SELECT
Sequenznummer 0011: TOUCHSCREEN (1 bedeutet der Bildschirm wird berührt)

Der Arduino unterscheidet anhand der Sequenznummer zwischen drei Fällen: Wenn die Nummer 0, also das Steuerkreuz ist, dann werden die übertragenen Bit als Joystick interpretiert (der nur digitale Abtastung hat). Bei 1 und 2 werden die Eingaben ganz gewöhnlich als Tasten interpretiert. Da der Touchscreen nur eine einzige Taste hat lässt sich nicht die vorherige Funktion verwenden; 3 hat also auch einen eigenen Fall.

Die Praxis

Bisher werden immer alle Tasteninformationen nacheinander übertragen. Dadurch werden die Sequenznummern etwas unnötig aber fehlerhafte Übertragungen fallen nicht so stark ins Gewicht weil die Daten direkt danach noch einmal übertragen werden.
Dadurch, dass der Arduino für den Computer als Joystick erkannt wird, ist keine Installation am Computer notwendig. Selbiges gilt für den DS - er muss nur mit der DSerial EDGE kompatibel sein (DSi Konsolen werden damit ausgeschlossen und 3DS Konsolen benötigen Softwarepatches).
Den Quellcode von der DS Anwendung findest du hier und hier gibt es den Quellcode für den Pro Micro. Du solltest dich allerdings etwas mit der binären Darstellung auskennen um ihn zu verstehen (was bewirken Bitverschiebungen, Multiplikationen und Divisionen mit vielfachen von 2, wie funktioniert das logische OR und wie funktioniert das logische AND).
Damit man den DS etwas freier bewegen kann habe ich das Breadboard an den DS geklebt.

Ausblick auf die Zukunft

Wenn man sich das Protokoll genauer anschaut sieht man, dass zwei Bit der Sequenznummer nicht verwendet werden. Genau so wird erst ein Datenbit für den Touchscreen verwendet. Dadurch könnte man vielleicht mehrere Optionen auf dem Touchscreen verwirklichen; zum Beispiel einen "Joystick" wie bei einem Gamepad und/oder einige weitere Tasten für die Schultertasten etc. Außerdem könnte man die tatsächliche Position auf dem Touchscreen übertragen (zum Beispiel für Emulatoren).
Eine andere Idee wäre über den GBA Slot und/oder die freien Pins von der DSerial EDGE weitere Funktionen bereitzustellen, zum Beispiel Rumble oder Bewegungssteuerungen.
Bisher werden auch noch keine Daten vom Arduino an die DSerial EDGE übertragen. Eine Bildschirmübertragung, die vielleicht naheligt, wird allerdings nicht implementiert. Dazu wäre ein eigener Treiber notwendig - die PC-Seite wäre nicht mehr "Plug and Play".
Ob oder wann das umgesetzt wird ist allerdings nicht sicher. Ich habe nämlich noch viele andere Ideen für Projekte ;)

Keine Kommentare:

Kommentar veröffentlichen

Projekt: Nintendo DS Lite als Gamepad für den PC

Schon von Anfang an war es bei Erstellung dieses Blogs nicht das Ziel nur Reviews und News zum Thema Homebrew zu bringen, sondern es sollt...