Cuprins:

Convertor bazat pe Arduino (JETI) PPM la USB Joystick Converter pentru FSX: 5 pași
Convertor bazat pe Arduino (JETI) PPM la USB Joystick Converter pentru FSX: 5 pași
Anonim
Convertor bazat pe Arduino (JETI) PPM la USB Joystick Converter pentru FSX
Convertor bazat pe Arduino (JETI) PPM la USB Joystick Converter pentru FSX
Convertor bazat pe Arduino (JETI) PPM la USB Joystick Converter pentru FSX
Convertor bazat pe Arduino (JETI) PPM la USB Joystick Converter pentru FSX

Am decis să îmi schimb transmițătorul JETI DC-16 din modul 2 în modul 1, care practic comută accelerația și elevatorul de la stânga la dreapta și invers. Deoarece nu am vrut să prăbușesc unul dintre modelele mele din cauza confuziei stânga / dreapta din creierul meu, mă întrebam dacă este posibil să exersez puțin în FSX.

Am citit și testat emițătoarele JETI care acceptă efectiv un mod Joystick, dar am dorit o flexibilitate completă pentru atribuirea axelor și comutatoarelor și să folosesc TX-ul ca la un model real. Utilizând ieșirea receptorului, este, de asemenea, posibil să valorificați procesarea semnalului în DC-16 și să utilizați mixere, faze de zbor, rate duale, orice puteți programa acolo.

Recent am găsit un tutorial frumos despre cum să faci un dispozitiv de intrare USB HID, și anume un Joystick, dintr-un Arduino ieftin ca un Pro Micro:

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

Acest lucru ar permite tot ce este necesar pentru a controla un avion / elicopter / orice în FSX! O mulțime de axe și butoane disponibile.

Deoarece tocmai aveam un JETI RSAT2 de rezervă, am decis să îl conectez cu Arduino și să încerc să implementez un mic parser PPM împreună cu biblioteca Joystick.

Presupun că oricine urmează acești pași este familiarizat cu conectarea și programarea unui Arduino. Nu voi lua nicio garanție pentru defecțiuni sau daune!

Provizii

Vei avea nevoie…

  • orice Arduino suportat de biblioteca Joystick, am folosit un Sparkfun Pro Micro 5V / 16 MHz
  • o versiune recentă a Arduino IDE
  • orice receptor RC care emite un semnal PPM, cum ar fi JETI RSAT2
  • câteva fire jumper (min. 3)
  • biblioteca Joystick instalată în Arduino IDE
  • biblioteca arduino-timer:

Pasul 1: conectați RX și Arduino

Conectați RX și Arduino
Conectați RX și Arduino
Conectați RX și Arduino
Conectați RX și Arduino

Cablarea este destul de simplă. Am decis să alimentez Arduino doar de pe USB, deoarece va emula un dispozitiv Joystick. Aceasta va furniza Arduino cu 5V, care poate fi utilizat și pentru alimentarea receptorului RC.

Am folosit Pinul VCC, care oferă ieșire reglată, și cel mai apropiat pin Gnd - conectați-l doar la conectorul PPM + și - pinii. Când Arduino este alimentat, receptorul se alimentează și acum.

Pentru semnalul PPM, am decis să folosesc întreruperi pentru a le analiza. Sunt disponibile întreruperi de ex. la pinul 3, deci conectați-l acolo - nu există "pin RC nativ" pe arduino, dar posibil mai multe și diferite moduri de a citi în semnalul receptorului.

A trebuit să dezactivez alarma de tensiune RX, deoarece tensiunea VCC cu alimentare USB va fi de aproximativ 4,5 V doar - dar destul de stabilă, deci nicio problemă deloc.

Pasul 2: Obținerea unor semnale PPM

Obținerea unor semnale PPM
Obținerea unor semnale PPM
Obținerea unor semnale PPM
Obținerea unor semnale PPM

Când receptorul și TX-ul sunt alimentate, primeam semnale PPM așa cum se arată în imagine. 16 canale, repetate pentru totdeauna. Dacă Failsafe pe RSAT este dezactivat și transmițătorul oprit, ieșirea PPM va fi dezactivată.

Mai multe informații despre PPM sunt disponibile aici:

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

Deoarece nu zboară lucruri reale în acest caz, nu mi-a păsat temporizările teoretice și mi-am dat seama pe osciloscop ce scoate receptorul meu când mișcați bețele de la stânga la dreapta (setări standard în TX). Se părea că -100% corespunde impulsurilor cu o lungime de 600µs și + 100% până la 1600µs. De asemenea, nu mi-a păsat lungimea impulsurilor de pauză (400µs) din codul meu Arduino, dar am presupus o distanță de cadru de min. 3000µs.

Pasul 3: Configurarea transmițătorului

Configurarea transmițătorului
Configurarea transmițătorului
Configurarea transmițătorului
Configurarea transmițătorului
Configurarea transmițătorului
Configurarea transmițătorului

Deoarece numai poziția reală a suprafețelor de control trebuie cunoscută, este suficient un canal / "servo" pentru fiecare funcție RC. În consecință, se poate realiza o configurare destul de simplă a transmițătorului - similar cu un model RC normal. Funcțiile principale aleer, lift, cârmă și accelerație necesită fiecare doar un canal servo respectiv transmițător. Am adăugat și clapete, frâne și treapta de viteză, lăsând 9 canale libere până acum. Vă rugăm să rețineți că Flaps-urile au fost puse într-o fază de zbor și nu sunt controlate direct printr-un stick, glisor sau buton.

Pasul 4: Rularea joystick-ului

Rularea joystick-ului
Rularea joystick-ului
Rularea joystick-ului
Rularea joystick-ului

Biblioteca Joystick este destul de ușor de utilizat și oferă câteva exemple și teste. Ar trebui să fie util să verificați mai întâi dacă Arduino este detectat ca Joystick adecvat, instrucțiunile legate în secțiunea de intrare și biblioteca în sine oferă câteva îndrumări bune.

În panoul de control Dispozitive și imprimante, Arduino apărea ca „Sparkfun Pro Micro”, iar fereastra de testare a joystick-ului afișa 7 axe și o mulțime de butoane acceptate. Chiar și un comutator de pălărie poate fi utilizat atunci când este programat în Arduino.

Pasul 5: Codificarea Arduino

Codificarea Arduino
Codificarea Arduino
Codificarea Arduino
Codificarea Arduino

Ce lipsește încă este analiza efectivă a semnalului PPM și atribuirea axelor și butoanelor joystick-ului. Am decis următoarea mapare:

Atribuire canal / funcție / joystick:

  1. Accelerație -> Axa accelerației
  2. Eleron -> axa X
  3. Ascensor -> axa Y
  4. Cârmă -> axa de rotație X
  5. Flaps -> Y ax de rotație
  6. Frână -> axa Z
  7. Gear -> Butonul 0

Când treapta de viteză este în jos, primul buton al joystick-ului va fi apăsat și va fi eliberat când ridicați treapta de viteză. Cu toate acestea, acest lucru va necesita FSUIPC pentru FSX, din cutie, FSX va accepta doar un buton pentru comutarea treptelor, ceea ce nu este exact ceea ce se întâmplă cu modelele mele.

Am furnizat versiunea mea actuală a codului cu o mulțime de comentarii, care funcționează destul de bine pentru mine - nu ezitați să vă schimbați sarcina sau să adăugați funcții noi. Ultimele 9 canale RC nu sunt momentan utilizate.

Pentru configurare, clasa Joystick trebuie inițializată, practic prin definirea intervalelor de axe numerice:

/ * Setați intervalul axelor (definit în antet, 0 - 1000) * /

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

Folosind valori de la 0 la 1000, este posibil să se mapeze direct lungimea impulsului (600 - 1600µs) la valorile joystick-ului fără a fi redimensionate.

DIN 3 este inițializat ca intrare digitală, pullup-uri activate și o întrerupere atașată:

pinMode (PPM_PIN, INPUT_PULLUP);

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

În scopuri de depanare, am adăugat câteva tipăriri prin interfața Serial la intervale regulate, folosind biblioteca arduino-timer:

if (SERIAL_PRINT_INTERVAL> 0) {

scheduler.every (SERIAL_PRINT_INTERVAL, (void *) -> bool {SerialPrintChannels (); return true;}); }

Întreruperea pinului va fi apelată ori de câte ori sa schimbat valoarea logică a pinului, deci pentru fiecare margine din semnalul PPM. Evaluați lungimea impulsului doar prin sincronizare simplă utilizând micros ():

uint32_t curTime = micros ();

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

Prin evaluarea stării pinului curent și combinarea acestuia cu lungimea impulsului și impulsurile trecute, noile impulsuri pot fi clasificate. Următorul condițional va detecta decalajul dintre cadre:

if (lastState == 0 && Lungime impuls> 3000 && Lungime impuls <6000)

Pentru impulsurile ulterioare, lungimea impulsului va fi mapată la starea axei prin tăierea și polarizarea lungimii impulsului pentru a se potrivi cu intervalul axei joystick-ului:

uint16_t rxLength = Lungime impuls;

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

Matricea rxChannels conține în cele din urmă 16 valori de la 0 la 1000, indicând pozițiile stick / glisor și buton.

După primirea a 16 canale, maparea la joystick se efectuează:

/ * axe * /

Joystick.setThrottle (canale [0]); Joystick.setXAxis (canale [1]); Joystick.setYAxis (1000 - canale [2]); Joystick.setRxAxis (canale [3]); Joystick.setRyAxis (canale [4]); Joystick.setZAxis (1000 - canale [5]); / * butoane * / Joystick.setButton (0, (canale [6] <500? 1: 0)); / * actualizați datele prin USB * / Joystick.sendState ();

Am inversat câteva axe în cod, ceea ce nu este absolut necesar, deoarece axa poate fi inversată și prin răsucirea direcției servo sau a atribuirii în FSX. Cu toate acestea, am decis să păstrez direcțiile servo și, de asemenea, atribuirea originală FSX.

Butonul este pornit sau oprit prin pragul canalului 7.

Și nu uitați să bifați programatorul … în caz contrar, nu vor fi vizibile imprimări de depanare.

bucla nulă () {

scheduler.tick (); }

În captura de ecran pe care am atașat-o, puteți vedea, canalul 1 a fost mutat de la 1000 (accelerație completă) la 0 (inactiv).

FSX va detecta Arduino la fel ca orice alt joystick, așa că trebuie doar să atribuiți butonul și axele și să vă distrați decolând!

Ceea ce îmi place foarte mult la această abordare este că poți folosi transmițătorul ca și cu un model real, de ex. folosind fazele de zbor etc.

Recomandat: