
ein Gameport-Gamepad am Raspberry Pi nutzen
Kürzlich habe ich mein altes Gravis Gamepad mit Gameport-Anschluss wiederentdeckt. Nur wie bekomme ich das am Raspi zum Laufen? Einen USB-Gameport-Adapter? Nee, da muss man doch was selber machen können…
Wie funktioniert ein Joystick am PC-Gameport?
Der Joystick am Gameport bekommt eine Versorgungsspannung von 5V und einen Masse-Pin. Meist laufen die Joysticks/Gamepads auch über eine geringere Versorgungsspannung von 3,3V.
Der Gameport stellt insgesamt 4 digitale Eingänge=Feuertasten bereits. Diese werden bei betätigen der Taste auf Masse gezogen. Das lässt sich schon mal wunderbar an den GPIOs auslesen!
Weiterhin gibt es 4 Analog-Eingänge für den eigentlichen Joystick. Wobei 1 Joystick-Hebel ja nur 2 Achsen=2 Eingänge nutzt, 1 Eingang für die X-Achse, 1 Eingang für die Y-Achse. Über die anderen 2 Analogeingänge könnten weitere Funktionen oder gar ein zweiter Joystick ausgelesen werden.
Mit dem Joystick-Hebel wird ein (100k)-Poti pro Achse bewegt, dessen Eingang an der Versorgungsspannung (+5V) hängt und der Ausgang am Gameport ausgegeben wird.
Wie also die Steuerkreuzausgaben des Joysticks nutzen und interpretieren?
Das Gameport-Gamepad kennt nur „digitale“ Steuerkreuz-Stellungen (entweder ist das Steuerkreuz nach rechts gedrückt oder halt nicht, aber nicht „ein bisschen rechts“. Dementsprechend wird einfach ein fester Widerstandswert vom Gamepad ausgegeben, sobald eine das Steuerkreuz gedrückt ist.
Diesen kann man als Spannung messbar machen, indem man den Achsen-Pin des Gamepads (unser Spannungs-Messpunkt) über einen weiteren (100k)-Widerstand gegen Masse legt. Schon hat man einen Spannungsteiler (3,3V auf das Gamepad-interne „Poti“ auf den externen 100k-Widerstand auf Masse.
Bewegt man die Gamepad-Achse, ändert sich der „Poti“-Widerstand und somit der Spannungsteiler.

| Pin | Beschreibung |
|---|---|
| 1 | Versorgungsspannung +5 Volt |
| 2 | Joystick 1 Taste 1 |
| 3 | Joystick 1 X-Achse |
| 4 | Masse |
| 5 | unbelegt |
| 6 | Joystick 1 Y-Achse |
| 7 | Joystick 1 Taste 2 |
| 8 | Versorgungsspannung +5 Volt |
| 9 | Versorgungsspannung +5 Volt |
| 10 | Joystick 2 Taste 1 |
| 11 | Joystick 2 X-Achse |
| 12 | Masse (MIDI Out) |
| 13 | Joystick 2 Y-Achse |
| 14 | Joystick 2 Taste 2 |
| 15 | +5 Volt (MIDI In) |
Die Ansteuerung mit Komparator
Nun könnte man die Werte der beiden Gameport-Achsen über einen Analog-Digital-Wandler an den GPIOs des Raspi auslesen und über ein bisschen Code als Joystick-Eingabe interpretieren lassen. So ein Analog-Digital-Wandler kostet ein paar Euro und zuhause liegen hatte ich ihn auch nicht.
Es muss doch auch noch einfacher/günstiger gehen!
Im Sortiment hatte ich noch einen LM339 (ca. 35ct), ein 4-fach Komparator.
Ein Komparator vergleicht 2 anliegende Spannungen am Eingang und gibt an seinem Ausgang ein digitales Signal aus, welcher Wert der größere ist.
Jetzt benötigt man noch Vergleichsspannungen und schon können wir die GPIOs über das Steuerkreuz ansteuern!
Beispiel bei 3,3V Versorgungsspannung am Gamepad: Die X-Achse gib in Mittelstellung einen Wert von 2,475V aus. Drückt man der Steuerkreuz nach rechts, wird ein Wert von 3,3V ausgegeben. Um also zu wissen, ob das Gamepad nach rechts gedrückt wurde, benötigen wir eine Vergleichsspannung zwischen 2,475 und 3,3V. Beide Spannungen gehen auf den Komparator-Eingang und der meldet uns am Ausgang, welche Spannung größer ist, sprich, ob das Steuerkreuz nach rechts gedrückt wurde.
Analog der Tastendruck nach links: Hier benötigen wir eine Vergleichsspannung zwischen 0,825 und 2,475V. Und genauso geht es für die Y-Achse. Wir benötigen also 4 Komparatoren, für jede Achse 2 Stück bzw. für jede Richtung eine.
Diese Vergleichsspannungen lassen sich über einen einzigen Spannungsteiler erzeugen: Versorgungsspannung 3,3V über 5 gleich große Widerstände (>10kO) in Reihe gegen Masse. An jedem Widerstand fallen 3,3V/5=0,66V ab. Wir greifen also 1,32V und 2,64V als Referenzspannungen an den Widerständen ab.
Die Y-Achse verhält sich genau analog, so dass wir genau diese Referenz-Spannungen auch verwenden können.
Der Komparator legt seine Ausgänge entweder auf Masse oder auf hochohmig. Eigentlich benötigt man dann noch Pullup-Widerstände, die dafür sorgen, dass der Komparator-Ausgang für diesen Fall (hochohmig) einen eindeutigen Wert (3,3V) annimmt. Die GPIOs haben jedoch software-schaltbare Pullup/Pulldown-Widerstände integriert. Diese müssen nur aktiviert werden und wir sparen uns die externen Pullup-Widerstände.
Insgesamt werden also 8 GPIOs als Eingänge benötigt, für 4 Feuertasten und für jede Richtung des Steuerkreuzes.
Der Hardware-Aufbau
Es werden also benötigt:
1 Buchsenleiste 2x20Pin für die GPIOs
1 D-Sub-Buchse 15pol mit Lötkelchen*
1 Stück Lochrasterplatine
5 100k Widerstände (für den Spannungsteiler als Referenzspannung)
2 kleine 100k Potis als Spannungsteiler der X- und Y-Achse.**
1 LM339 4fach Komparator
*Die gängigen Buchsen für die Print-Montage haben 2 Pin-Reihen um 1,27mm versetzt. D.h. sie passen nicht in das 2,54mm-Maß der Lochrasterplatine
**Hier würden auch 2 weitere einfache 100k-Widerstände gehen. Durch das Poti hat man die Möglichkeit, den Spannungsteiler zu justieren, falls mal ein anderes Gamepad mit abweichenden internen Widerständen eingesetzt wird.
Gesamtkosten: <2Euro !
Zunächst ein Funktionstest auf dem Breadboard:

Anschließend habe ich das Projekt auf Lochrasterplatine aufgebaut. Die Platine ist so breit wie der GPIO-Port und so lang, dass sie bündig mit dem Raspi abschließt. Am gegebüberliegenden Ende des GPIO-Ports habe ich die Sub-D-Buchse angelötet. Dabei kann man das Gebhäuse der Buchse an die naheliegenden Kontaktflächen der Platine anlöten.
Weiterhin habe ich die Kontakte der Lötkelche der Buchse über rechtwinklig gebogenen Draht auf die Platine geführt. Auch das stabiliert nochmal die Gemport-Buchse auf der Platine.
Da die Platine 1-Seitig ist und der GPIO-Port auf der anderen Seite liegt als alle anderen Bauteile, mussten diese auf ihrer Auflageseite verlötet werden. Verdrahtet wurde das ganze dann über isolierte Litzen auf der GPIO-Seite, die dann durch die Kontaktlöcher hindurchgesteckt wurden. Das Lötbild ist etwas ungewöhnlich, aber machbar.
Die Schaltung sieht dann so aus:
Das bringt uns zum Software-Teil des Projekts.
Die Software
Wie schon in den PiBoy-Projekten nutze ich einfach das Script von Adafruit, um digitale GPIO-Eingaben als Tastatur-Eingaben auszuwerten. Das Script von Adafruit setzt auch automatisch die Pullup-Widerstände, so dass man sich diese in der Schaltung sparen kann.
Nach der Installation (siehe hier) lässt sich die Datei /boot/retrogame.cfg anpassen. Hierin werden die GPIO-Ports auf Tastaturtasten gemappt.
Das sieht dann so aus:
LEFT 5 # Joypad left RIGHT 27 # Joypad right UP 22 # Joypad up DOWN 17 # Joypad down A 6 # 'A' button W 13 # 'B' button Q 19 # 'X' button S 26 # 'Y' button
Fazit
Es funktioniert, das Gravis Gamepad hat am Retropie-Raspi ein neues Leben erhalten, und das ganze für unter 2 Euro. Game on!





