GamePort Joystick Adapter

  • Hallo Freunde der gepflegten Masturbation, es wird Zeit eure alten Stängel herauszuholen um mal wieder damit zu spielen! Und ich meine natürlich auch die Damen unter uns, denn heute geht es selbstverständlich um unsere Joysticks!


    Ich habe mir irgendwann vor längerer Zeit einen Gravis Analog Pro Joystick gekauft, weil ich damit ein Paar alte Spiele auf meinen Retro-Kisten zocken wollte. Natürlich ging es gut mit ganz alten Spielen, aber irgendwann habe ich mir bei GOG Wing Commander Prophecy geholt. Ich war ein großer Fan der Reihe damals und wollte es wieder Mal spielen, doch wie so viele hier kennen gilt meine Retro Sucht überwiegend den 486er und älteren Maschinen. Das heißt ich musste mir für Prophecy etwas überlegen. Kein Ding, das Spiel läuft mit OpenGL auf modernen Rechnern einfach super und sieht genau so, wie damals mit 3Dfx aus. Nur da gab es ein Problem, ich hatte keinen USB Joystick, nur so ein USB Gamepad, aber das ist einfach nicht das Richtige für so ein Spiel. Nun da kam ich auf die Idee einen Adapter basierend auf einem Arduino für den bereits erwähnten Gravis Analog Pro zu basteln. Die Erfahrung mit dem PS/2 Adapter hatte ich ja schon. Gesagt - getan und als der erste Prototyp einigermaßen lief, habe ich es creopard erzählt. Er war von der Idee begeistert und hat mir vorgeschlagen das ganze auszubauen und es der Öffentlichkeit zur Verfügung zu stellen. Ich fand das Thema sowieso spannend, hatte aber keine weiteren Joysticks, als den einfachen Analog Pro. Daraufhin hat mir creopard eine ganze Sammlung von Joysticks gespendet unter anderem ein GamePad und ein 3D Pro der glorreichen Microsoft Sidewinder Reihe. Spätestens dann war ich über beide Ohren drin.



    Die Implementierung der generische Analog Joysticks mit 2-4 Buttons und 2-4 Achsen war kein Problem. Da kam mir der Sidewinder 3D Pro sehr gelegen, da der Joystick in Kompatibilitätsmodus einen CH FlightStick und einen ThrustMaster emulieren kann. So wurde die Unterstützung dieser Modelle auch schnell implementiert.



    Als es dann dazu kam die digitalen Sidwinder Protokolle umzusetzen, kam es zu richtigen Herausforderungen. Es gibt im Netz mehrere Ansätze für die Sidewinder auf dem Arduino, aber die alle sind ziemlich so la la. Auf jeden Fall berichten alle von großen Schwierigkeiten mit Performance. Denn Sidewinder Joysticks schicken die Daten mit einem Clock-Puls von 5us. Viel zu schnell für Standard Arduino Funktionen zum lesen von Signalen. Nun ja, ich habe mich dann umgeschaut und letztendlich entsprach mir die Implementierung des Sidewinder Tribers im Linux Kernel am ehesten. Mit dem Code als Vorlage und entsprechendem Patent US5628686A gerüstet habe ich mich auf die Arbeit gestürzt. Um Performance Probleme zu lösen greifen sehr viele auf Assembler und schreckliche C-Macros zurück, was in einem nicht gerade pflegeleichtem Code ausartet. Sowas kann ich nicht verantworten :) Also wieder viel Dokumentation und Arduino Code gelesen und habe einige sehr kurze und einfach zu benutzende Klassen in purem C++ geschrieben als Ersatz für das übliche digitalRead(...) Gerümpel. Das Resultat läuft nun doppelt so schnell und reicht vollkommen um um die Daten vom Sidewinder zu verarbeiten. Der Rest war dann Fleißarbeit, es ging darum das besagte Patent zu verstehen und das Protokoll umzusetzen. Der Code sollte einfach zu verstehen sein und ist relativ gut dokumentiert, daher, falls jemand sich für Details interessiert, schaut es euch auf der Projektseite an. Auch, wenn ich vom Linux Code inspiriert wurde, ist meine Implementierung doch komplett neu.



    Prinzipiell hat mein Adapter je einen Treiber für jede bisher unterstützte Art von Joysticks. Den richtigen Treiber kann man dann per Switch wählen, den Joystick in den Adapter stecken und den Adapter in den USB Port. Der Rechner sollte dann den Joystick automatisch erkennen und für alle Spiele, die neuen, die alten, DosBox, etc. verfügbar machen. Ich möchte mich nicht zu sehr wiederholen, daher schaut bitte auf der Projektseite, welche Features und Joysticks unterstützt werden.


    Projekt Seite:

    https://github.com/necroware/gameport-adapter

  • Tolles Projekt - ich kann mich nur wiederholen!



    Da kommt bestimmt noch ein YT Promo Video dazu oder?


    Vielleicht eine blöde Frage, aber kann man den Joystick im Betrieb wechseln oder sollte man den USB Adapter abstöpseln, den Joystick wechseln und dann wieder den USB Adapter anschließen?

  • Ja, ein Youtube Video kommt auch, sogar 2. Im ersten schneide ich es nur ganz kurz an und im zweiten gehe ich dann auf Details ein. Zur Zeit muss man den Adapter abstöpseln, da die Initialisierung am Anfang ein Mal gemacht wird und, je nach angeschlossenem Joystick meldet sich das USB HID anders mit unterschiedlichen Anzahl von Tasten, Achsen etc. Daher macht es auch wenig Sinn es im laufendem Betrieb zu wechseln. Ein Sidwinder GP ist nicht 3D Pro und muss sich entsprechend beim PC neu anmelden. In Zukunft könnte man eine Reset Taste machen oder sowas, um den Tausch ohne USB Umstecken zu ermöglichen, aber ich denke es ist low Prio, weil die meisten sowieso ein USB vorne am PC haben. Und wenn ein Joystick drin steckt, muss man es nicht jedes Mal heraus ziehen. Der Rechner wird den beim Hochfahren automatisch erkennen.

  • Das Projekt ist total super! Ich muss unbedingt so einen Adapter haben. Hast Du noch zufällig einen Bausatz über? Oder zumindest eine Platine?

    Ja, ich werde später 2-3 Bausätze verkaufen. Einer geht natürlich an creopard Das teuerste an dem ganzen ist der Arduino Pro Micro. Ich habe 3 Stück hier, einen würde ich natürlich gerne behalten und zwei kann ich abgeben. Wenn ihr die Arduinos selbst besorgt, gibt es die Basis für sehr wenig Geld bei mir. Bitte sagt Bescheid, wer was braucht damit ich sortieren kann. Das ist erst Mal kein Angebot, sondern ein Versuch zu schauen, ob ich vielleicht was nachbestellen muss. So in etwa kostet ein Arduino Pro Micro 8-10€ und der Rest so um die 3-4€, aber ich muss noch genau schauen, was mich der ganze Spaß mit Versand gekostet hat.

  • Also ich wäre auch interessiert. Kann auch ohne arduino sein.

    - Intel 486DX4-100, Biostar MB-1425/33/40/50UIV, 32MB RAM (PS/2), SoundBlaster AWE 64, Diamond Stealth64 DRAM 2MB

    - Siemens Scenic 560, Pentium 3 450 650MHz, D1115, 256MB Ram, SoundBlaster AWE 64, Nvidia Quadro 2 Pro, Windows 98SE

    - Fujitsu Siemens Celsius 460, Pentium 4 S423 1,7 GHz, Fujitsu Siemens D1194, 512 MB RDRAM, ASUS V9560XT 128MB, Windows 98SE/Windows 2000

  • Und die unvermeidbare Laienfrage: wird das schöne Stück auch in zusammengebauter Form zu haben sein? :)

    Ich entschuldige mich mal pauschal hier für "dumme" Fragen... ich bin kein "Löter" und deswegen hier mehr ein N00b. :)

    Gruß, cp2



  • Und die unvermeidbare Laienfrage: wird das schöne Stück auch in zusammengebauter Form zu haben sein? :)

    Ja, wie gesagt, zur Zeit habe ich nur das, was ich habe und das ist nicht viel. Wenn es größeres Interesse gibt, dann bestelle ich gerne Teile nach und kann auch komplette Adapter anbieten. Für diejenigen, die selbst nicht löten (können), baue ich gerne alles zusammen. Es ist aber von Vorteil für Euch zu wissen, wie man das Teil mit Updates versorgt, denn sollten ich oder jemand anders weitere Treiber zu dem Teil hinzufügen, wäre es gut, wenn Ihr die Updates installieren könntet. An sich ist es nicht schwierig, einfach eine Arduino IDE installieren, das Projekt aus dem Internet ziehen, Adapter an USB anschließen und aus der IDE die Software drauf spielen. Alles kein Hexenwerk, aber man sollte sowas nicht scheuen, sonst sitzt man "nur" mit dem was gerade da ist....

  • Okay. Klar soweit, Danke! :thumbup:

    Ich warte dann mal geduldig ab, wie viele Leute sich beteiligen und wenn es noch eine Weile dauert, ist das für mich total in Ordnung. Ich denke, bis dahin ist der Gute perfektioniert. ;)


    Meine Retronics USB-Joystick-Adapter habe ich schon erfolgreich geupdated, da mache ich mich vor einer Arduino IDE auch nicht bange. :)

    Ich entschuldige mich mal pauschal hier für "dumme" Fragen... ich bin kein "Löter" und deswegen hier mehr ein N00b. :)

    Gruß, cp2



  • Tolles Projekt, Hut ab vor der Arbeit!


    Ich hab glaube ich nicht ganz verstanden ob du nur den Linux Treiber als Inspiration verwendet hast und es aber auf Windows PCs läuft, oder tatsächlich Linux als BS vorausgesetzt wird.


    Falls Windows, läuft der Adapter auch unter XP?

  • Der Adapter läuft überall, was USB HID Geräte unterstützt. Die Implementierung auf dem Arduino ist inspiriert vom Linux Treiber, aber der Adapter meldet sich beim Host als USB HID Joystick Device. Das heißt den Host interessiert es recht wenig, wie das Gerät intern implementiert ist. Sollte daher auch unter WinXP laufen. Ich probiere es später noch mal, ob ich da irgendwelche Probleme habe.... Eine XP Maschine müsste ich irgendwo haben.

  • Geiles Ding. Ich tüftel ja noch am umgekehrten Weg :)


    Aber der Weg ist eigentlich noch stylisher. Ich meine, sowas hätte es auch mal zum Kaufen gegeben, ist aber schwer bis nicht mehr zu finden und teuer. Aber die Richtung Analog->USB hat aufgrund genau solcher Joysticks wie deinen einen gewissen Charme, denn gerade die guten alten CH Products (habe selbst einen Flightstick, allerdings den Standard 2-Tasten, und einen Force-FX) sind doch deutlich präziser, robuster und angenehmer, als die meisten heutigen USB-Joysticks. Der Speedlink Phantom Hawk, den ich mal schnell günstig schießen konnte, um den USB-Analog Weg zu testen: Absolut gruselig! Auf der anderen Seite gibt es auch noch Perlen unter den USB-Joysticks und nicht jeder hat das Glück, einen CH zu haben oder noch erwerben zu können, also machen beide Wege total Sinn.


    Würde mich auch für so ein Board einreihen, gerne auch "nackter Hund" zum selbst löten, wenn alles THT ist (zwecks Sammelbestellung für die PCBs)

    Arbeitspferde: Xeon E5-2683v3/32GB/GTX1650 Super/1TB NVMe+8TB HDD und Q6600/8GB/GTX460/1TB SSD+4GB+2GB HDDs

    Retro Maschinen:

    P2-450/256MB/128GB SSD/TNT2-M64+2xVoodoo2/Soundblaster 16+Yamaha DB50XG

    Commodore PC20-II/V20+8087/XTCF lite 256MB/Tandy Sound

    286-16/287-8/4MB/256MB CF/ET3000/Aztech NX-II

    Amiga 500/1MB/Gotek/Vortex AT-once Plus 286 + Amiga 500/1MB

    Pentium 166/FAST Video Machine+DDPR+YUV Board

    Projekt-Rechner: C64, Dual Pentium MMX 233, 486 VLB, 486 PCI, K6, Athlon 64

    Projekte: USB RetroArduInput

  • Sicher, es ist für die gedacht, die schon einen Joystick haben oder aus nostalgischen Gründen einen alten Joystick benutzen wollen. Und es gab tatsächlich schon GamePort nach USB Adapter, aber die haben nur Standard Analog Joysticks unterstützt. Das hier hat viel mehr Potential ;) So weit ich weiß, gibt es keine Adapter auf dem Markt, die mit den alten guten Sidewindern umgehen könnten. Zur Zeit ist es zwar nur GP und 3D Pro, aber immerhin. Und ich hoffe, dass irgendjemand, der andere Joysticks hat auf der Basis weitere Treiber zum Projekt beisteuert und damit noch mehr Joysticks verwendbar macht.

  • Falls Windows, läuft der Adapter auch unter XP?

    Also, gerade noch mal meine Tests abgeschlossen. Gut, dass Du mich darauf noch mal hingewiesen hast, es gab tatsächlich in der USB HID Beschreibung noch einige mit Windows XP inkompatible Stellen. Diese habe ich ausgebessert und der Adapter läuft unter Windows XP nun auch einwandfrei, man muss nur Arduino Micro Treiber installieren. Da ich kein Windows 10 in echt habe, musste ich es in einer VM mit USB Redirection testen. Da scheint alles direkt zu gehen, da sind wohl irgendwelche Treiber schon dabei. Unter Linux läuft es natürlich auch, da es sowieso mein primäres System ist und ich habe dort das ganze entwickelt.


    Der Joystick Adapter meldet sich übrigens mit "Arduino Micro", da der Text im HID des MCU eingebrannt ist und es kostet hohe Lizenzgebühren, wenn man das ändern möchte. Ich dachte, das ist erst Mal ok so :D

  • super arbeit. wie schauts mit force feedback aus?


    ich habe vor vielen jahren einen von hier gekauft:

    http://www.descentbb.net/viewtopic.php?f=8&t=15526

    http://www.descentbb.net/viewtopic.php?f=8&t=19061

    Leider kann ich kein FFB anbieten. Ich habe nur Treiber für die Joysticks implememtiert, die ich habe. Es ist schwierig etwas für eine Hardware zu machen, die man nicht hat.


    Das sind interessante Links. Also hat schon jemand sowas ähnliches gemacht....

  • Das erste Video, wo der Adapter kurz zu sehen ist, ist raus. Dieses Video ist eigentlich über ein Gravis Joystick, das Adapter-Thema habe ich am ende kurz angeschnitten und man kann dort ein wenig sehen, wie es funktioniert.


    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

  • Jetzt bitte noch anders rum, USB Joystick an Gameport :D

    Wie war das mit ausgebuchtem Traumschiff? ;) Ja, die andere Richtung ist etwas umständlicher und unter Umständen auch teurer. Entweder man baut das ganze auf einem RPi Zero mit Linux, das wäre das einfachste, weil man dann Unterstützung für alle möglichen Treiber schon mit dem Kernel hätte, oder wieder ein MCU, aber dann braucht man auch einen USB Host und die Teile sind etwas teurer und man hätte sehr viel Programmieren müssen. Für so einen RPi Zero habe ich sowieso viele Projekte im Hinterkopf, vielleicht komme ich irgendwann dazu. Leider hat der Tag nur 24 Stunden und die Tage sind auch endlich....


    Ja, und die andere Richtung macht auch etwas weniger Sinn, weil man Joysticks, die viel können dann auf wenige Funktionen kastrieren müsste. So ein DOS kompatibler Joystick kann nun mal nur bis zu 4 Tasten und 4 Achsen. Jeder billige Joystick kann heute drei Mal so viel.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!