Inhaltsverzeichnis:

Arduino-basierter (JETI) PPM-zu-USB-Joystick-Konverter für FSX - Gunook
Arduino-basierter (JETI) PPM-zu-USB-Joystick-Konverter für FSX - Gunook

Video: Arduino-basierter (JETI) PPM-zu-USB-Joystick-Konverter für FSX - Gunook

Video: Arduino-basierter (JETI) PPM-zu-USB-Joystick-Konverter für FSX - Gunook
Video: USB joystick to PPM via RC 2024, Juli
Anonim
Arduino-basierter (JETI) PPM-zu-USB-Joystick-Konverter für FSX
Arduino-basierter (JETI) PPM-zu-USB-Joystick-Konverter für FSX
Arduino-basierter (JETI) PPM-zu-USB-Joystick-Konverter für FSX
Arduino-basierter (JETI) PPM-zu-USB-Joystick-Konverter für FSX

Ich beschloss, meinen JETI DC-16-Sender von Mode 2 auf Mode 1 umzustellen, was im Grunde Gas und Höhenruder von links nach rechts und umgekehrt schaltet. Da ich wegen einiger Links/Rechts-Verwirrung in meinem Gehirn nicht eines meiner Modelle zum Absturz bringen wollte, habe ich mich gefragt, ob es möglich ist, ein wenig im FSX zu üben.

Ich habe gelesen und getestet, dass die JETI-Sender tatsächlich einen Joystick-Modus unterstützen, aber ich wollte volle Flexibilität für die Achsen- und Schalterzuweisungen und den TX wie bei einem echten Modell verwenden. Durch die Verwendung des Empfängerausgangs ist es auch möglich, die Signalverarbeitung in der DC-16 zu nutzen und Mischer, Flugphasen, Dualraten zu verwenden, was auch immer Sie dort programmieren können.

Vor kurzem habe ich ein schönes Tutorial gefunden, wie man aus einem billigen Arduino wie einem Pro Micro ein USB-HID-Eingabegerät, nämlich einen Joystick, macht:

www.instructables.com/id/Create-a-Joystick…

Dies würde alles ermöglichen, was benötigt wird, um ein Flugzeug / einen Hubschrauber / was auch immer in FSX zu steuern! Viele Achsen und Tasten verfügbar.

Da ich gerade einen Ersatz-JETI RSAT2 hatte, beschloss ich, ihn mit dem Arduino zu verkabeln und zu versuchen, einen kleinen PPM-Parser zusammen mit der Joystick-Bibliothek zu implementieren.

Ich gehe davon aus, dass jeder, der diese Schritte befolgt, mit dem Anschließen und Programmieren eines Arduino vertraut ist. Für Funktionsstörungen oder Schäden übernehme ich keine Gewährleistung!

Lieferungen

Du wirst brauchen…

  • jedes Arduino, das von der Joystick-Bibliothek unterstützt wird, habe ich ein Sparkfun Pro Micro 5V / 16 MHz verwendet
  • eine aktuelle Version der Arduino IDE
  • jeder RC-Empfänger, der ein PPM-Signal ausgibt, wie der JETI RSAT2
  • einige Überbrückungsdrähte (mind. 3)
  • die in der Arduino IDE installierte Joystick-Bibliothek
  • die Arduino-Timer-Bibliothek:

Schritt 1: Verdrahten Sie den RX und den Arduino

Verdrahten Sie den RX und den Arduino
Verdrahten Sie den RX und den Arduino
Verdrahten Sie den RX und den Arduino
Verdrahten Sie den RX und den Arduino

Die Verkabelung ist ziemlich einfach. Ich habe mich entschieden, den Arduino nur über USB mit Strom zu versorgen, da er ein Joystick-Gerät emulieren soll. Dadurch wird der Arduino mit 5V versorgt, die auch zur Stromversorgung des RC-Empfängers verwendet werden können.

Ich habe den Pin VCC verwendet, der einen geregelten Ausgang bietet, und den nächsten Gnd-Pin - verbinden Sie ihn einfach mit den + und - Pins des PPM-Anschlusses. Wenn der Arduino mit Strom versorgt wird, wird jetzt auch der Empfänger eingeschaltet.

Für das PPM-Signal habe ich beschlossen, Interrupts zu verwenden, um sie zu analysieren. Interrupts stehen z. B. an Pin 3, also einfach dort anschließen - es gibt keinen "nativen RC-Pin" auf dem arduino, aber möglicherweise mehr und verschiedene Möglichkeiten, das Empfängersignal einzulesen.

Ich musste den RX-Spannungsalarm deaktivieren, da die VCC-Spannung mit USB-Versorgung nur etwa 4,5 V beträgt - aber ziemlich stabil, also überhaupt kein Problem.

Schritt 2: Einige PPM-Signale erhalten

Erhalten einiger PPM-Signale
Erhalten einiger PPM-Signale
Erhalten einiger PPM-Signale
Erhalten einiger PPM-Signale

Wenn der Empfänger UND der TX mit Strom versorgt werden, erhielt ich PPM-Signale wie im Bild gezeigt. 16 Kanäle, ewig wiederholt. Wenn Failsafe am RSAT deaktiviert und der Sender ausgeschaltet ist, wird die PPM-Ausgabe deaktiviert.

Weitere Informationen zu PPM finden Sie hier:

  • https://en.wikipedia.org/wiki/Pulse-position_modul…
  • https://wiki.rc-network.de/index.php/PPM

Da ich in diesem Fall kein echtes Zeug fliege, habe ich mich nicht um die theoretischen Timings gekümmert und nur am Oszilloskop herausgefunden, was mein Empfänger tatsächlich ausgibt, wenn er die Knüppel von ganz links nach ganz rechts bewegt (Standardeinstellungen im TX). Es schien, dass -100% Pulse mit einer Länge von 600µs und +100% 1600µs entsprechen. Auch die Länge der Pausenimpulse (400µs) war mir in meinem Arduino-Code egal, aber ich ging von einem Frameabstand von min. 3000µs.

Schritt 3: Konfigurieren des Senders

Sender konfigurieren
Sender konfigurieren
Sender konfigurieren
Sender konfigurieren
Sender konfigurieren
Sender konfigurieren

Da nur die aktuelle Position der Ruder bekannt sein muss, reicht ein Kanal / „Servo“pro RC-Funktion. Folglich kann ein recht einfacher Senderaufbau vorgenommen werden - ähnlich einem normalen RC-Modell. Die Hauptfunktionen Querruder, Höhenruder, Seitenruder und Gas benötigen jeweils nur einen Servo- bzw. Senderkanal. Ich habe auch Klappen, Bremsen und Getriebe hinzugefügt, sodass bisher 9 Kanäle frei sind. Bitte beachten Sie, dass Flaps auf eine Flugphase gelegt wurden und nicht direkt über einen Stick, Slider oder Button gesteuert werden.

Schritt 4: Ausführen des Joysticks

Ausführen des Joysticks
Ausführen des Joysticks
Ausführen des Joysticks
Ausführen des Joysticks

Die Joystick-Bibliothek ist recht einfach zu bedienen und bietet einige Beispiele und Tests. Es sollte hilfreich sein, zuerst zu überprüfen, ob der Arduino als richtiger Joystick erkannt wird, die im Eingabebereich verlinkten Anweisungen und die Bibliothek selbst bieten eine gute Anleitung.

In der Geräte- und Drucker-Systemsteuerung wurde der Arduino als "Sparkfun Pro Micro" angezeigt und das Joystick-Testfenster zeigte 7 Achsen und viele unterstützte Tasten. Sogar ein Hutschalter kann verwendet werden, wenn er im Arduino programmiert ist.

Schritt 5: Codieren des Arduino

Codierung des Arduino
Codierung des Arduino
Codierung des Arduino
Codierung des Arduino

Was noch fehlt, ist das eigentliche Parsen des PPM-Signals und die Zuordnung zu Joystick-Achsen und -Tasten. Ich habe mich für folgendes Mapping entschieden:

Kanal / Funktion / Joystick-Belegung:

  1. Drossel -> Drosselachse
  2. Querruder -> X-Achse
  3. Aufzug -> Y-Achse
  4. Ruder -> X-Rotationsachse
  5. Klappen -> Y-Rotationsachse
  6. Bremse -> Z-Achse
  7. Zahnrad -> Taste 0

Wenn der Gang heruntergefahren ist, muss die erste Taste des Joysticks gedrückt werden und wird beim Herauflegen des Gangs losgelassen. Dies erfordert jedoch FSUIPC für FSX. Out of the Box akzeptiert FSX nur eine Schaltfläche zum Umschalten des Gangs, was bei meinen Modellen nicht genau der Fall ist.

Ich habe meine aktuelle Version des Codes mit vielen Kommentaren versehen, was für mich ganz gut funktioniert - ändern Sie Ihre Zuordnung oder fügen Sie neue Funktionen hinzu. Die letzten 9 RC-Kanäle werden derzeit nicht verwendet.

Für das Setup muss die Joystick-Klasse initialisiert werden, im Wesentlichen durch die Definition der numerischen Achsenbereiche:

/* Achsenbereich setzen (im Header definiert, 0 - 1000) */

Joystick.setXAxisRange(CHANNEL_MIN, CHANNEL_MAX); Joystick.setYAxisRange(CHANNEL_MIN, CHANNEL_MAX); …

Durch die Verwendung von Werten von 0 bis 1000 ist es möglich, die Pulslänge (600 - 1600µs) ohne Neuskalierung direkt auf die Joystickwerte abzubilden.

Der DIN 3 wird als digitaler Eingang initialisiert, Pullups aktiviert und ein Interrupt angehängt:

pinMode (PPM_PIN, INPUT_PULLUP);

AttachInterrupt(digitalPinToInterrupt(PPM_PIN), PPM_Pin_Changed, CHANGE);

Zu Debugging-Zwecken habe ich mit der Arduino-Timer-Bibliothek in regelmäßigen Abständen einige Ausdrucke über die serielle Schnittstelle hinzugefügt:

if(SERIAL_PRINT_INTERVAL > 0) {

Scheduler.every(SERIAL_PRINT_INTERVAL, (void*) -> bool { SerialPrintChannels(); Rückgabe wahr; }); }

Der Interrupt des Pins wird immer dann aufgerufen, wenn sich der logische Wert des Pins geändert hat, also für jede Flanke im PPM-Signal. Bewerten Sie die Pulslänge einfach durch einfaches Timing mit micros():

uint32_t curTime = micros();

uint32_t pulseLength = curTime - edgeTime; uint8_t curState = digitalRead (PPM_PIN);

Durch Auswertung des Zustands des aktuellen Pins und Kombination mit der Pulslänge und vergangenen Pulsen können die neuen Pulse klassifiziert werden. Die folgende Bedingung erkennt die Interframe-Lücke:

if(lastState == 0 && pulseLength > 3000 && pulseLength < 6000)

Für nachfolgende Impulse wird die Impulslänge einem Achsenzustand zugeordnet, indem die Impulslänge beschnitten und an den Joystick-Achsenbereich angepasst wird:

uint16_t rxLength = pulseLength;

rxLänge = (rxLänge > 1600) ? 1600: rxLänge; rxLänge = (rxLänge < 600) ? 600: rxLänge; rxChannels[curChannel] = rxLength - 600;

Das Array rxChannels enthält schließlich 16 Werte von 0 - 1000, die die Position des Sticks / Schiebereglers und der Schaltfläche anzeigen.

Nach dem Empfang von 16 Kanälen erfolgt die Zuordnung zum Joystick:

/* Achsen */

Joystick.setThrottle(channels[0]); Joystick.setXAxis(Kanäle[1]); Joystick.setYAxis(1000 - Kanäle[2]); Joystick.setRxAxis (Kanäle [3]); Joystick.setRyAxis(Kanäle[4]); Joystick.setZAxis(1000 - Kanäle[5]); /* Tasten */ Joystick.setButton(0, (Kanäle[6] < 500 ? 1: 0)); /* Daten über USB aktualisieren */ Joystick.sendState();

Ich habe im Code einige Achsen invertiert, was nicht unbedingt notwendig ist, da Achsen auch durch Umkehren der Servorichtung oder der Zuweisung im FSX invertiert werden können. Ich habe mich jedoch entschieden, die Servorichtungen und auch die ursprüngliche FSX-Zuordnung beizubehalten.

Der Taster wird durch den Schwellwertkanal 7 ein- oder ausgeschaltet.

Und vergessen Sie nicht, den Scheduler anzukreuzen… andernfalls sind keine Debug-Drucke sichtbar.

Leere Schleife () {

zeitplaner.tick(); }

In dem Screenshot, den ich angehängt habe, sehen Sie, dass Kanal 1 von 1000 (Vollgas) auf 0 (Leerlauf) verschoben wurde.

Der FSX erkennt den Arduino wie jeden anderen Joystick, also weisen Sie einfach die Taste und die Achsen zu und haben Sie Spaß beim Abheben!

Was ich an diesem Ansatz sehr mag ist, dass Sie Ihren Sender einfach wie bei einem echten Modell verwenden können, z. B. mit Flugphasen etc.

Empfohlen: