Analog Joystick

  • Da ich jetzt schon zwei Computer habe, die analoge Joysticks benutzen, wird wohl kein Weg daran vorbei führen.


    Aus der Anfangs-PC Zeit kenne ich analoge Joysticks.

    Ich hab die nie gemocht, weil sie einfach nie gut funktioniert haben.


    Seit USB sind analoge Stick ja Standard bei jedem Gamepad, und die funktionieren auch richtig gut inzwischen.


    ====


    So, nun stellt sich die Frage, wie ich mein Analogstick Problem lösen kann.


    Ich habe bereits so einen Adapter, wo man die gängigen digitalen Joysticks anschliessen kann an Dragon und Tandy.

    Ist aber für manche Spiel einfach zuwenig



    Am liebsten wäre mir ein Adapter, wo ich ein USB Gamepad anschließe und der emuliert mir das analog Signal.



    Nach meinen Recherchen im Netz hat sowas noch keiner gebaut.

    Ist das so schwierig, ein analoges Signal für den Dragon zu erzeugen?


    Das Gamepad an einem Atmega 32u4 sollte ja kein großes Problem sein.

    Es gibt ja Lösungen für digitale Joysticks.



    Was meint ihr dazu?

  • Okay, die Lösung kristallisiert sich langsam heraus.


    Mit einem Arduino Uno (3€) und einem USB Host Shield (5€) kann man alle gängigen USB Joysticks und Gamepads abfragen.


    ===


    Bleibt nur noch die Frage, wie gebe ich zwei Analogwerte aus, dass ein alter PC Gameport oder ein Dragon 32 das versteht?


    Könnte man ein Widerstands Array verwenden?

    So wie die VGA Ausgabe bei einem FPGA?

  • Arduino Lib und Sketch für USB Gamepad:


    Für Boards mit USB Atmegas

    https://github.com/MHeironimus/ArduinoJoystickLibrary


    Für normale Boards mit USB Host Shield

    https://arduino.stackexchange.…host-shield-with-joystick

  • Nach meinen Recherchen im Netz hat sowas noch keiner gebaut.

    Doch... schau mal hier:


    https://gitlab.com/edge-records/joyweiler


    Nachtrag: Sorry ist wohl doch digital... und nicht analog.

    Gruß Torsten

    BFZ MFA, ZX80Core, AX81, ZX81, ZX81NU, Spectrum+, Harlequin, MSX VG8010, Amstrad NC100, Cambridge Z88, C64, C128D, Amiga 500 & 1200, Atari Portfolio, HP200LX, IBM PC5155, TP755c, TP755cx, T20, T41, T61, PS/2 (Model 40SX), PS/2E, Accura 101, Apple //e, Sharp PC1401 & PC1403H, TI59 m. PC-100c, HP48SX & HP48GX


    An die Person, die meine Schuhe versteckt hat, während ich auf der Hüpfburg war: Werd' erwachsen! :motz:


    ::matrix::

  • https://gitlab.com/edge-records/joyweiler


    Nachtrag: Sorry ist wohl doch digital... und nicht analog.


    Für digital gibt es bereits die perfekte Lösung:


    Beliebiger USB Joystick oder Gamepad an einen C64 (oder Atari, oder ...):


    https://www.ebay.de/itm/2x-Gre…pad-Joystick/231881899307


    Zwei Stück 58€.

    Läuft perfekt.

    Auch als Mausersatz.



    Genau sowas bräuchte ich für analog JS Ersatz

  • Hier etwas das passen sollte


    https://www.elektormagazine.de…joystick-to-usb-interface


    Ich habe leider keinen Elektor Zugriff, daher nur der Link

    Gruß Torsten

    BFZ MFA, ZX80Core, AX81, ZX81, ZX81NU, Spectrum+, Harlequin, MSX VG8010, Amstrad NC100, Cambridge Z88, C64, C128D, Amiga 500 & 1200, Atari Portfolio, HP200LX, IBM PC5155, TP755c, TP755cx, T20, T41, T61, PS/2 (Model 40SX), PS/2E, Accura 101, Apple //e, Sharp PC1401 & PC1403H, TI59 m. PC-100c, HP48SX & HP48GX


    An die Person, die meine Schuhe versteckt hat, während ich auf der Hüpfburg war: Werd' erwachsen! :motz:


    ::matrix::

  • Hier etwas das passen sollte


    https://www.elektormagazine.de…joystick-to-usb-interface


    Ich habe leider keinen Elektor Zugriff, daher nur der Link


    Danke für den Link!



    Nee, das ist eigentlich nicht was ich machen möchte.


    Der Link verweist auf ein Projekt, mit dem man alte analog Joysticks an moderne USB Computer anschließt.


    Ich bräuchte das genau verkehrt rum ...


    Ich möchte gerne neue USB Gamepads an alte analoge Joystickports anschließen.

  • Ah... okay. Das habe ich anders verstanden. Jetzt dämmert's.


    Na mal sehen ob ich dazu was finde.

    Gruß Torsten

    BFZ MFA, ZX80Core, AX81, ZX81, ZX81NU, Spectrum+, Harlequin, MSX VG8010, Amstrad NC100, Cambridge Z88, C64, C128D, Amiga 500 & 1200, Atari Portfolio, HP200LX, IBM PC5155, TP755c, TP755cx, T20, T41, T61, PS/2 (Model 40SX), PS/2E, Accura 101, Apple //e, Sharp PC1401 & PC1403H, TI59 m. PC-100c, HP48SX & HP48GX


    An die Person, die meine Schuhe versteckt hat, während ich auf der Hüpfburg war: Werd' erwachsen! :motz:


    ::matrix::

  • Okay, die Lösung scheint sich abzuzeichnen! :)


    Ein freundlicher Mensch vom mikrocontroller.net Forum hat mich darauf hingewiesen, dass es digitale Potentiometer gibt!

    Wenn das genau so reagiert wie ein richtiges Potentiometer, dann ist die Sache schon erledigt.


    Bin gespannt ...

  • Das Projekt ist jetzt weiter gediehen:

    • ich habe mehrere Varianten digitaler Potentiometer von Reichelt geliefert bekommen
    • die DIN Stecker für die Joystick Ports sind jetzt auch da
    • die digitalen Potentiometer mit 100K Ohm funktionieren prächtig im Dragon und im Tandy CoCo
    • der Arduino Sketch um die USB Joysticks und USB Gamepads auszulesen funktioniert
    • der Arduino Sketch um die Potentiometer zu stellen funktioniert tadellos

    Also es funktioniert soweit.



    Es fehlt noch die Abwicklung des Projekt:

    • Aufbau vom Steck Board auf einem Lochraster Shield
    • Software Teile zu einem Ganzen zusammenfügen
    • ein passendes Gehäuse finden
    • dokumentieren und auf GitHub hochladen

    Mal sehen wann ich mich dazu motivieren kann ...

    • Offizieller Beitrag

    Erzähl doch mal, was ein digitales Potentiometer ist.

    Ein Digital Analog Wandler mit Ausgängen konform zu einem Potentiometer.

    Im einfachsten Fall kannst du über eine SPI Schnittstelle den Wert des emulierten Potis setzen.

    Auflösung häufig 256bit was für sowas hier ausreichen sollte :)

  • Ja ganz genau.

    Ist halt ein IC das ein oder zwei Potentiometer "emuliert".

    https://oe7twj.at/index.php?title=AnalogJOY


    Es gibt verschiedene Typen:

    • 6 Bit, 8 Bit, 10 Bit
    • SPI Steuerung
    • I2C Steuerung
    • Inkrementelle Steuerung


    Die joystick Ports von Tandy und Dragon lösen 6 Bit auf.


    Beim PC Gameport weiß ich es nicht genau.

    Aber mit 8 Bit dürfte man ganz gut liegen.

  • Wenn ich es heraus lese, benötigst du einen DA-Wandler, um im Grunde programmierte Spannungszustände in den AD-Wandler zu geben. Also 0VS für eine Richtung, 1/2VS für nicht betätigt und 1/1VS für die andere Richtung.


    Meines Wissens gibt es auch PIO zu USB Chips. Leider werden diese wohl in Spiele-Software kaum abgefragt. Dafür tauchen diese in manch anderen Projekten auf.

  • Wenn ich es heraus lese, benötigst du einen DA-Wandler, um im Grunde programmierte Spannungszustände in den AD-Wandler zu geben. Also 0VS für eine Richtung, 1/2VS für nicht betätigt und 1/1VS für die andere Richtung.

    Es muss tatsächlich ein Digitalpotentiometer sein, weil das Interface einen NE556 oder NE558 Timer-IC benutzt, um die Zeit zu messen, die das Laden oder Entladen eines Kondensators durch einen veränderlichen Widerstand braucht.


    Analoge PC-Joysticks verdrahten die Potentiometer auch bloß mit 5V und nicht mit Masse, was zu Verwirrung führen kann, wenn man die einfach an einen A/D-Wandler hängen will. Die Masseleitung ist offenbar nur für die Taster.


    Was dieses Projekt angeht, muss ich sagen, dass ich wahrscheinlich irgendein billiges Analog-Gamepad genommen und umgebaut hätte.

    Eigentlich muss man ja nur an dem USB-Device-Controller vorbei verdrahten, bzw. den abtrennen.

  • Wenn dem so ist, wir testen eigentlich auch nur mit Spannungszuständen und schauen, ob am Omron-AD81 der Wert passt. Dann müsste es genügen, sich die Widerstandswerte bei bestimmten Stellungen zu notieren. Problem wäre die Mittelstellung oder ein Digi-Joystick mit Wechsler im Mikrotaster.


    Aber das müsste man sich erst mal aufmalen, um zu schauen ob das so geht.

  • Ich hab das gelöst mit zwei digitalen Potentiometer je 100K.


    Siehe: https://oe7twj.at/index.php?title=AnalogJOY



    Getestet ist es mit drei Arten von dig. Potentiometer:

    • X9C104
    • DS1804-100
    • DS1803-100


    Es funktionieren alle gleich gut, man kann nehmen was man gerade gut bekommen kann.


    Der DS1803 hat den Vorteil, dass schon zwei Potentiometer in einem Käfer drin sind.





    üöä#asö

  • Ich kann nicht sagen ob es auch am PC mit analogen Joystick (15 poliger Gameport) funktioniert, weil ich keinen PC mit Gameport besitze.

    Aber es funktioniert definitiv mit Dragon-32, Dragon-64 und allen Arten von Tandy Color Computer.



    Neulich habe ich einen PC Joystick umgebaut für den Betrieb am Tandy CoCo.

    Der 15 polige Stecker abgeschnippelt und den DIN-6 Stecker angelötet.


    -- nichts geht --


    Hab mich gewundert, nochmals durchgemessen, es war alles richtig verdrahtet.



    Die Lösung


    Im Joystick sind nur zwei Anschlüsse des Potentiometer angeschlossen.

    Die Plus 5V fehlen am Potentiometer.


    Der PC misst offenbar nur den Widerstand.

    Der Tandy und der Dragon messen offenbar die Spannung.


    Nachdem ich die zwei Drähte im Joystick eingebaut habe, hat es sofort funktioniert.

    Sowohl am Tandy als auch am Dragon.


    Kein Ahnung ob diese Veränderung die Funktion am PC Gameport stört oder ob es trotzdem funktionieren würde.

  • Interessant. Ich dachte, die Potentiometer hingen an +5V aber dafür nicht an Masse.

    Da muss ich wohl nochmal nachmessen.

    Oh, vielleicht irre ich mich da auch in diesem Punkt.


    Fakt ist, ich habe zwei Drähte zusätzlich benötigt für den Betrieb am Tandy CoCo.

  • Das ist zwar ein älterer Beitrag , aber ich habe mal einen Arcade Automaten gebaut , dafür hatte ich z.b. einen Bestimmten Joystick im auge gehabt.

    Dieser Joystick kann durch sensoren die stellung vom joystick feststellen und wandelte es so um daß jedes x-beliebige Spiel auch aus den 80ern noch spielbar war.

    Es handelte sich dabei um diesen Joystick hier.

    https://www.ultimarc.com/arcad…/joysticks/ultrastik-360/


    Man soll den auch irgendwie Programieren können.

    Ich hätte davon noch 2 stück.


    In die andere Richtung kenn ich nur sowas hier

    https://create.arduino.cc/proj…-aptinex-da1c010bi-8123a2


    Falls ich das Thema dabei verfehlt hab tut's mir leid .

    Einmal editiert, zuletzt von WombleMC ()

  • Hi


    schönes Projekt, ich bin gerade an etwas ähnlichem, nur in viel größer dran: Basierend auf einem Arduino Mega soll das Ding jedes USB-Gerät in jedes alte Eingabegerät übersetzen können. Ich bin zuversichtlich, die nächsten Tage mal ein Signal in Richtung Tastatur und serieller Maus zu bekommen.


    Beim Joystick hätte ich jetzt unterstellt, dass die Spannung gemessen wird und die PWM-Ausgänge mit einem RC-Tiefpass zum Glätten ihre Aufgabe gut erfüllen. Oder brauche ich tatsächlich die Digital-Potis weil ein Widerstand auf andere Art und Weise (als Spannungsteiler und dann Spannung messen) gemessen wird?


    Wie hast du das mit den Buttons gelöst? Die werden ja auf Ground gezogen beim Drücken. Ist ein Output auf 0 gleich Ground? Ich hätte jetzt die Ausgabe invertiert (Knopf drücken = 1 triggert die Basis eines NPN-Transistors und lässt +5V vom Joystick Button Pin am Collector gegen Ground am Emitter fließen).

  • Oder brauche ich tatsächlich die Digital-Potis weil ein Widerstand auf andere Art und Weise (als Spannungsteiler und dann Spannung messen) gemessen wird?


    Naja, ich weiß nicht ob man Digital Potis "braucht".


    Jedenfalls sind in allen Joysticks die ich zerlegt habe Potis drin.

    Und umgekehrt, es funktioniert super mit den Digital Poti zumindest am C64, C128, Dragon-64 und Coco-3 ...

    ... mehr wollte ich gar nicht erreichen.


    Es spricht nichts gegen die dig. Potis

    • sie sind erhältlich
    • sie funktionieren tadellos
    • sie kosten nicht viel


    Wie hast du das mit den Buttons gelöst? Die werden ja auf Ground gezogen beim Drücken. Ist ein Output auf 0 gleich Ground? Ich hätte jetzt die Ausgabe invertiert (Knopf drücken = 1 triggert die Basis eines NPN-Transistors und lässt +5V vom Joystick Button Pin am Collector gegen Ground am Emitter fließen).


    Die digitalen Buttons sind easy.

    In den alten Joystick sind das einfach Taster gegen Ground.


    Der ATmega macht das auch so:

    • IO auf Eingang ohne Pullup wenn Taster NICHT gedrückt
    • IO auf Ausgang (low) wenn Taster gedrückt


    Funktioniert tadellos in allen oben genannten Geräten.

  • Super Tip, Danke, spart das Gehampel mit den Transistoren und hilft, das Output Shield etwas kleiner zu machen. Ich werde mal testen, wie das mit einem geglätteten PWM funktioniert. Ansonsten weiß ich ja, wie du es schon funktionierend gemacht hast.


    Zur Info, was ich vorhabe: Das Input Shield und die zugehörige Library beherrscht ja auch USB-Hubs. Und ich habe als Ziel, zu ermöglichen, Tastatur, Maus, Joystick und/oder Composite HID per USB anzuschließen und dann in allen möglichen Formaten rauszuhauen. Und ich nehme alles mit, was einigermaßen leicht zu implementieren ist.


    Tastatur für PC (XT/AT/Tandy 1000 - für letzteren hat Adrian Black ja schon gute Vorarbeit geleistet, den Teil übernehme ich - und evtl. gar Amiga 2000), serielle Maus, PS/2 Maus, analoger Joystick, digitaler Joystick inkl. Commodore 1350 Joystickmaus-Modus, Amiga/Atari Maus (Radimpulse raw übergeben) und evtl. gar ADB (wofür es auch schon was gibt, was ich mit reinbacken könnte, nur testen kann ich es nicht, weil ich keinen Mac habe).


    Erwarte nicht, dass das schnell fertig wird, sehr ambitioniert für das erste Arduino-Projekt, aber hey, vor 15 Jahren, vor meinem ersten Job in Fernsehen und Medien, habe ich mal sowas mit Diplom abgeschlossen, irgendwas davon muss doch noch hängengeblieben sein. Und der Trend sieht gut aus.

  • Jetzt muss ich noch mal interessiert nachfragen... Nachdem ich heute ein Erfolgserlebnis bei der seriellen Maus hatte (vor ein paar Tagen hatte ich schon einen grob in die richtige Richtung laufenden Mauszeiger, der jetzt auch stabil läuft, nachdem ich den überlaufenden UART eingefangen habe), habe ich mal einen separaten Sketch auf Basis des Codes von Felis erstellt, den du auch weiter oben verlinkt hast, um schon mal erste Tests vorzunehmen.


    Leider habe ich keinen analogen Standard USB Joystick. Was ich habe, ist ein Speedlink Competition Pro USB und ein Trio Linker Plus (Gamepad auf USB Converter für Playstation 1/2, Dreamcast und Gamecube Pads, habe PS2 und DC).


    Der Speedlink codiert X und Y auf X1 und X2 auf analoge zentriert/Vollausschläge (0x00, 0x80 und 0xFF) und hat die Tasten 1-4 auf X2 codiert als 1, 2, 4 und 8. So weit so gut. Der Trio Linker hat aber den analogen linken Stick des PS2-Controllers und den analogen Stick des DC-Controllers auf X2 und Y2 sowie die vier Feuerknöpfe auf X1, wieder als 1, 2, 4 und 8 codiert. Dazu noch ein paar andere Tasten und Sticks der jeweiligen Controller auf anderen Funktionen.


    Ich werde mir wohl mal über Ebay Kleinanzeigen ein paar analoge USB-Joysticks zum Testen besorgen, Billig-Ramsch reicht ja, Hauptsache ich hab mal einen Querschnitt. Aber es fängt an, interessant zu werden. In der Zwischenzeit würde ich mich schon mal über ein Feedback von dir freuen, wie dein Joystick die Daten codiert und was das für ein Modell ist, damit ich schon mal weiß, was mich erwartet.

  • Ich werde mir wohl mal über Ebay Kleinanzeigen ein paar analoge USB-Joysticks zum Testen besorgen, Billig-Ramsch reicht ja, Hauptsache ich hab mal einen Querschnitt. Aber es fängt an, interessant zu werden. In der Zwischenzeit würde ich mich schon mal über ein Feedback von dir freuen, wie dein Joystick die Daten codiert und was das für ein Modell ist, damit ich schon mal weiß, was mich erwartet.

    Ich besitze auch keinen analogen USB Joystick.

    Aber moderne Gamepads haben ja meist 2 analoge Sticks, was ja auch nur Joysticks sind und dazu manchmal noch andere analoge Eingaben.


    Bei den X-Box kompatiblen Controller sind sogar die digitalen Richtungs Kreuze schon analog.

    Die geben ein digitales Signal ab schon bei minimalen Druck oder eine Richtung (0 bis 7 :: 0 ist oben glaub ich).

    Aber zusätzlich kommt die Druckstärke 0 bis 64 bei den Richtungs Kreuzen.


    Ich hab das Projekt auf meiner Wiki ein bisschen skizziert:

    AnalogJOY – (oe7twj.at)