DIY Turn Audi R8 – Upgrade auf Drehschalter

U

User 20913

Hi Leute!



Ich möchte euch an meinem derzeitigen Projekt teilhaben lassen. Derzeit bin ich dabei mein Turnracing Audi R8 Lenkrad von Encodern auf Drehschalter umzurüsten.
Rein spieltechnisch nicht wirklich notwendig (bzw nur mit minimaler Auswirkung), aber rein vom Schaltgefühl zwischen Encoder und Drehschalter ist es einfach ein Wahnsinns Unterschied und wird das Lenkrad für mich nochmal auf ein anderes Level bringen.
Für Verbesserungsvorschläge bin ich jederzeit Dankbar :)


Vorweg vielleicht ein paar Erklärungen:
Ein Encoder registriert ob der Schalter nach links oder nach rechts gedreht wurde. Gerne eingesetzt wird z.b. der CTS 288 den es auch bei Leo Bodnar gibt.
Eine Schwachstelle ist auch, dass bei schnellem drehen gerne mal Schaltschritte übersprungen werden.

Der von mir eingesetzte Drehschalter (Grayhill 51er Serie) hat im Gegensatz dazu 12 Ausgänge. D.h. ich weiß zu jeder Zeit genau auf welcher Position der Schalter gerade steht. Ein weiterer Unterschied ist auch das viel bessere Schaltgefühl. Es benötigt mehr Kraft und ist einfach viel definierter (ich kann es gerade nicht besser beschreiben…).
Je nach Modell lässt sich ein Drehschalter auch nicht beliebig weit drehen, was je nach Simulation ein Problem darstellen kann. Da diese aber derzeit eine Lieferzeit bis Januar haben starte ich mit kontinuierlichen Schaltern.



Der Eingesetzte Controller:
Derzeit setze ich in meinem Turn R8 wie vermutlich die meisten anderen auch den BU0836A ein. Der bietet mir für dieses Projekt allerdings nicht genügend Freiheiten. Soweit ich weiß könnte ich hier wirklich nur jeden Ausgang eines Drehschalters als eigenen Button verwenden.
Eingesetzt wird deswegen ein Teensy LC. Bei dem habe ich alle Möglichkeiten die Schalter vernünftig auf den Jeweiligen Einsatz anzupassen.



Und hier mal ein Bild zum aktuellen Stand:


R8 Drehschalter01.jpg

Eine überarbeitete Version ist übrigens schon auf dem Weg zu mir.


Für jeden Button am R8 Lenkrad ist ein eigener digitaler Eingang vorgesehen. Die Position des Drehschalters ermittle ich mittels analogem Eingang – pro Drehschalter wird einer benötigt. Für die Kupplung werden dann nochmal zwei analoge Eingänge benötigt (so spare ich mir das zusätzliche Board von Martin Ascher und kann mittels Software das Verhalten beeinflussen).
Ich bin derzeit am programmieren des Controllers, bzw habe ich die ersten Prototypen geschrieben.



Die Funktionsweise des Drehschalters werde ich zunächst wie folgt festlegen:
Eine Position nach links löst Button1 aus, eine Position nach rechts Button2. Jeder Button wird 50ms gedrückt (um sicherzustellen, dass es vom Spiel registriert wird), danach 50ms losgelassen. Intern merkt sich der Controller wie viele Positionen der Schalter verstellt wurde und regelt dann im 100ms Rhythmus nach. Stelle ich den Schalter jetzt innerhalb von 10ms von Position 1 auf 12, wird nach 1100ms der Button1 11 mal gedrückt worden sein. (Es ist ein absolut tolles Gefühl in iRacing im LMP1 den Schalter synchron mitgehen zu sehen) Somit ist der Drehschalter immer synchron zum Spiel.
Damit die Position stimmt werde ich einmal vor dem losfahren eine Synchronisations funktion einbauen. Das wird in iRacing und ACC sicher ganz wunderbar funktionieren:D


Wenn jemand Fragen oder Anregungen hat bitte immer her damit!

Lg,
Daniel
 
U

User 12312

Bei der Steilvorlage für Fragen: Wie wird die Synchronisationsfunktion funktionieren? :)
speziell interessiert mich da ACC. Du musst ja vom Spiel wissen wo beispielsweise die TC beim Losfahren steht und dann von da aus entsprechend oft den Button virtuell betätigen lassen, damit er mit der Hardware-Position am Wheel/Buttonbox übereinstimmt...

Hast du da schon Pläne?

Grüße
Benny
 
U

User 20913

Hi Benny,

ja einen Plan habe ich schon, getestet aber noch nicht.
Bei ACC und iRacing werde ich über eine Tastenkombination die Synchronisation starten. Das wird eine ungewöhnliche Kombination über eine ungewöhnlich lange Zeit sein - z.b. rechter Blinker und linker Blinker drei Sekunden gedrückt halten.
Im nächsten Schritt wird einfach der Button für TC 12 mal in eine Richtung softwareseitig betätigt. Damit kann ich mir sicher sein wo er steht (in ACC und iRacing entweder auf Aus oder 1). Dann kann ich den Button in die andere Richtung genau so oft drücken, dass er auf der Position des Schalters steht.

Alternativ kann ich mir auch einfach 12 Buttons für ACC programmieren. Bei TC und ABS gibts ja die Möglichkeit.

Beim anstecken des Lenkrades plane ich mit einem Tastendruck die Funktionen für das jeweilige Spiel zu aktivieren. Also für AC drück ich den rechten Ganghebel und aktiviere so eine einfache Encoder Funktion der Drehschalter, für iRacing den linken Ganghebel für die erweiterten Schalteroptionen.

Soweit meine Pläne:D, mal sehen ob alles klappt *g*

lg,
Daniel
 
U

User 12312

Spannend :)

sowas hatte ich Mietsicherung überlegt, allerdings schaltet ACC meine ich bei TC und ABS fließend weiter in Endlosschleife. Heißt 1 - 2 - ... - 11 - 12 - 1 - 2....
Also in AC ist das sicher so. Man müsste meiner Meinung nach irgendwie „auslesen“ was die aktuelle TC-Stufe in ACC ist und per Software dann entsprechend oft den Button virtuell zu betätigen, sonst weiß man nie wo die Sim-TC grade steht.

wie gesagt, ich bin auf deine Lösung gespannt :sabber:
 
U

User 20913

Ja du hast recht, ACC schaltet in Endlosschleife. Durfte ich gestern beim testen dann auch feststellen.
Somit wird Plan B für ACC zum Einsatz kommen: Jede Stufe im ABS un TC bekommt eine eigene Taste zugewiesen. Da der R8 nur 8 Stufen bei TC hat geht sich das recht komfortabel aus (34 von 36 der im Standard vom Teensy verfügbaren Tasten werden dann verwendet, für mehr müsste ich ein wenig tiefer in die Materie eintauchen, geht aber auch)

Ansonsten ist die Hardware fertig und funktioniert wie vorgesehen. Die Programmierung ist ein wenig herausfordernder als gedacht - so können z.b. die ausgelesenen Werte des analogen Eingangs für die Drehschalter beim umschalten kurz schwanken - es findet sich aber für alles eine Lösung :D

In iRacing funktioniert es bereits wie vorgesehen. Synchro geht noch nicht, aber wenn der Schalter einmal um 360° gedreht wurde läuft es wie gewünscht.


Mal sehen, es steckt noch viel potential in der Hardware :)
 
U

User 20913

So mal wieder nach langer Zeit ein Update von mir.
Audi R8 LMS Platine angepasst.jpg

So sieht nun das Endergebnis aus. Wie zu sehen ist bin auch auf nen Teensy 3.2 umgestiegen - mit diesem lässt sich auch der Name des USB Devices anpassen :) Auf der Rückseite befinden sich noch die Anschlüsse für Shifter, Kupplungen und Poti.

Die Drehschalter hier sind kontinuierlich zu drehen. Ich warte noch auf jene mit fixem Stop, die sollten nach 2 Monaten Wartezeit jetzt bald ankommen.

Ich spiel damit derzeit nur ACC und bin mit dem Ergebnis sehr zufrieden. Es funktioniert alles wie es soll und ich habe keinerlei Probleme.


Was jetzt noch fehlt ist die Möglichkeit die Eingabemethode umzuschalten und die Synchronisierungsfunktion.

lg,
Daniel
 
U

User 23124

Hallo Daniel, möchte in meiner Buttonbox auch gerne Drehschalter als Encoder einsetzten.

Könntest du mir vllt mit der Programmierung helfen?

Ich kann leider keinen Code schreiben... versuche es gerade mit dem Tool ardublock ( grafisches programmieren für arduino etc). Aber so richtig will das nicht funktionieren...

Für die Synchronisation würde ich einfach sagen: eine beliebige Taste gedrückt halten, Encoder auf Position bringen, Taste loslassen, fertig.

Grüße Toni
 
Zuletzt bearbeitet:
U

User 20913

Wenn ich helfen kann, helfe ich natürlich gerne. Eventuell wird es aber notwendig sein, dass du dich ein wenig intensiver mit dem Thema Programmierung befasst ;)
Welche Hardware verwendest du denn? Hast du eventuell ein Spannungsmessgerät zur Verfügung?

Die Idee für die Synchronisation klingt wirklich gut. Zwar Umständlich bei vielen Drehschaltern (mein F1 Lenkrad hat 9 Stück^^), aber für AC ist es perfekt. Vielen Dank!
 
U

User 23124

Lötkolben, Messgerät, etc ist alles da.

Habe zum Testen einen arduino Mega und 2 LEDs für „Button links/Button rechts. Meinen „standard“ Drehschalter (ohne anschlag) habe ich mit Widerständen bestückt und an einem analogen Eingang angeschlossen.

Später wollte ich einen Leonardo oder Due verwenden, es sei denn, du hast noch einen Tipp für mich?

Verständnis für den Ablauf bzw. die Programmierung habe ich, nur das SCHREIBEN ist (noch) das Problem.

Die 12 Positionen kann ich schon auswerten.
Aber wie weiß ich sicher ob ich links oder rechts gedreht habe? Als erstes dachte ich, man vergleicht Stellung alt/neu und prüft auf größer/kleiner, nur wenn ich jetzt über Stellung 12 wieder zur 1 drehe kann ich das ja vergessen...
Wenn ich sicher links/rechts auswerten kann, wollte ich diese beiden Werte nehmen und damit zählen wie oft der Schalter links/rechts bewegt wurde.
 
Zuletzt bearbeitet:
U

User 20913

Ich verwende immer Teensys. Ich mein das ist quasi ein Arduino auf Steroiden, eventuell overkill aber mit vielen netten funktionen. Ein Vergleich ist schwer, da ich mich mit dem Arduino nicht so intensiv beschäftigt habe.

Die 12 Positionen kann ich schon auswerten.

Ok, das ist mal die Grundvoraussetzung. Also du misst den Widerstand und bekommst auf Grund dessen die Position, korrekt? Welche Widerstände hast du denn gewählt?

Ein wichtiger Aspekt kommt hier jetzt dann noch hinzu: ein Drehschalter ist üblicherweise als "Shortening" oder "non shortening" spezifiziert. D.h. wenn sich der Schalter zwischen zwei Kontakten befindet wird er entweder kurzgeschlossen oder eben nicht. Für diesen Moment liest der Mikrocontroller einen falschen Wert aus. Diese falschen Werte müssen noch abgefangen werden damit es nicht zu falschen Schaltvorgängen kommt.

Aber wie weiß ich sicher ob ich links oder rechts gedreht habe? Als erstes dachte ich, man vergleicht Stellung alt/neu und prüft auf größer/kleiner, nur wenn ich jetzt über Stellung 12 wieder zur 1 drehe kann ich das ja vergessen...

Der Ansatz ist schon richtig. Bei den Übergängen gibst einfach eine Zusätzliche Bedingung mit:
Wenn die Vorherige Position 11 oder 12 ist und die neue 1 oder 2 dann hast nach rechts gedreht und umgekehrt nach links.

Bis hierher gehts übrigens noch recht einfach. Die größere Hürde ist dann das betätigen der Buttons. Der muss ja für eine bestimmte Zeit gedrückt werden, gefolgt von einer bestimmten Zeit in der er nicht gedrückt wird damit das Programm das richtig erkennt. Delays sind hier natürlich strengstens verboten:D (aber keine Sorge, hier kann ich dir den Code dann einfach geben. Eine Warnung vorweg - er ist schon sehr undurchsichtig:rolleyes:)

lg,
Daniel
 
U

User 23124

Falls ich mal ein Lenkrad bauen sollte, werde ich mit Sicherheit auch einen Teensy nehmen. Für meine ButtonBox genügt (hoffentlich) erstmal ein Arduino der dieses USB Interface Zeug unterstützt.

Habe alles 1K Widerstände genommen. 11x zwischen den Pins und 1x nach GND. Die Werte habe ich, für jede Pos. mit Toleranz eingegrenzt. Jeden Pos.Wechsel habe ich einzeln im Programm mit UND/ODER verknüpft. Meine LEDs sagen mir, dass ich auf dem richtigen Weg bin... aber 100% läuft das halt noch nicht.

Die Speicherung der Klicks und das Timing sind mir noch nicht ganz klar. Werde da noch ein bisschen fummeln müssen.

Über einen "fertigen Code" würde ich mich natürlich auch sehr freuen!
 
U

User 20913

Hier ist der Code. Ist sicher kein guter code, aber er funktioniert *g*. Man könnte sicher einiges an Optimierung rausholen.

Entscheidend wird die Funktion "getRotaryStat". Hier musst du die Werte für deine Rotaries reinbringen. Übergeben wird hier der auszulesende Pin und Rückgabewert ist die Position an der der Drehschalter gerade steht. -100 ist der Wert wenn der Drehschalter kurzgeschaltet wird bei der Bewegung zwischen zwei Werten. In meinem Fall ist es ein wenig holprig, da der Grayhill zwei mögliche Werte für diesen Fall hat.

In der Funktion "getRotaryPosition" sind ein paar Relikte drin die du nicht brauchen wirst, dennoch sollte es funktionieren.

Die Variable "delaytime" bestimmt wie lange ein Button aktiviert wird und anschließend mindestens deaktiviert bleibt.

lg,
Daniel
 

Anhänge

  • Rotary Switch.rar
    1,7 KB · Aufrufe: 9
U

User 23124

Erstmal vielen Dank...

Werde wohl noch ein paar Tage brauchen um da durchzusteigen!

Hätte da noch ne kurze Frage: wenn ich 3 Drehschalter verwende, brauche ich die ganze Geschichte auch dreimal, richtig?

Die variablen etc müssen für jeden Drehschalter auch entsprechende Namen haben, richtig?


Gesendet von iPhone mit Tapatalk
 
U

User 20913

Hätte da noch ne kurze Frage: wenn ich 3 Drehschalter verwende, brauche ich die ganze Geschichte auch dreimal, richtig?

Die variablen etc müssen für jeden Drehschalter auch entsprechende Namen haben, richtig?

Selbstverständlich nicht:D. Da wäre ich wahnsinnig geworden bei 9 Drehschaltern in meinem F1 Lenkrad.

02_code.JPG

Diese Variablen musst du verändern. Der Code hier ist für 6 Drehschalter. Du änderst einfach die 6 in den Eckingen Klammern zu ner 3 - darfst dann in den geschwungenen Klammern aber nur 3 Werte haben. (sorry, ich geh jetzt davon aus, dass du es nicht weißt, bitte nicht gekränkt sein wenn es anders ist. Thema ist hier Arrays)
03_code.JPG

Zur Verdeutlichung: Die roten Werte sind Für Rotary 1, die blauen für Rotary 2 und die grünen für Rotary 3.

Was mir noch einfällt. Du muss wahrscheinlich noch die Joystick library vom Arduino importieren im Code. Das war beim Teensy nicht notwendig.

lg,
Daniel
 
U

User 23124

War mir nicht bewusst, dass da Arrays im Code sind. Macht natürlich Sinn mit deiner Erklärung.

Danke.

Muss noch VIEL lernen...
 
Oben