Kazalo:

Pretvornik Joystick na osnovi Arduino (JETI) PPM v USB za FSX: 5 korakov
Pretvornik Joystick na osnovi Arduino (JETI) PPM v USB za FSX: 5 korakov

Video: Pretvornik Joystick na osnovi Arduino (JETI) PPM v USB za FSX: 5 korakov

Video: Pretvornik Joystick na osnovi Arduino (JETI) PPM v USB za FSX: 5 korakov
Video: Как использовать ESP32 WiFi и Bluetooth с Arduino IDE, полная информация с примерами и кодом. 2024, Julij
Anonim
Pretvornik Joystick na osnovi Arduino (JETI) PPM v USB za FSX
Pretvornik Joystick na osnovi Arduino (JETI) PPM v USB za FSX
Pretvornik Joystick na osnovi Arduino (JETI) PPM v USB za FSX
Pretvornik Joystick na osnovi Arduino (JETI) PPM v USB za FSX

Odločil sem se, da bom svoj oddajnik JETI DC-16 preusmeril iz načina 2 v način 1, ki v bistvu preklopi ročico za plin in dvigalo od leve proti desni in obratno. Ker nisem želel zrušiti enega od svojih modelov zaradi zmede med levo in desno v možganih, sem se spraševal, ali je mogoče malo vaditi v FSX.

Prebral in preizkusil sem, da oddajniki JETI dejansko podpirajo način krmiljenja, vendar sem želel popolno prilagodljivost pri dodelitvi osi in stikal ter uporabo TX kot pri pravem modelu. Z uporabo izhodnega sprejemnika je mogoče uporabiti tudi obdelavo signala v DC-16 in uporabiti mešalnike, faze letenja, dvojne stopnje, karkoli lahko tam programirate.

Pred kratkim sem našel lepo vadnico o tem, kako iz poceni Arduina, kot je Pro Micro, narediti vhodno napravo USB HID, in sicer igralno palico:

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

To bi omogočilo vse, kar je potrebno za nadzor letala / helikopterja / karkoli v FSX! Na voljo je veliko osi in gumbov.

Ker sem imel ravno rezervni JETI RSAT2, sem se odločil, da ga povežem z Arduinom in poskusim z knjižnico Joystick implementirati majhen razčlenjevalnik PPM.

Predvidevam, da kdo, ki sledi tem korakom, pozna povezovanje in programiranje Arduina. Za okvare ali poškodbe ne prevzemam nobenih garancij!

Zaloge

Boste potrebovali…

  • kateri koli Arduino, ki ga podpira knjižnica Joystick, sem uporabil Sparkfun Pro Micro 5V / 16 MHz
  • najnovejšo različico Arduino IDE
  • kateri koli RC sprejemnik, ki oddaja signal PPM, na primer JETI RSAT2
  • nekaj mostičnih žic (min. 3)
  • knjižnica Joystick, nameščena v Arduino IDE
  • knjižnica arduino-timer:

Korak: Povežite RX in Arduino

Povežite RX in Arduino
Povežite RX in Arduino
Povežite RX in Arduino
Povežite RX in Arduino

Ožičenje je precej preprosto. Odločil sem se, da bom Arduino napajal samo prek USB -ja, saj bo posnemal napravo Joystick. Ta bo Arduino napajal s 5V, ki se lahko uporablja tudi za napajanje RC sprejemnika.

Uporabil sem Pin VCC, ki zagotavlja reguliran izhod, in najbližji pin Gnd - samo povežite ga s priključki + in - PPM -jevim priključkom. Ko se Arduino napaja, se zdaj vklopi tudi sprejemnik.

Za signal PPM sem se odločil uporabiti prekinitve za njihovo razčlenitev. Na voljo so prekinitve npr. na Pin 3, zato ga samo povežite tam - na arduinu ni "izvornega RC zatiča", ampak morda več in različnih načinov branja signala sprejemnika.

Moral sem onemogočiti alarm napetosti RX, saj bo napetost VCC z napajanjem USB le okoli 4,5 V - vendar precej stabilna, tako da sploh ni težav.

2. korak: Pridobite nekaj signalov PPM

Pridobivanje nekaterih signalov PPM
Pridobivanje nekaterih signalov PPM
Pridobivanje nekaterih signalov PPM
Pridobivanje nekaterih signalov PPM

Ko je sprejemnik IN TX napajan, sem dobival PPM signale, kot je prikazano na sliki. 16 kanalov, ki se ponavljajo za vedno. Če je Failsafe na RSAT onemogočen in je oddajnik izklopljen, bo izhod PPM onemogočen.

Več informacij o PPM je na voljo tukaj:

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

Ker v tem primeru ne letim z resničnimi stvarmi, mi ni bilo mar za teoretične časovne razporeditve in sem na osciloskopu le ugotovil, kaj moj sprejemnik akutno oddaja pri premikanju palic od leve proti desni (standardne nastavitve v TX). Zdelo se je -100% ustreza impulzom dolžine 600 μs in +100% do 1600 μs. Prav tako mi ni bilo mar za dolžino prekinitvenih impulzov (400 μs) v moji kodi Arduino, vendar sem predpostavil razmik med okvirji min. 3000 µs.

3. korak: Konfiguriranje oddajnika

Konfiguriranje oddajnika
Konfiguriranje oddajnika
Konfiguriranje oddajnika
Konfiguriranje oddajnika
Konfiguriranje oddajnika
Konfiguriranje oddajnika

Ker je treba poznati le dejanski položaj krmilnih površin, zadostuje en kanal / "servo" na funkcijo daljinskega upravljalnika. Posledično je mogoče narediti precej preprosto nastavitev oddajnika - podobno kot pri običajnem modelu RC. Glavne funkcije krilca, dvigala, krmila in dušilke zahtevajo le en servo oziroma oddajniški kanal. Dodal sem tudi lopute, zavore in prestavo, tako da je do zdaj ostalo 9 kanalov brezplačnih. Upoštevajte, da so bile lopute postavljene v fazo letenja in se ne upravljajo neposredno s palico, drsnikom ali gumbom.

4. korak: Zaženite igralno palico

Zaženite igralno palico
Zaženite igralno palico
Zaženite igralno palico
Zaženite igralno palico

Knjižnica Joystick je precej enostavna za uporabo in ponuja nekaj primerov in testov. Koristno bi bilo najprej preveriti, ali je Arduino zaznana kot ustrezna igralna ročica, navodila, povezana v razdelku za vnos, in knjižnica sama nudijo nekaj dobrih smernic.

Na nadzorni plošči naprav in tiskalnikov je bil Arduino prikazan kot "Sparkfun Pro Micro", preskusno okno krmilne palice pa je prikazovalo 7 osi in veliko podprtih gumbov. Pri programiranju v Arduinu je mogoče uporabiti tudi stikalo za klobuk.

5. korak: Kodiranje Arduina

Kodiranje Arduina
Kodiranje Arduina
Kodiranje Arduina
Kodiranje Arduina

Manjka še samo razčlenitev signala PPM in dodelitev osi in gumbom krmilne ročice. Odločil sem se za naslednje kartiranje:

Dodelitev kanala / funkcije / igralne palice:

  1. Dušilec -> Os dušilke
  2. Aileron -> os X
  3. Dvigalo -> os Y
  4. Krmilo -> os X vrtenja
  5. Zavihki -> os vrtenja Y
  6. Zavora -> os Z
  7. Gear -> Gumb 0

Ko je prestava spuščena, je treba pritisniti prvi gumb igralne palice, ki se sprosti, ko dvignete prestavo. Vendar bo to zahtevalo FSUIPC za FSX, izven škatle bo FSX sprejel le gumb za preklop prestave, kar se pri mojih modelih ne dogaja ravno.

Svojo trenutno različico kode sem posredoval z veliko komentarji, kar mi deluje zelo dobro - spremenite svojo nalogo ali dodajte nove funkcije. Zadnjih 9 RC kanalov se trenutno ne uporablja.

Za nastavitev je treba razred Joystick inicializirati, v bistvu z opredelitvijo obsegov številskih osi:

/ * Nastavi obseg osi (določeno v glavi, 0 - 1000) */

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

Z uporabo vrednosti od 0 do 1000 je mogoče neposredno preslikati dolžino impulza (600 - 1600µs) na vrednosti krmilne palice brez spreminjanja velikosti.

DIN 3 je inicializiran kot digitalni vhod, omogočeno vlečenje in priključen prekinitev:

pinMode (PPM_PIN, INPUT_PULLUP);

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

Za namene odpravljanja napak sem v rednih intervalih z uporabo knjižnice arduino-timer dodajal nekaj izpisov prek vmesnika Serial:

če (SERIAL_PRINT_INTERVAL> 0) {

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

Prekinitev nožice bo poklicana vsakič, ko se spremeni logična vrednost zatiča, torej za vsak rob v signalu PPM. Dolžino impulza ovrednotite s preprostim merjenjem časa z uporabo mikroskopov ():

uint32_t curTime = mikros ();

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

Z oceno stanja trenutnega zatiča in njegovo kombinacijo z dolžino impulza in preteklimi impulzi je mogoče razvrstiti nove impulze. Naslednje pogojno bo zaznalo vrzel med okvirji:

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

Pri naslednjih impulzih se dolžina impulza preslika v stanje osi, tako da se dolžina impulza izreže in premakne tako, da se ujema z obsegom osi krmilne palice:

uint16_t rxLength = pulseLength;

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

Niz rxChannels sčasoma vsebuje 16 vrednosti od 0 - 1000, kar kaže na položaj palic / drsnikov in gumbov.

Po prejemu 16 kanalov se izvede preslikava na igralno palico:

/ * osi */

Joystick.setThrottle (kanali [0]); Joystick.setXAxis (kanali [1]); Joystick.setYAxis (1000 - kanalov [2]); Joystick.setRxAxis (kanali [3]); Joystick.setRyAxis (kanali [4]); Joystick.setZAxis (1000 - kanalov [5]); / * gumbi */ Joystick.setButton (0, (kanali [6] <500? 1: 0)); / * posodobite podatke prek USB */ Joystick.sendState ();

V kodi sem obrnil nekaj osi, kar ni nujno potrebno, saj lahko os obrnemo tudi s premikom smeri servo ali dodelitvijo v FSX. Odločil sem se, da bom ohranil servo smer in tudi prvotno dodelitev FSX.

Gumb se vklopi ali izklopi s pragom kanala 7.

In ne pozabite označiti razporejevalnika … v nasprotnem primeru odtisi za odpravljanje napak ne bodo vidni.

void loop () {

razporejevalnik.tick (); }

Na posnetku zaslona, ki sem ga priložil, vidite, da je bil kanal 1 premaknjen s 1000 (polni plin) na 0 (v prostem teku).

FSX bo zaznal Arduino tako kot katero koli drugo igralno palico, zato samo dodelite gumb in osi in se zabavajte pri vzletu!

Pri tem pristopu mi je zelo všeč, lahko uporabite oddajnik kot pri pravem modelu, npr. z uporabo faz letenja itd.

Priporočena: