Spisu treści:

Konwerter joysticka PPM na USB oparty na Arduino (JETI) dla FSX: 5 kroków
Konwerter joysticka PPM na USB oparty na Arduino (JETI) dla FSX: 5 kroków

Wideo: Konwerter joysticka PPM na USB oparty na Arduino (JETI) dla FSX: 5 kroków

Wideo: Konwerter joysticka PPM na USB oparty na Arduino (JETI) dla FSX: 5 kroków
Wideo: USB joystick to PPM via RC 2024, Listopad
Anonim
Konwerter joysticka PPM na USB oparty na Arduino (JETI) dla FSX
Konwerter joysticka PPM na USB oparty na Arduino (JETI) dla FSX
Konwerter joysticka PPM na USB oparty na Arduino (JETI) dla FSX
Konwerter joysticka PPM na USB oparty na Arduino (JETI) dla FSX

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

Podłącz RX i Arduino
Podłącz RX i Arduino
Podłącz RX i Arduino
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

Otrzymywanie niektórych sygnałów PPM
Otrzymywanie niektórych sygnałów PPM
Otrzymywanie niektórych sygnałów PPM
Otrzymywanie niektórych 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

Konfiguracja nadajnika
Konfiguracja nadajnika
Konfiguracja nadajnika
Konfiguracja nadajnika
Konfiguracja nadajnika
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

Uruchamianie joysticka
Uruchamianie joysticka
Uruchamianie joysticka
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

Kodowanie Arduino
Kodowanie Arduino
Kodowanie Arduino
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:

  1. Przepustnica -> Oś przepustnicy
  2. Lotka -> oś X
  3. Winda -> oś Y
  4. Ster -> Oś obrotu X
  5. Klapy -> oś obrotu Y
  6. Hamulec -> oś Z
  7. 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.

Zalecana: