Sadržaj:

Arduino bazirani (JETI) PPM na USB Joystick pretvarač za FSX: 5 koraka
Arduino bazirani (JETI) PPM na USB Joystick pretvarač za FSX: 5 koraka

Video: Arduino bazirani (JETI) PPM na USB Joystick pretvarač za FSX: 5 koraka

Video: Arduino bazirani (JETI) PPM na USB Joystick pretvarač za FSX: 5 koraka
Video: Урок 99. Создание цифровых часов Arduino с использованием ЖК-дисплея DS3231 и семисегментного дисплея. 2024, Srpanj
Anonim
Arduino bazirani (JETI) PPM na USB Joystick pretvarač za FSX
Arduino bazirani (JETI) PPM na USB Joystick pretvarač za FSX
Arduino bazirani (JETI) PPM na USB Joystick pretvarač za FSX
Arduino bazirani (JETI) PPM na USB Joystick pretvarač za FSX

Odlučio sam prebaciti svoj odašiljač JETI DC-16 iz načina 2 u način rada 1, koji u osnovi prebacuje leptir za gas i dizalo s lijeva na desno i obrnuto. Budući da nisam htio srušiti jedan od svojih modela zbog neke zabune lijevo/desno u mozgu, pitao sam se je li moguće malo vježbati u FSX -u.

Pročitao sam i testirao JETI odašiljače koji uistinu podržavaju Joystick način rada, ali sam želio potpunu fleksibilnost za dodjelu osi i prekidača te koristiti TX kao sa pravim modelom. Korištenjem izlaza prijemnika, također je moguće poboljšati obradu signala u DC-16 i koristiti miksere, faze leta, dvostruke brzine, sve što tamo možete programirati.

Nedavno sam pronašao lijep vodič o tome kako napraviti USB HID ulazni uređaj, naime joystick, od jeftinog Arduina poput Pro Micro -a:

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

To bi omogućilo sve potrebno za upravljanje avionom / helikopterom / bilo čime u FSX -u! Dostupno je puno sjekira i gumba.

Budući da sam upravo imao rezervni JETI RSAT2, odlučio sam ga povezati s Arduinom i pokušati implementirati mali PPM parser zajedno s Joystick knjižnicom.

Pretpostavljam da je netko slijedeći ove korake upoznat s povezivanjem i programiranjem Arduina. Ne preuzimam nikakva jamstva za kvarove ili oštećenja!

Pribor

Trebat će vam…

  • bilo koji Arduino podržan od Joystick knjižnice, koristio sam Sparkfun Pro Micro 5V / 16 MHz
  • novija verzija Arduino IDE -a
  • bilo koji RC prijemnik koji emitira PPM signal, poput JETI RSAT2
  • nekoliko kratkospojnih žica (min. 3)
  • knjižnica Joystick instalirana u Arduino IDE -u
  • biblioteka arduino-timera:

Korak 1: Povežite RX i Arduino

Povežite RX i Arduino
Povežite RX i Arduino
Povežite RX i Arduino
Povežite RX i Arduino

Ožičenje je prilično jednostavno. Odlučio sam napajati Arduino samo s USB -a jer će oponašati Joystick uređaj. To će Arduino napajati s 5 V, koje se može koristiti i za napajanje RC prijemnika.

Koristio sam Pin VCC, koji osigurava regulirani izlaz, i najbliži Gnd pin - samo ga spojite na PPM konektor + i - pinove. Kad se Arduino napaja, sada se uključuje i prijemnik.

Za PPM signal odlučio sam upotrijebiti prekide za njihovu analizu. Dostupni su prekidi, npr. na Pin 3, pa ga samo spojite tamo - nema "izvornog RC pina" na arduinu, već moguće više i različitih načina čitanja signala prijemnika.

Morao sam onemogućiti alarm napona RX, jer će VCC napon s USB napajanjem biti samo oko 4,5 V - ali prilično stabilan, tako da nema problema.

Korak 2: Dobivanje nekih PPM signala

Dobivanje nekih PPM signala
Dobivanje nekih PPM signala
Dobivanje nekih PPM signala
Dobivanje nekih PPM signala

Kad se prijemnik I TX napajaju, dobivao sam PPM signale kao što je prikazano na slici. 16 kanala, koji se ponavljaju zauvijek. Ako je Failsafe na RSAT -u onemogućen i odašiljač isključen, PPM izlaz će biti onemogućen.

Više informacija o PPM -u dostupno je ovdje:

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

Budući da u ovom slučaju ne letim pravim stvarima, nije me bilo briga za teoretsko vrijeme i samo sam na osciloskopu shvatio što je moj prijemnik aktualno odašiljao pri pomicanju palica s lijeva na potpuno desno (standardne postavke u TX -u). Činilo se da -100% odgovara impulsima duljine 600 µs i +100% do 1600 µs. Također me nije zanimala duljina impulsa pauze (400 μs) u mom Arduino kodu, ali sam pretpostavio razmak okvira od min. 3000µs.

Korak 3: Konfiguriranje odašiljača

Konfiguriranje odašiljača
Konfiguriranje odašiljača
Konfiguriranje odašiljača
Konfiguriranje odašiljača
Konfiguriranje odašiljača
Konfiguriranje odašiljača

Budući da je potrebno znati samo stvarni položaj upravljačkih površina, dovoljan je jedan kanal / "servo" po RC funkciji. Slijedom toga, može se napraviti prilično jednostavno postavljanje odašiljača - slično uobičajenom modelu daljinskog upravljača. Glavne funkcije elerona, dizala, kormila i gasa zahtijevaju samo jedan servo odnosno kanal odašiljača. Dodao sam i zaklopke, kočnice i zupčanike, ostavljajući do sada slobodnih 9 kanala. Imajte na umu da su zakrilca stavljena u fazu leta i da se njima ne upravlja izravno pomoću štapa, klizača ili gumba.

Korak 4: Pokretanje joysticka

Pokretanje joysticka
Pokretanje joysticka
Pokretanje joysticka
Pokretanje joysticka

Knjižnica Joystick prilično je jednostavna za korištenje i nudi neke primjere i testove. Bilo bi korisno prvo provjeriti je li Arduino otkriven kao ispravna joystick, upute povezane u odjeljku za unos i sama knjižnica pružaju neke dobre smjernice.

Na upravljačkoj ploči Uređaji i pisači, Arduino se pojavljivao kao "Sparkfun Pro Micro", a prozor za provjeru upravljačke palice pokazivao je 7 osi i puno podržanih gumba. Čak se i prekidač za šešir može koristiti kada je programiran u Arduinu.

Korak 5: Kodiranje Arduina

Kodiranje Arduina
Kodiranje Arduina
Kodiranje Arduina
Kodiranje Arduina

Ono što još nedostaje je stvarno raščlanjivanje PPM signala i dodjela osovinama i gumbima Joystick -a. Odlučio sam se za sljedeće mapiranje:

Dodjela kanala / funkcije / džojstika:

  1. Prigušivač -> Os leptira za gas
  2. Eleron -> X os
  3. Dizalo -> Y os
  4. Kormilo -> os rotacije X
  5. Klapne -> os rotacije Y
  6. Kočnica -> os Z
  7. Gear -> Gumb 0

Kad je stupanj prijenosa spušten, pritisnuti će se prva tipka upravljačke palice i otpustit će se pri podizanju stupnja prijenosa. Međutim, to će zahtijevati FSUIPC za FSX, izvan kutije, FSX će prihvatiti samo gumb za prebacivanje stupnja prijenosa, što se baš ne događa s mojim modelima.

Svojoj trenutnoj verziji koda dao sam puno komentara, što mi jako dobro odgovara - slobodno promijenite svoj zadatak ili dodajte nove funkcije. Posljednjih 9 RC kanala trenutno se ne koriste.

Za postavljanje klasu Joystick potrebno je inicijalizirati, u osnovi definiranjem numeričkih raspona osi:

/ * Postavi raspon osi (definirano u zaglavlju, 0 - 1000) */

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

Korištenjem vrijednosti od 0 do 1000, moguće je izravno preslikati duljinu impulsa (600 - 1600µs) na vrijednosti upravljačke palice bez promjene veličine.

DIN 3 je inicijaliziran kao digitalni ulaz, omogućeno podizanje i priključen prekid:

pinMode (PPM_PIN, INPUT_PULLUP);

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

U svrhu otklanjanja pogrešaka, dodao sam neke ispise putem serijskog sučelja u redovitim intervalima, koristeći biblioteku arduino-timera:

ako (SERIAL_PRINT_INTERVAL> 0) {

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

Prekid pina bit će pozvan kad god se promijeni logička vrijednost pina, dakle za svaki rub u PPM signalu. Procijenite duljinu impulsa jednostavnim vremenskim određivanjem pomoću micros ():

uint32_t curTime = mikros ();

uint32_t pulseLength = curTime - edgeTime; uint8_t curState = digitalno čitanje (PPM_PIN);

Procjenom trenutnog stanja pina i kombiniranjem s duljinom impulsa i prošlim impulsima, novi se impulsi mogu klasificirati. Sljedeći uvjetni će otkriti međukapacni jaz:

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

Za sljedeće impulse, duljina impulsa bit će preslikana u stanje osi izrezivanjem i podešavanjem duljine impulsa kako bi odgovarala rasponu osi upravljačke palice:

uint16_t rxLength = pulsLength;

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

Niz rxChannels na kraju sadrži 16 vrijednosti od 0 - 1000, što ukazuje na položaj palica / klizača i gumba.

Nakon primanja 16 kanala, vrši se preslikavanje na joystick:

/ * osi */

Joystick.setThrottle (kanali [0]); Joystick.setXAxis (kanali [1]); Joystick.setYAxis (1000 - kanala [2]); Joystick.setRxAxis (kanali [3]); Joystick.setRyAxis (kanali [4]); Joystick.setZAxis (1000 - kanala [5]); / * tipke */ Joystick.setButton (0, (kanali [6] <500? 1: 0)); / * ažurirati podatke putem USB -a/ Joystick.sendState ();

Okrenuo sam neke osi u kodu, što apsolutno nije potrebno, budući da se os može obrnuti i okretanjem servo smjera ili dodjelom u FSX -u. Ipak, odlučio sam zadržati servo upute, ali i izvornu dodjelu FSX -a.

Gumb se uključuje ili isključuje pragom kanala 7.

I ne zaboravite označiti raspoređivač … u protivnom neće biti vidljivi ispisi za ispravljanje pogrešaka.

void loop () {{100} {101}

raspoređivač.tick (); }

Na snimci zaslona koju sam priložio možete vidjeti da je kanal 1 premješten sa 1000 (pun gas) na 0 (u praznom hodu).

FSX će otkriti Arduino kao i svaki drugi joystick, pa samo dodijelite gumb i osi i zabavite se uzlijećući!

Ono što mi se jako sviđa kod ovog pristupa je, možete jednostavno koristiti svoj odašiljač kao sa pravim modelom, npr. pomoću faza leta itd.

Preporučeni: