Obsah:

Prevodník joysticku PPM na USB na báze Arduino (JETI) pre FSX: 5 krokov
Prevodník joysticku PPM na USB na báze Arduino (JETI) pre FSX: 5 krokov

Video: Prevodník joysticku PPM na USB na báze Arduino (JETI) pre FSX: 5 krokov

Video: Prevodník joysticku PPM na USB na báze Arduino (JETI) pre FSX: 5 krokov
Video: This Mini Laptop is Amazing! 😯 2024, Júl
Anonim
Arduino (JETI) PPM na USB joystickový prevodník pre FSX
Arduino (JETI) PPM na USB joystickový prevodník pre FSX
Prevodník Joystick PPM na USB založený na Arduino (JETI) pre FSX
Prevodník Joystick PPM na USB založený na Arduino (JETI) pre FSX

Rozhodol som sa prepnúť svoj vysielač JETI DC-16 z režimu 2 na režim 1, ktorý v zásade prepína plyn a výťah zľava doprava a naopak. Keďže som kvôli nejakému zmätku vľavo/vpravo v mozgu nechcel zrútiť jeden zo svojich modelov, premýšľal som, či je možné v FSX trochu cvičiť.

Čítal som a testoval som, či vysielače JETI skutočne podporujú režim joysticku ihneď po vybalení, ale chcel som plnú flexibilitu priradenia osí a prepínačov a používať TX ako u skutočného modelu. Použitím výstupu prijímača je tiež možné využiť spracovanie signálu v DC-16 a použiť mixéry, letové fázy, duálne sadzby, čokoľvek, čo tam môžete naprogramovať.

Nedávno som našiel pekný návod, ako vyrobiť vstupné zariadenie USB HID, konkrétne joystick, z lacného Arduina ako Pro Micro:

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

To by umožnilo všetko potrebné na ovládanie lietadla / helikoptéry / čohokoľvek vo FSX! K dispozícii je veľa osí a tlačidiel.

Pretože som mal práve náhradný JETI RSAT2, rozhodol som sa ho prepojiť s Arduinom a skúsiť implementovať malý PPM parser spolu s knižnicou Joystick.

Predpokladám, že niekto, kto dodržiava tieto kroky, je oboznámený s pripojením a programovaním Arduina. Neposkytujem žiadne záruky za poruchy alebo škody!

Zásoby

Budete potrebovať…

  • akékoľvek Arduino podporované knižnicou Joystick, použil som Sparkfun Pro Micro 5V / 16 MHz
  • najnovšia verzia Arduino IDE
  • akýkoľvek RC prijímač s výstupom signálu PPM, napríklad JETI RSAT2
  • niekoľko prepojovacích káblov (min. 3)
  • knižnica Joystick nainštalovaná v Arduino IDE
  • knižnica arduino-timer:

Krok 1: Zapojte RX a Arduino

Zapojte RX a Arduino
Zapojte RX a Arduino
Zapojte RX a Arduino
Zapojte RX a Arduino

Zapojenie je veľmi jednoduché. Rozhodol som sa napájať Arduino iba z USB, pretože bude emulovať zariadenie Joystick. To dodá Arduinu 5 V, ktoré je možné použiť aj na napájanie RC prijímača.

Použil som Pin VCC, ktorý poskytuje regulovaný výstup, a najbližší pin Gnd - stačí ho pripojiť ku konektorom + a - pinov PPM. Keď sa Arduino začne napájať, prijímač sa teraz tiež zapne.

Pre signál PPM som sa rozhodol použiť prerušenia na ich analýzu. Prerušenia sú k dispozícii napr. na Pin 3, tak ho tam len pripojte - na arduine nie je „natívny RC pin“, ale možno viac a rôznych spôsobov čítania signálu prijímača.

Musel som vypnúť napäťový alarm RX, pretože napätie VCC s napájaním USB bude iba okolo 4,5 V - ale celkom stabilné, takže nie je žiadny problém.

Krok 2: Získanie niektorých signálov PPM

Získanie niektorých signálov PPM
Získanie niektorých signálov PPM
Získanie niektorých signálov PPM
Získanie niektorých signálov PPM

Keď je prijímač A TX napájaný, dostával som signály PPM, ako je znázornené na obrázku. 16 kanálov, navždy sa opakujúcich. Ak je Failsafe na RSAT vypnuté a vysielač je vypnutý, výstup PPM bude deaktivovaný.

Viac informácií o PPM nájdete tu:

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

Pretože v tomto prípade nelietam na skutočných veciach, nestaral som sa o teoretické načasovanie a iba som na osciloskope zistil, čo môj prijímač akútne vydáva pri pohybe páčok úplne zľava doprava (štandardné nastavenia v TX). Zdalo sa, že -100% zodpovedá impulzom s dĺžkou 600 µs a +100% až 1 600 µs. Tiež som sa nestaral o dĺžku pauzových impulzov (400 µs) v mojom kóde Arduino, ale predpokladal som, že rozstup rámcov je min. 3000 µs.

Krok 3: Konfigurácia vysielača

Konfigurácia vysielača
Konfigurácia vysielača
Konfigurácia vysielača
Konfigurácia vysielača
Konfigurácia vysielača
Konfigurácia vysielača

Pretože je potrebné poznať iba skutočnú polohu riadiacich plôch, stačí jeden kanál / „servo“na RC funkciu. V dôsledku toho je možné vykonať pomerne jednoduché nastavenie vysielača - podobné bežnému modelu RC. Hlavné funkcie krídelok, výškovky, kormidla a škrtiacej klapky vyžadujú iba jeden servopohon, respektíve kanál vysielača. Tiež som pridal klapky, brzdy a prevodový stupeň, takže zatiaľ bolo ponechaných 9 kanálov. Upozorňujeme, že klapky boli nasadené vo fáze letu a nie sú ovládané priamo páčkou, posúvačom alebo tlačidlom.

Krok 4: Spustenie joysticku

Spustenie joysticku
Spustenie joysticku
Spustenie joysticku
Spustenie joysticku

Knižnica Joystick sa veľmi ľahko používa a poskytuje niekoľko príkladov a testov. Malo by byť užitočné najskôr skontrolovať, či je Arduino rozpoznaný ako správny joystick, pokyny uvedené v vstupnej sekcii a samotná knižnica poskytujú dobré rady.

Na ovládacom paneli Zariadenia a tlačiarne sa Arduino zobrazovalo ako „Sparkfun Pro Micro“a testovacie okno joysticku ukazovalo 7 osí a množstvo podporovaných tlačidiel. Pri programovaní v Arduine je možné použiť aj klobúkový spínač.

Krok 5: Kódovanie Arduina

Kódovanie Arduina
Kódovanie Arduina
Kódovanie Arduina
Kódovanie Arduina

Čo ešte chýba, je skutočná analýza signálu PPM a priradenie osiam a tlačidlám joysticku. Rozhodol som sa pre nasledujúce mapovanie:

Priradenie kanála / funkcie / joysticku:

  1. Plyn -> Os škrtiacej klapky
  2. Krídla -> os X
  3. Výťah -> os Y
  4. Kormidlo -> os rotácie X
  5. Klapky -> os rotácie Y
  6. Brzda -> os Z
  7. Zariadenie -> Tlačidlo 0

Keď je prevodový stupeň zaradený, musí byť stlačené prvé tlačidlo joysticku, ktoré sa uvoľní pri zaradení vyššieho stupňa. To však bude vyžadovať FSUIPC pre FSX, po vybalení z krabice FSX akceptuje iba tlačidlo na prepínanie prevodových stupňov, čo sa práve pri mojich modeloch nedeje.

K svojej aktuálnej verzii kódu som poskytol množstvo komentárov, ktoré mi celkom vyhovujú - môžete zmeniť svoje priradenie alebo pridať nové funkcie. Posledných 9 RC kanálov sa v súčasnosti nepoužíva.

Na nastavenie je potrebné inicializovať triedu Joystick, v zásade definovaním rozsahov číselných osí:

/ * Nastaviť rozsah osí (definovaný v hlavičke, 0 - 1 000) */

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

Použitím hodnôt od 0 do 1 000 je možné priamo mapovať dĺžku impulzu (600 - 1 600 µs) na hodnoty joysticku bez zmeny mierky.

DIN 3 je inicializovaná ako digitálny vstup, povolené vyťahovania a je pripojené prerušenie:

pinMode (PPM_PIN, INPUT_PULLUP);

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

Na účely ladenia som v pravidelných intervaloch pomocou knižnice arduino-timer pridal niekoľko výtlačkov cez sériové rozhranie:

ak (SERIAL_PRINT_INTERVAL> 0) {

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

Prerušenie pinu sa vyvolá vždy, keď sa zmení logická hodnota pinu, teda pre každú hranu v signáli PPM. Vyhodnoťte dĺžku impulzu jednoduchým načasovaním pomocou mikro ():

uint32_t curTime = micros ();

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

Nové impulzy je možné klasifikovať vyhodnotením aktuálneho stavu kolíka a jeho kombináciou s dĺžkou impulzu a minulými impulzmi. Nasledujúce podmienené zistí medzeru medzi rámcami:

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

Pri nasledujúcich impulzoch bude dĺžka impulzu mapovaná do stavu osi orezaním a posunutím dĺžky impulzu tak, aby zodpovedala rozsahu osí joysticku:

uint16_t rxLength = pulseLength;

rxLength = (rxLength> 1600)? 1600: rxLength; rxLength = (rxLength <600)? 600: rxDĺžka; rxKanály [curChannel] = rxDĺžka - 600;

Pole rxChannels nakoniec obsahuje 16 hodnôt od 0 do 1 000, ktoré označujú polohy páčok / posúvačov a tlačidiel.

Po prijatí 16 kanálov sa vykoná mapovanie na joystick:

/ * osi */

Joystick.setThrottle (kanály [0]); Joystick.setXAxis (kanály [1]); Joystick.setYAxis (1 000 kanálov [2]); Joystick.setRxAxis (kanály [3]); Joystick.setRyAxis (kanály [4]); Joystick.setZAxis (1 000 kanálov [5]); / * tlačidlá */ Joystick.setButton (0, (kanály [6] <500? 1: 0)); / * aktualizácia údajov cez USB */ Joystick.sendState ();

V kóde som obrátil niektoré osi, čo nie je absolútne nevyhnutné, pretože os je možné prevrátiť aj otočením smeru serva alebo priradením v FSX. Rozhodol som sa však ponechať smery servo a tiež pôvodné priradenie FSX.

Toto tlačidlo sa zapína alebo vypína prahovým kanálom 7.

A nezabudnite zaškrtnúť plánovač … v opačnom prípade nebudú viditeľné žiadne výtlačky ladenia.

prázdna slučka () {

scheduler.tick (); }

Na obrázku, ktorý som pripojil, vidíte, že kanál 1 bol presunutý z 1 000 (plný plyn) na 0 (nečinný).

FSX bude detekovať Arduino rovnako ako každý iný joystick, stačí teda priradiť tlačidlo a osi a zabaviť sa pri štartovaní!

To, čo sa mi na tomto prístupe skutočne páči, je, že svoj vysielač môžete používať iba ako u skutočného modelu, napr. pomocou fáz letu atď.

Odporúča: