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
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 JETI DC-16 odašiljač iz načina 2 u način rada 1, koji u osnovi prebacuje leptir za gas i lift 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 predajnike koji u stvari podržavaju Joystick način rada, ali sam želio potpunu fleksibilnost u dodjeljivanju osi i prekidača i 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 što je potrebno za upravljanje avionom / helikopterom / bilo čime u FSX -u! Dostupno je puno sjekira i gumba.

Pošto sam upravo imao rezervni JETI RSAT2, odlučio sam ga povezati sa Arduinom i pokušati implementirati mali PPM parser zajedno sa Joystick bibliotekom.

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

Supplies

Trebat će vam…

  • bilo koji Arduino koji podržava Joystick biblioteka, 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)
  • biblioteka 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. Ovo će Arduino napajati 5V, 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. Kada se Arduino napaja, prijemnik se sada uključuje.

Za PPM signal, odlučio sam upotrijebiti prekide za njihovo raščlanjivanje. 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 za čitanje signala prijemnika.

Morao sam onemogućiti alarm za RX napon, 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

Kada se prijemnik I TX napajaju, dobivao sam PPM signale kao što je prikazano na slici. 16 kanala, ponavljaju se zauvek. 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 stvarnim stvarima, nije me bilo briga za teoretsko vrijeme i samo sam na osciloskopu shvatio što je moj prijemnik aktualno odašiljao pri pomicanju štapića s lijeva na desno (standardne postavke u TX -u). Činilo se da -100% odgovara impulsima dužine 600µs i +100% do 1600µs. Nije me bilo briga ni za dužinu 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 podešavanje odašiljača - slično uobičajenom modelu daljinskog upravljača. Glavne funkcije elerona, lifta, 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 direktno pomoću štapa, klizača ili dugmeta.

Korak 4: Pokrenite joystick

Pokretanje džojstika
Pokretanje džojstika
Pokretanje džojstika
Pokretanje džojstika

Biblioteka Joystick je prilično jednostavna za korištenje i nudi neke primjere i testove. Bilo bi korisno prvo provjeriti je li Arduino otkriven kao pravi džojstik, upute povezane u odjeljku za unos i sama biblioteka pružaju neke dobre smjernice.

Na kontrolnoj ploči Uređaji i pisači, Arduino se pojavljivao kao "Sparkfun Pro Micro", a prozor za testiranje na džojstiku je pokazivao 7 osi i dosta podržanih tipki. Č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 osama i tipkama joystick -a. Odlučio sam se za sljedeće mapiranje:

Dodjela kanala / funkcije / džojstika:

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

Kad je stupanj prijenosa spušten, prvo dugme joystick -a mora se pritisnuti i otpustit će se pri podizanju stupnja prijenosa. Međutim, ovo će zahtijevati FSUIPC za FSX, izvan kutije, FSX će prihvatiti samo dugme za prebacivanje stepena prenosa, što se baš ne dešava sa mojim modelima.

Svojoj trenutnoj verziji koda dao sam puno komentara, što mi prilično dobro funkcionira - 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 joystick -a bez promjene veličine.

DIN 3 je inicijaliziran kao digitalni ulaz, omogućeni su pullupi i priključen je prekid:

pinMode (PPM_PIN, INPUT_PULLUP);

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

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

if (SERIAL_PRINT_INTERVAL> 0) {

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

Prekid pina će se pozivati kad god se promeni logička vrednost pina, dakle za svaku ivicu 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 joystick -a:

uint16_t rxLength = pulseLength;

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 štapića / klizača i dugmadi.

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]); / * dugmad */ Joystick.setButton (0, (kanali [6] <500? 1: 0)); / * ažuriranje podataka putem USB */ 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. Međutim, odlučio sam zadržati servo upute i originalni FSX zadatak.

Dugme se uključuje ili isključuje preko kanala 7.

I ne zaboravite označiti raspoređivač … u suprotnom neće biti vidljivi otisci za otklanjanje grešaka.

void loop () {{100} {101}

Scheduler.tick (); }

Na snimku ekrana koji sam priložio možete vidjeti da je kanal 1 pomaknut sa 1000 (pun gas) na 0 (u mirovanju).

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

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

Preporučuje se: