Inhaltsverzeichnis:
- Lieferungen
- Schritt 1: Verdrahten Sie den RX und den Arduino
- Schritt 2: Einige PPM-Signale erhalten
- Schritt 3: Konfigurieren des Senders
- Schritt 4: Ausführen des Joysticks
- Schritt 5: Codieren des Arduino
Video: Arduino-basierter (JETI) PPM-zu-USB-Joystick-Konverter für FSX - Gunook
2024 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2024-01-30 07:16
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
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
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
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
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
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:
- Drossel -> Drosselachse
- Querruder -> X-Achse
- Aufzug -> Y-Achse
- Ruder -> X-Rotationsachse
- Klappen -> Y-Rotationsachse
- Bremse -> Z-Achse
- 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:
Arduino Auto-Rückfahrwarnsystem - Schritt für Schritt: 4 Schritte
Arduino Auto-Rückfahrwarnsystem | Schritt für Schritt: In diesem Projekt entwerfe ich eine einfache Arduino-Auto-Rückwärts-Parksensorschaltung mit Arduino UNO und dem Ultraschallsensor HC-SR04. Dieses Arduino-basierte Car-Reverse-Warnsystem kann für eine autonome Navigation, Roboter-Ranging und andere Entfernungsr
So deaktivieren Sie die Autokorrektur für nur ein Wort (iOS): 3 Schritte
So deaktivieren Sie die Autokorrektur für nur ein Wort (iOS): Manchmal korrigiert die Autokorrektur möglicherweise etwas, das Sie nicht korrigieren möchten, z. Textabkürzungen beginnen sich in Großbuchstaben zu setzen (imo korrigieren zum Beispiel zu IMO). So erzwingen Sie, dass die Korrektur eines Wortes oder einer Phrase beendet wird, ohne aut zu deaktivieren
Interessante Programmieranleitung für Designer - Bringen Sie Ihr Bild zum Laufen (Teil 2): 8 Schritte
Interessante Programmieranleitung für Designer – Bringen Sie Ihr Bild zum Laufen (Teil 2): Mathematik scheint für die meisten von Ihnen nutzlos zu sein. Die in unserem täglichen Leben am häufigsten verwendete ist einfach Addieren, Subtrahieren, Multiplizieren und Dividieren. Es ist jedoch ganz anders, wenn Sie mit Programm erstellen können. Je mehr Sie wissen, desto mehr wundervolle Ergebnisse werden Sie erhalten
Arduino-Programmierung über das Handy -- Arduinodroid -- Arduino-Ide für Android -- Blinzeln: 4 Schritte
Arduino-Programmierung über das Handy || Arduinodroid || Arduino-Ide für Android || Blink: Bitte abonnieren Sie meinen Youtube-Kanal für weitere Videos…… Arduino ist ein Board, das direkt über USB programmiert werden kann. Es ist sehr einfach und günstig für College- und Schulprojekte oder sogar für Produktprototypen. Viele Produkte bauen zunächst darauf für i
RC-Tracked-Roboter mit Arduino – Schritt für Schritt: 3 Schritte
RC Tracked Robot mit Arduino – Schritt für Schritt: Hey Leute, ich bin zurück mit einem weiteren coolen Robot-Chassis von BangGood. Ich hoffe, Sie haben unsere vorherigen Projekte durchgegangen – Spinel Crux V1 – Der gestengesteuerte Roboter, Spinel Crux L2 – Arduino Pick-and-Place-Roboter mit Roboterarmen und The Badland Braw