Spisu treści:
Wideo: Konwerter joysticka PPM na USB oparty na Arduino (JETI) dla FSX: 5 kroków
2025 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2025-01-13 06:58
Zdecydowałem się przełączyć nadajnik JETI DC-16 z trybu 2 na tryb 1, który zasadniczo przełącza przepustnicę i windę z lewej strony na prawą i odwrotnie. Ponieważ nie chciałem zepsuć jednego z moich modeli z powodu pomieszania lewej/prawej strony mózgu, zastanawiałem się, czy da się trochę poćwiczyć w FSX.
Przeczytałem i przetestowałem nadajniki JETI, które faktycznie obsługują tryb Joystick po wyjęciu z pudełka, jednak chciałem pełnej elastyczności przypisania osi i przełączników i używać TX jak z prawdziwym modelem. Korzystając z wyjścia odbiornika, można również wykorzystać przetwarzanie sygnału w DC-16 i używać mikserów, faz lotu, podwójnych prędkości, cokolwiek można tam zaprogramować.
Niedawno znalazłem fajny samouczek, jak zrobić urządzenie wejściowe USB HID, a mianowicie Joystick, z taniego Arduino, takiego jak Pro Micro:
www.instructables.com/id/Create-a-Joystick…
Umożliwiłoby to wszystko, co potrzebne do sterowania samolotem / helikopterem / czymkolwiek w FSX! Dostępnych jest wiele osi i przycisków.
Ponieważ miałem tylko zapasowy JETI RSAT2, postanowiłem połączyć go z Arduino i spróbować zaimplementować mały parser PPM wraz z biblioteką Joystick.
Zakładam, że każdy, kto wykonuje te kroki, jest zaznajomiony z podłączaniem i programowaniem Arduino. Nie przyjmę żadnych gwarancji za nieprawidłowe działanie lub uszkodzenia!
Kieszonkowe dzieci
Będziesz potrzebować…
- dowolne Arduino obsługiwane przez bibliotekę Joystick, użyłem Sparkfun Pro Micro 5V/16 MHz
- najnowsza wersja Arduino IDE
- dowolny odbiornik RC wysyłający sygnał PPM, taki jak JETI RSAT2
- kilka zworek (min. 3)
- biblioteka Joystick zainstalowana w Arduino IDE
- biblioteka arduino-timer:
Krok 1: Podłącz RX i Arduino
Okablowanie jest dość proste. Postanowiłem zasilać Arduino tylko z USB, ponieważ ma emulować urządzenie Joystick. Zasili to Arduino napięciem 5V, które może być wykorzystane również do zasilania odbiornika RC.
Użyłem Pin VCC, który zapewnia regulowane wyjście, a najbliższy pin Gnd - wystarczy podłączyć do pinów + i - złącza PPM. Kiedy Arduino jest zasilany, odbiornik również się włącza.
W przypadku sygnału PPM zdecydowałem się użyć przerwań do ich parsowania. Przerwania dostępne są m.in. na Pin 3, więc po prostu podłącz go tam - nie ma "natywnego pinu RC" na arduino, ale prawdopodobnie więcej i inne sposoby odczytywania sygnału odbiornika.
Musiałem wyłączyć alarm napięcia RX, ponieważ napięcie VCC z zasilaniem USB będzie tylko około 4,5V - ale dość stabilne, więc nie ma problemu.
Krok 2: Uzyskiwanie sygnałów PPM
Kiedy odbiornik ORAZ TX jest zasilany, otrzymywałem sygnały PPM, jak pokazano na obrazku. 16 kanałów, powtarzanych w nieskończoność. Jeśli Failsafe na RSAT jest wyłączony, a nadajnik wyłączony, wyjście PPM będzie wyłączone.
Więcej informacji na temat PPM można znaleźć tutaj:
- https://en.wikipedia.org/wiki/Pulse-position_modul…
- https://wiki.rc-network.de/index.php/PPM
Ponieważ w tym przypadku nie latam prawdziwymi rzeczami, nie dbałem o teoretyczne czasy i właśnie zorientowałem się na oscyloskopie, co mój odbiornik faktycznie wysyła podczas przesuwania drążków z całkowicie w lewo do maksymalnie w prawo (standardowe ustawienia w TX). Wydawało się, że -100% odpowiada impulsom o długości 600µs, a +100% do 1600µs. Nie zależało mi również na długości impulsów pauzy (400µs) w moim kodzie Arduino, ale założyłem odstępy między ramkami min. 3000µs.
Krok 3: Konfiguracja nadajnika
Ponieważ znane jest tylko rzeczywiste położenie powierzchni sterujących, wystarczy jeden kanał / „serwo” na funkcję RC. W związku z tym można wykonać dość prostą konfigurację nadajnika - podobną do normalnego modelu RC. Główne funkcje lotki, steru wysokości, steru kierunku i przepustnicy wymagają tylko jednego serwomechanizmu lub kanału nadajnika. Dodałem również klapy, hamulce i biegi, pozostawiając na razie 9 kanałów wolnych. Należy pamiętać, że klapy zostały wprowadzone w fazie lotu i nie są sterowane bezpośrednio za pomocą drążka, suwaka lub przycisku.
Krok 4: Uruchamianie joysticka
Biblioteka Joystick jest dość łatwa w użyciu i zawiera kilka przykładów i testów. Powinno być pomocne, aby najpierw sprawdzić, czy Arduino jest wykrywany jako właściwy Joystick, instrukcje połączone w sekcji wejściowej i sama biblioteka zapewniają dobre wskazówki.
W panelu sterowania Devices and Printers Arduino wyświetlało się jako „Sparkfun Pro Micro”, a okno testowe joysticka pokazywało 7 osi i wiele obsługiwanych przycisków. Nawet przełącznik kapeluszowy może być używany, gdy jest zaprogramowany w Arduino.
Krok 5: Kodowanie Arduino
To, czego wciąż brakuje, to faktyczne parsowanie sygnału PPM i przypisanie do osi i przycisków joysticka. Zdecydowałem się na następujące mapowanie:
Kanał / funkcja / przypisanie joysticka:
- Przepustnica -> Oś przepustnicy
- Lotka -> oś X
- Winda -> oś Y
- Ster -> Oś obrotu X
- Klapy -> oś obrotu Y
- Hamulec -> oś Z
- Koło zębate -> Przycisk 0
Gdy bieg jest opuszczony, pierwszy przycisk joysticka powinien być wciśnięty i zostanie zwolniony podczas podnoszenia biegu. Będzie to jednak wymagało FSUIPC dla FSX, po wyjęciu z pudełka, FSX zaakceptuje tylko przycisk do przełączania biegów, co nie jest dokładnie tym, co dzieje się z moimi modelami.
Podałem moją obecną wersję kodu z dużą ilością komentarzy, co dla mnie działa całkiem nieźle - możesz zmienić swoje przypisanie lub dodać nowe funkcje. Ostatnie 9 kanałów RC nie jest obecnie używanych.
W celu konfiguracji należy zainicjować klasę Joystick, zasadniczo poprzez zdefiniowanie zakresów osi liczbowych:
/* Ustaw zakres osi (zdefiniowany w nagłówku, 0 - 1000) */
Joystick.setXAxisRange(KANAŁ_MIN, KANAŁ_MAX); Joystick.setYAxisRange(CHANNEL_MIN, CHANNEL_MAX); …
Używając wartości od 0 do 1000, możliwe jest bezpośrednie mapowanie długości impulsu (600 - 1600µs) na wartości joysticka bez przeskalowania.
DIN 3 jest inicjowane jako wejście cyfrowe, włączone podciąganie i dołączone przerwanie:
pinMode(PPM_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(PPM_PIN), PPM_Pin_Changed, CHANGE);
W celach debugowania dodałem kilka wydruków przez interfejs Serial w regularnych odstępach czasu, korzystając z biblioteki arduino-timer:
jeśli (SERIAL_PRINT_INTERVAL > 0) {
scheduler.every(SERIAL_PRINT_INTERVAL, (void*) -> bool { SerialPrintChannels(); return true; }); }
Przerwanie pinu zostanie wywołane za każdym razem, gdy zmieni się wartość logiczna pinu, a więc dla każdej krawędzi w sygnale PPM. Oceń długość impulsu po prostu za pomocą prostego pomiaru czasu za pomocą micros():
uint32_t curTime = micros();
uint32_t pulseLength = curTime - edgeTime; uint8_t curState = digitalRead(PPM_PIN);
Oceniając stan obecnego pinu i łącząc go z długością impulsu i przeszłymi impulsami, można sklasyfikować nowe impulsy. Następujące warunki warunkowe wykryją przerwę międzyramkową:
if(lastState == 0 && długość impulsu > 3000 && długość impulsu < 6000)
W przypadku kolejnych impulsów długość impulsu zostanie odwzorowana na stan osi poprzez obcięcie i ustawienie długości impulsu w celu dopasowania do zakresu osi joysticka:
uint16_t rxLength = długość impulsu;
rxDługość = (rxDługość > 1600) ? 1600: rxDługość; rxDługość = (rxDługość < 600) ? 600: rxDługość; rxChannels[curChannel] = rxLength - 600;
Tablica rxChannels ostatecznie zawiera 16 wartości od 0 do 1000, wskazujących pozycje drążka / suwaka i przycisku.
Po odebraniu 16 kanałów następuje mapowanie do Joysticka:
/* osie */
Joystick.setThrottle(channels[0]); Joystick.setXAxis(kanały[1]); Joystick.setYAxis(1000 - kanały[2]); Joystick.setRxAxis(kanały[3]); Joystick.setRyAxis(kanały[4]); Joystick.setZAxis(1000 - kanały[5]); /* przyciski */ Joystick.setButton(0, (kanały[6] < 500 ? 1: 0)); /* aktualizacja danych przez USB */ Joystick.sendState();
Odwróciłem niektóre osie w kodzie, co nie jest absolutnie konieczne, ponieważ oś można również odwrócić, odwracając kierunek serwomechanizmu lub przypisanie w FSX. Postanowiłem jednak zachować kierunki serwomechanizmu, a także oryginalne przypisanie FSX.
Przycisk jest włączany lub wyłączany przez progowanie kanału 7.
I nie zapomnij zaznaczyć harmonogramu… w przeciwnym razie żadne wydruki debugowania nie będą widoczne.
pusta pętla () {
harmonogram.tick(); }
Na załączonym zrzucie ekranu widać, że kanał 1 został przeniesiony z 1000 (pełna przepustnica) do 0 (bezczynność).
FSX wykryje Arduino tak jak każdy inny joystick, więc po prostu przypisz przycisk i osie i baw się dobrze!
To, co naprawdę podoba mi się w tym podejściu, to to, że możesz po prostu używać swojego nadajnika tak, jak w przypadku prawdziwego modelu, np. z wykorzystaniem faz lotu itp.