Aus einem Arduino einen USB Joystick machen – Teil 1

Nur eine Sammlung von Links und Gedanken – keine Ergebnisse

Heute sind wir auf die Idee gekommen, für diverse Spiele selbst einen Joystick und andere Eingabegeräte zu bauen. Das Bauen mag aufwendig sein, das Auslesen ein Kinderspiel, die Daten rüber auf den PC zu bringen wird aber zur Krux.

Natürlich wollen wir so ein Gerät mit jedem Spiel, das mit handelsüblichen Joysticks arbeitet, benutzen können. Wir müssen also dem Computer glaubhaft machen, dass wir ein solcher Joystick wären. Der Standard Arduino kann das nicht, er hat einen FTDI Chip zur USB-Kommunikation, der sich nur als USB-COM Schnittstelle ausgibt. Der Leonardo mit seinem 32U4 hat einen nativen USB Port, mit dem er Mäuse und Keyboards emuliert. Nicht schlecht, aber noch nicht so ganz das Richtige.

Wir brauchen vollständige Kontrolle über den USB-Port, denn wir müssen dem Computer eine selbst erstellte HID Descriptor Datei unterschieben, die ihm die Funktionalität des Geräts vermittelt. Dann senden wir ihm laufend neue “Reports”, in denen alle Werte der Taster und Sensoren  drin stehen. Folgende Ansätze habe ich bisher gefunden:

  • Mjoy: Ein ATmega ohne nativen USB-Port wird mit Assembler programmiert und kann auf seinen GPIO Pins per “bit banging” USB sprechen. Gestartet von einem Mindaugas Milasauskas, dessen Homepage leider verwaist ist, wurde das Projekt unter anderem von Michael Wolf weiterentwickelt zu einer Variante, die 28 Taster und 8 analoge Achsen auslesen kann. Hier noch eine andere Variante basierend auf dem gleichen Mjoy. Und noch eine.
  • Emulation auf dem PC: Alle Werte über eine simple serielle Schnittstelle in den PC hineinfüttern, dann die Werte auf ein virtuelles Eingabegerät umbiegen. Müsste doch möglich sein, oder? Ich finde leider nichts dazu. Vielleicht kommt man im Umfeld von libusb und HID API weiter?
  • Native Schnittstelle von 8U2, 16U2, 32U4: Die Beschränkung auf Maus und Tastatur lässt sich durch eine geänderte Firmware umgehen.
  • Native USB-Schnittstelle des Due: Hier versucht jemand etwas Ähnliches. Der AT91SAM3X8E auf dem Due dürfte eigentlich alle benötigten Features bereit stellen. Das Datenblatt konzentriert sich allerdings eher auf den host mode.
  • Antiquierten Joystickport emulieren und per Adapter auf USB konvertieren: What could possibly go wrong?

Ich für meinen Teil bin erstaunt, dass es keine einfache Lösung für unseren Fall gibt. Schauen wir hier in die falsche Richtung?

Soweit die ersten Ideen, mal schauen ob es einen Teil 2 geben wird.

Advertisements