Talaan ng mga Nilalaman:

Batay sa Arduino (JETI) PPM sa USB Joystick Converter para sa FSX: 5 Mga Hakbang
Batay sa Arduino (JETI) PPM sa USB Joystick Converter para sa FSX: 5 Mga Hakbang

Video: Batay sa Arduino (JETI) PPM sa USB Joystick Converter para sa FSX: 5 Mga Hakbang

Video: Batay sa Arduino (JETI) PPM sa USB Joystick Converter para sa FSX: 5 Mga Hakbang
Video: Lesson 99: Building Arduino Digital Clock using DS3231 LCD and Seven Segment Display 2024, Nobyembre
Anonim
Batay sa Arduino (JETI) PPM sa USB Joystick Converter para sa FSX
Batay sa Arduino (JETI) PPM sa USB Joystick Converter para sa FSX
Batay sa Arduino (JETI) PPM sa USB Joystick Converter para sa FSX
Batay sa Arduino (JETI) PPM sa USB Joystick Converter para sa FSX

Napagpasyahan kong ilipat ang aking transmiter ng JETI DC-16 mula sa Mode 2 hanggang sa Mode 1, na karaniwang pinalilipat ang Throttle at Elevator mula kaliwa hanggang kanan at kabaliktaran. Dahil hindi ko nais na mag-crash ng isa sa aking mga modelo dahil sa ilang kaliwa / kanang pagkalito sa aking utak, iniisip ko kung posible na magsanay ng kaunti sa FSX.

Nabasa at nasubukan ko ang mga JETI transmitter na aktwal na sumusuporta sa isang mode ng Joystick sa labas ng kahon, subalit nais ko ang buong kakayahang umangkop para sa mga palakol at lumipat ng mga takdang-aralin at gamitin ang TX na may isang tunay na modelo. Sa pamamagitan ng paggamit ng output ng tatanggap, posible ring magamit ang pagproseso ng signal sa DC-16 at gamitin ang mga mixer, flight phase, dual rate, kung ano ang maaari mong mai-program doon.

Kamakailan lamang natagpuan ko ang isang magandang tutorial sa kung paano gumawa ng isang USB HID input device, katulad ng isang Joystick, mula sa isang murang Arduino tulad ng isang Pro Micro:

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

Paganahin nito ang lahat ng kinakailangan upang makontrol ang isang eroplano / helikopter / anupaman sa FSX! Maraming mga palakol at mga pindutan na magagamit.

Dahil mayroon lamang akong ekstrang JETI RSAT2, nagpasya akong i-wire ito sa Arduino at subukang ipatupad ang isang maliit na parser ng PPM kasama ang library ng Joystick.

Ipinapalagay kong sinumang sumusunod sa mga hakbang na ito ay pamilyar sa pagkonekta at pagprograma ng isang Arduino. Hindi ako kukuha ng anumang mga garantiya para sa mga madepektong paggawa o pinsala!

Mga gamit

Kakailanganin mong…

  • anumang Arduino na suportado ng Joystick library, gumamit ako ng Sparkfun Pro Micro 5V / 16 MHz
  • isang kamakailang bersyon ng Arduino IDE
  • anumang RC receiver na naglalabas ng isang senyas ng PPM, tulad ng JETI RSAT2
  • ilang mga wire ng lumulukso (min. 3)
  • ang library ng Joystick ay naka-install sa Arduino IDE
  • ang arduino-timer library:

Hakbang 1: Wire Up ang RX at ang Arduino

Wire Up ang RX at ang Arduino
Wire Up ang RX at ang Arduino
Wire Up ang RX at ang Arduino
Wire Up ang RX at ang Arduino

Ang mga kable ay medyo prangka. Napagpasyahan kong i-power lang ang Arduino mula sa USB, dahil tutulad ito sa isang aparato ng Joystick. Ibibigay nito ang Arduino ng 5V, na maaaring magamit din para sa pag-power ng RC receiver.

Ginamit ko ang Pin VCC, na nagbibigay ng kinokontrol na output, at ang pinakamalapit na pin ng Gnd - ikonekta lamang ito sa konektor + at - mga pin ng PPM. Kapag ang Arduino ay pinalakas, ang tatanggap ay nagpapalakas din ngayon.

Para sa signal ng PPM, nagpasya akong gumamit ng mga interrupts upang ma-parse ang mga ito. Magagamit ang mga pagkagambala hal. sa Pin 3, kaya't ikonekta lamang ito doon - walang "katutubong RC pin" sa arduino, ngunit posibleng higit pa at iba't ibang mga paraan upang mabasa sa signal ng receiver.

Kailangan kong huwag paganahin ang alarma ng RX boltahe, dahil ang boltahe ng VCC na may suplay ng USB ay nasa paligid ng 4.5V lamang - ngunit medyo matatag, kaya't wala talagang problema.

Hakbang 2: Pagkuha ng Ilang Mga Signal ng PPM

Pagkuha ng Ilang Mga Signal ng PPM
Pagkuha ng Ilang Mga Signal ng PPM
Pagkuha ng Ilang Mga Signal ng PPM
Pagkuha ng Ilang Mga Signal ng PPM

Kapag ang tagatanggap AT ang TX ay pinalakas, nakakakuha ako ng mga signal ng PPM tulad ng ipinakita sa imahe. 16 na mga channel, paulit-ulit na magpakailanman. Kung ang Failsafe sa RSAT ay hindi pinagana at ang transmitter ay pinapatay, ang output ng PPM ay hindi pagaganahin.

Ang karagdagang impormasyon tungkol sa PPM ay magagamit dito:

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

Dahil hindi ako lumilipad ng mga totoong bagay sa kasong ito, wala akong pakialam sa mga oras ng teoretikal at naisip ko lamang sa oscilloscope kung ano ang Acutally outputting ng aking tatanggap kapag inililipat ang mga stick mula sa ganap na kaliwa patungo sa buong kanan (karaniwang mga setting sa TX). Tila -100% ay tumutugma sa mga pulso na may haba na 600µs, at + 100% hanggang 1600µs. Hindi ko rin alintana ang haba ng mga pause ng pause (400µs) sa aking Arduino code, ngunit ipinalagay ko ang isang spacing ng frame na min. 3000µs

Hakbang 3: Pag-configure ng Transmitter

Pag-configure ng Transmitter
Pag-configure ng Transmitter
Pag-configure ng Transmitter
Pag-configure ng Transmitter
Pag-configure ng Transmitter
Pag-configure ng Transmitter

Dahil ang aktwal na posisyon lamang ng mga kontrol sa ibabaw ay kailangang malaman, isang channel / "servo" bawat pag-andar ng RC ay sapat. Dahil dito, maaaring magawa ang isang simpleng setup ng transmiter - katulad ng isang normal na modelo ng RC. Ang pangunahing pagpapaandar aileron, elevator, timon at throttle bawat isa ay nangangailangan lamang ng isang servo ayon sa pagkakabanggit transmiter channel. Nagdagdag din ako ng mga flap, preno at gamit, naiwan nang libre ang 9 na mga channel sa ngayon. Mangyaring tandaan na ang Flaps ay inilagay sa isang yugto ng paglipad, at hindi kontrolado nang direkta sa pamamagitan ng isang stick, slider o pindutan.

Hakbang 4: Pagpapatakbo ng Joystick

Pagpapatakbo ng Joystick
Pagpapatakbo ng Joystick
Pagpapatakbo ng Joystick
Pagpapatakbo ng Joystick

Ang library ng Joystick ay medyo madaling gamitin, at nagbibigay ng ilang mga halimbawa at pagsubok. Dapat maging kapaki-pakinabang upang suriin muna kung ang Arduino ay napansin bilang wastong Joystick, ang mga tagubiling naka-link sa seksyon ng pagpasok at ang silid-aklatan mismo ay nagbibigay ng ilang mabuting patnubay.

Sa control panel ng Mga Device at Printer, ang Arduino ay ipinapakita bilang "Sparkfun Pro Micro", at ang window ng pagsubok ng Joystick ay nagpapakita ng 7 palakol at maraming mga sinusuportahang pindutan. Kahit na ang isang switch ng sumbrero ay maaaring magamit kapag naka-program sa Arduino.

Hakbang 5: Pag-coding ng Arduino

Coding ang Arduino
Coding ang Arduino
Coding ang Arduino
Coding ang Arduino

Ang kulang pa rin ay ang aktwal na pag-parse ng signal ng PPM at pagtatalaga sa mga axic at button ng Joystick. Nagpasya ako para sa sumusunod na pagmamapa:

Pagtatalaga ng Channel / Function / Joystick:

  1. Throttle -> Throttle axis
  2. Aileron -> X axis
  3. Elevator -> Y axis
  4. Rudder -> X rotation axis
  5. Flaps -> Y rotation axis
  6. Preno -> Z axis
  7. Gear -> Button 0

Kapag ang gear ay nakabukas, ang unang pindutan ng Joystick ay pipilitin at ilalabas kapag tinaas ang gear. Gayunpaman, mangangailangan ito ng FSUIPC para sa FSX, sa labas ng kahon, tatanggapin lamang ng FSX ang isang pindutan para sa pag-toggle ng gear, na hindi eksakto kung ano ang nangyayari sa aking mga modelo.

Ibinigay ko ang aking kasalukuyang bersyon ng code na may maraming mga puna, na gumagana nang maayos para sa akin - huwag mag-atubiling baguhin ang iyong takdang-aralin o magdagdag ng mga bagong pag-andar. Ang huling 9 na mga channel ng RC ay kasalukuyang hindi ginagamit.

Para sa pag-setup, ang klase ng Joystick ay kailangang gawing pauna, karaniwang sa pamamagitan ng pagtukoy sa mga saklaw ng mga numero ng axis:

/ * Itakda ang saklaw ng mga palakol (tinukoy sa header, 0 - 1000) * /

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

Sa pamamagitan ng paggamit ng mga halaga mula 0 hanggang 1000, posible na direktang mapa ang haba ng pulso (600 - 1600µs) sa mga halaga ng joystick nang hindi nag-aalis.

Ang DIN 3 ay pinasimulan bilang digital input, pinagana ang mga pullup, at isang nakakagambalang nakakabit:

pinMode (PPM_PIN, INPUT_PULLUP);

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

Para sa mga layuning pag-debug, nagdagdag ako ng ilang mga printout sa pamamagitan ng Serial interface sa mga regular na agwat, gamit ang arduino-timer library:

kung (SERIAL_PRINT_INTERVAL> 0) {

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

Ang pagkagambala ng pin ay tatawagan tuwing ang lohikal na halaga ng pin ay nagbago, kaya para sa bawat gilid sa signal ng PPM. Suriin ang haba ng pulso sa pamamagitan lamang ng simpleng tiyempo gamit ang micros ():

uint32_t curTime = micros ();

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

Sa pamamagitan ng pagsusuri ng estado ng kasalukuyang pin at pagsasama-sama nito sa haba ng pulso at mga nakaraang pulso, maaaring maiuri ang mga bagong pulso. Ang sumusunod na may kundisyon ay makakakita ng agwat ng interframe:

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

Para sa kasunod na mga pulso, ang haba ng pulso ay mai-map sa isang estado ng axis sa pamamagitan ng pag-clipping at bias ng haba ng pulso upang tumugma sa saklaw ng axis ng joystick:

uint16_t rxLength = pulseLength;

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

Ang rxChannels array sa kalaunan ay naglalaman ng 16 na halaga mula 0 - 1000, na nagpapahiwatig ng mga posisyon ng stick / slider at button.

Matapos makatanggap ng 16 na mga channel, isinasagawa ang pagmamapa sa Joystick:

/ * axes * /

Joystick.setThrottle (mga channel [0]); Joystick.setXAxis (mga channel [1]); Joystick.setYAxis (1000 - mga channel [2]); Joystick.setRxAxis (mga channel [3]); Joystick.setRyAxis (mga channel [4]); Joystick.setZAxis (1000 - mga channel [5]); / * mga pindutan * / Joystick.set Button (0, (mga channel [6] <500? 1: 0)); / * i-update ang data sa pamamagitan ng USB * / Joystick.sendState ();

Inverted ko ang ilang mga palakol sa code, na kung saan ay hindi absolutey kinakailangan, dahil ang axis ay maaari ding baligtarin sa pamamagitan ng pag-flip ng direksyon ng servo o ang pagtatalaga sa FSX. Gayunpaman, nagpasya akong panatilihin ang mga direksyon ng servo at pati na rin ang orihinal na takdang-aralin sa FSX.

Ang pindutan ay nakabukas o naka-off sa pamamagitan ng thresholding channel 7.

At huwag kalimutan na lagyan ng tsek ang tagapag-iskedyul … kung hindi man, walang mga debug print na makikita.

void loop () {

scheduler.tick (); }

Sa screenshot na na-attach ko makikita mo, ang channel 1 ay inilipat mula 1000 (buong throttle) sa 0 (idle).

Madiskubre ng FSX ang Arduino tulad ng anumang iba pang Joystick, kaya't italaga lamang ang pindutan at mga palakol at magsaya sa pag-alis!

Ang talagang gusto ko tungkol sa pamamaraang ito ay, maaari mo lamang gamitin ang iyong transmitter na may isang tunay na modelo, hal. gamit ang mga flight phase atbp.

Inirerekumendang: