Jksimtech Manufaktur-Guide: Sim-Racing-Hardware mit SimHub & Arduino meistern

|Jeremy Kuss
Jksimtech -Guide: Sim-Racing-Hardware mit SimHub & Arduino meistern
Willkommen zurück auf dem Blog! Wenn du dein Sim-Rig mit eigenen Dashboards, LEDs oder speziellen Schaltern aufrüsten willst, führt heute kein Weg mehr an SimHub vorbei. Doch wer schon einmal versucht hat, eigene Hardware von Grund auf zu programmieren, weiß: Zwischen der Theorie und einer flüssigen, verzögerungsfreien Übertragung der Telemetriedaten liegen oft einige Stolpersteine.

In diesem Beitrag tauchen wir tief in die Architektur von SimHub ein und schauen uns an, welche Hardware sich wirklich eignet, wie du absturzsicheren C++ Code schreibst und wie du die Scripting-Engines (NCalc und JavaScript) perfekt für dich nutzt.
1. Die richtige Hardware:
 Warum der Arduino Uno oft die falsche Wahl ist
Viele greifen für ihr erstes DIY-Projekt zum klassischen Arduino Uno oder Nano. Für einfache Projekte mag das klappen, aber für eine tiefe SimHub-Integration (besonders bei LEDs) sind diese Boards nicht geeignet.

Der Grund liegt in der USB-Architektur: Boards wie der Uno oder Nano nutzen feste USB-zu-Seriell-Wandlerchips (z. B. den CH340G), deren USB-Kennungen hardwarebedingt nicht verändert werden können.
SimHub setzt für seinen automatischen Standard Serial Firmware Builder jedoch zwingend Mikrocontroller mit einem ATmega32U4-Chip (wie den Arduino Pro Micro oder Arduino Leonardo) voraus.
Nur diese Boards besitzen einen konfigurierbaren Bootloader, der es SimHub erlaubt, die USB-Deskriptoren (PID/VID und Gerätename) dynamisch anzupassen.

Der Vorteil: SimHub erkennt dein selbstgebautes Gerät beim PC-Start automatisch, ohne dass du ständig manuell den COM-Port zuweisen musst. Mit so einem Board kannst du dann problemlos bis zu vier unabhängige RGB-LED-Streifen oder Matrix-Displays ansteuern.

2. Mehrere baugleiche Arduinos betreiben? Die Goldene Regel!

Wenn du dein Rig erweiterst, hast du bald vielleicht zwei identische Arduino-basierte LED-Anzeigen. Wie unterscheidet Windows diese?

Hier gilt eine strenge Spezifikationsregel: 1 VID/PID-Paar = 1 eindeutiges Produktmodell. Mache nicht den Fehler, zwei baugleichen Geräten unterschiedliche PIDs (Product IDs) zu geben, da dies zu Registry-Konflikten in Windows führt. Stattdessen müssen sich beide Geräte dieselbe PID/VID teilen und werden ausschließlich über eine eindeutige USB-Seriennummer unterschieden. Im SimHub Firmware-Builder kannst du dafür einfach auf "Regenerate serial number" klicken, um jedem Gerät einen eigenen "Fingerabdruck" zu geben.

Hinweis für Entwickler: Wenn du kein Standard-Gerät baust, sondern ein eigenes C++-Skript (Custom Protocol) nutzt, musst du in SimHub zusätzlich die Option "multiple arduinos" aktivieren, damit die Datenpakete zielsicher an den richtigen COM-Port geroutet werden.

3. C++ in SimHub: Das absolute Verbot von delay()
Bauen wir spezielle Schalter (z. B. einen echten Kippschalter, der im Spiel aber nur einen kurzen Button-Druck auslösen soll), müssen wir eigenen Code in die Datei SHCustomProtocol.h schreiben.

Hier machen Anfänger oft den größten Fehler: Sie nutzen den Befehl delay() für Pausen im Code. In den Methoden read() und idle() ist blockierender Code wie delay() strengstens verboten!. Da SimHub hunderte Male pro Sekunde Telemetriedaten schickt, verstopft ein delay() sofort den seriellen Empfangspuffer des Mikrocontrollers, was unweigerlich zu massiven Datenverlusten und Verbindungsabbrüchen führt.

Die Lösung: Nutze stattdessen millis() als eine Art asynchrone Stoppuhr im Hintergrund. Der Controller läuft so ungebremst weiter und überspringt die Befehle einfach, bis die gewünschte Zeitdifferenz (z. B. 100 Millisekunden für den Impuls eines Kippschalters) erreicht ist. Zusammen mit der Joystick-Bibliothek kannst du so einen umgelegten Schalter registrieren und nach exakt 100ms virtuell wieder "loslassen", ohne jemals den Datenstrom des Spiels zu blockieren.

4. Daten bereinigen: NCalc vs. JavaScript

Telemetriedaten kommen oft unsauber vom Spiel an (z. B. Geschwindigkeit als 123.456789). Wenn wir diese roh an den Arduino senden, verschwenden wir serielle Bandbreite und zwingen den kleinen C++-Chip zu schwerfälligen Text-Formatierungen.
SimHub bietet uns zwei Scripting-Engines, um die Daten bereits auf PC-Seite aufzubereiten:
  • NCalc (Die schnelle Wahl): Ideal für reine Mathematik und Formatierungen. NCalc ist extrem leichtgewichtig und übersetzt Ausdrücke direkt in Berechnungsbäume. Für Custom Protocols solltest du Funktionen wie format() (Kommastellen abschneiden), padleft() (konstante Nachrichtenlängen erzwingen) und isnull() (Abstürze durch leere Werte abfangen) nutzen. Eine perfekte, stabile serielle Nachricht sieht dann in NCalc z.B. so aus: format([SpeedLocal],'0') + ';' + isnull([Gear], 'N'). Den Zeilenumbruch (\n) fügt SimHub am Ende automatisch für den Arduino an.
  • JavaScript (Die schwere Artillerie): Wenn NCalc nicht reicht – etwa weil du mit Schleifen (for/while) arbeiten oder Arrays (Listen) aufbauen musst –, wechselst du zur Jint-basierten JavaScript-Engine. Bedenke jedoch, dass JS deutlich mehr CPU-Last erzeugt.
Pro-Tipp für JavaScript: Da normale Variablen bei jedem Durchlauf (Frame) ihren Wert verlieren und globale Browser-Eigenschaften wie window in SimHub nicht existieren, musst du das persistente Objekt root verwenden, um Daten (wie Zähler oder Arrays) dauerhaft über mehrere Berechnungszyklen hinweg zu speichern. Und Vorsicht bei Fehlern: Wenn dein JS-Code einen Laufzeitfehler erzeugt, sperrt SimHub das Skript augenblicklich als Schutzmaßnahme für satte 30 Sekunden!.


Fazit Egal, ob du nur einen einfachen LED-Streifen über den Standard Firmware Builder konfigurierst oder ein hochkomplexes Dashboard mit eigenen Protokollen und JavaScript-Berechnungen baust – wenn du die Architekturrichtlinien von SimHub beachtest, wird deine Hardware genauso performant arbeiten wie teure Kauflösungen.

0 reacties

Reactie plaatsen