Sisällysluettelo:

Arduino -pohjainen (JETI) PPM -USB -joystick -muunnin FSX: 5 askelta
Arduino -pohjainen (JETI) PPM -USB -joystick -muunnin FSX: 5 askelta

Video: Arduino -pohjainen (JETI) PPM -USB -joystick -muunnin FSX: 5 askelta

Video: Arduino -pohjainen (JETI) PPM -USB -joystick -muunnin FSX: 5 askelta
Video: Jeti - connecting two receivers with an R rx as primary, using PPM 2024, Heinäkuu
Anonim
Arduino -pohjainen (JETI) PPM -USB -joystick -muunnin FSX: lle
Arduino -pohjainen (JETI) PPM -USB -joystick -muunnin FSX: lle
Arduino -pohjainen (JETI) PPM -USB -joystick -muunnin FSX: lle
Arduino -pohjainen (JETI) PPM -USB -joystick -muunnin FSX: lle

Päätin vaihtaa JETI DC-16 -lähettimeni tilasta 2 tilaan 1, joka periaatteessa vaihtaa kaasun ja hissin vasemmalta oikealle ja päinvastoin. Koska en halunnut kaataa yhtä malleistani aivoni vasemman/oikean sekaannuksen vuoksi, mietin, onko mahdollista harjoitella hieman FSX: ssä.

Luin ja testasin, että JETI -lähettimet todella tukevat joystick -tilaa pakkauksesta, mutta halusin täyden joustavuuden akseleihin ja kytkimiin ja käyttää TX: tä kuten todellisessa mallissa. Käyttämällä vastaanottimen lähtöä on myös mahdollista hyödyntää DC-16: n signaalinkäsittelyä ja käyttää sekoittimia, lentovaiheita, kaksoisnopeuksia, mitä tahansa ohjelmoida siellä.

Äskettäin löysin mukavan opetusohjelman siitä, kuinka tehdä USB HID -laite, nimittäin ohjaussauva, halvasta Arduinosta, kuten Pro Micro:

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

Tämä mahdollistaisi kaiken tarvittavan lentokoneen / helikopterin tai mitä tahansa FSX: n ohjaamiseen! Paljon akseleita ja painikkeita.

Koska minulla oli juuri ylimääräinen JETI RSAT2, päätin yhdistää sen Arduinon kanssa ja yrittää ottaa käyttöön pienen PPM -jäsennyksen Joystick -kirjaston kanssa.

Oletan, että joku, joka seuraa näitä vaiheita, tuntee Arduinon yhdistämisen ja ohjelmoinnin. En ota vastuuta toimintahäiriöistä tai vahingoista!

Tarvikkeet

Tarvitset…

  • mitä tahansa Arduinoa, jota Joystick -kirjasto tukee, käytin Sparkfun Pro Micro 5V / 16 MHz
  • Arduino IDE: n uusin versio
  • mikä tahansa RC -vastaanotin, joka lähettää PPM -signaalin, kuten JETI RSAT2
  • muutama hyppyjohdin (min. 3)
  • joystick -kirjasto, joka on asennettu Arduino IDE: hen
  • arduino-ajastinkirjasto:

Vaihe 1: Yhdistä RX ja Arduino

Yhdistä RX ja Arduino
Yhdistä RX ja Arduino
Yhdistä RX ja Arduino
Yhdistä RX ja Arduino

Johdotus on melko suoraviivaista. Päätin käyttää Arduinoa vain USB: stä, koska se jäljittelee ohjaussauvaa. Tämä syöttää Arduinolle 5 V: n jännitteen, jota voidaan käyttää myös RC -vastaanottimen virransyöttöön.

Käytin Pin VCC: tä, joka tarjoaa säädetyn lähdön, ja lähimmän Gnd -nastan - liitä se vain PPM: n liittimeen + ja - nastat. Kun Arduino saa virtaa, myös vastaanotin käynnistyy.

PPM -signaalin osalta päätin käyttää keskeytyksiä jäsentämään ne. Keskeytyksiä on saatavilla mm. nasta 3, joten kytke se vain sinne - arduinossa ei ole "alkuperäistä RC -nastaista", mutta mahdollisesti enemmän ja erilaisia tapoja lukea vastaanottimen signaali.

Minun oli poistettava RX -jännitehälytys käytöstä, koska VCC -jännite USB -liitännällä on vain noin 4,5 V - mutta melko vakaa, joten ei mitään ongelmaa.

Vaihe 2: Hanki joitain PPM -signaaleja

Jotkut PPM -signaalit
Jotkut PPM -signaalit
Jotkut PPM -signaalit
Jotkut PPM -signaalit

Kun vastaanotin JA TX on päällä, sain PPM -signaaleja, kuten kuvassa näkyy. 16 kanavaa, toistetaan ikuisesti. Jos RSAT -järjestelmän vikasuojaus on poistettu käytöstä ja lähetin on sammutettu, PPM -lähtö poistetaan käytöstä.

Lisätietoja PPM: stä löytyy täältä:

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

Koska en lentä todellista tavaraa tässä tapauksessa, en välittänyt teoreettisista ajoituksista ja tajusin vain oskilloskoopilla, mitä vastaanottimeni lähetti, kun tikkuja siirrettiin täysin vasemmalta oikealle (TX: n vakioasetukset). Näytti siltä, että -100% vastaa pulsseja, joiden pituus on 600 µs, ja +100% -1600 µs. En myöskään välittänyt taukopulssien pituudesta (400 µs) Arduino -koodissani, mutta oletin, että kehysväli on min. 3000 µs.

Vaihe 3: Lähettimen asetukset

Lähettimen määrittäminen
Lähettimen määrittäminen
Lähettimen määrittäminen
Lähettimen määrittäminen
Lähettimen määrittäminen
Lähettimen määrittäminen

Koska vain ohjauspintojen todellinen sijainti on tiedettävä, yksi kanava / "servo" per RC -toiminto riittää. Näin ollen voidaan tehdä melko yksinkertainen lähettimen asennus - samanlainen kuin tavallinen RC -malli. Päätoiminnot siipi, hissi, peräsin ja kaasu edellyttävät vain yhtä servoa vastaavasti lähettimen kanavaa. Lisäsin myös läppiä, jarruja ja vaihteita jättäen tähän mennessä yhdeksän kanavaa vapaaksi. Huomaa, että läpät asetettiin lentovaiheeseen, eikä niitä ohjata suoraan tikulla, liukusäätimellä tai painikkeella.

Vaihe 4: Ohjaussauvan käyttäminen

Ohjaussauvan käyttäminen
Ohjaussauvan käyttäminen
Ohjaussauvan käyttäminen
Ohjaussauvan käyttäminen

Joystick -kirjasto on melko helppokäyttöinen, ja se sisältää esimerkkejä ja testejä. Olisi hyödyllistä tarkistaa ensin, onko Arduino todettu oikeaksi joystickiksi, onko syöttöosioon linkitetyt ohjeet ja kirjasto itse hyviä ohjeita.

Laitteiden ja tulostimien ohjauspaneelissa Arduino näytettiin nimellä "Sparkfun Pro Micro", ja joystickin testiikkuna näytti 7 akselia ja runsaasti tuettuja painikkeita. Jopa hattokytkintä voidaan käyttää, kun se on ohjelmoitu Arduinossa.

Vaihe 5: Arduinon koodaus

Arduinon koodaus
Arduinon koodaus
Arduinon koodaus
Arduinon koodaus

Vielä puuttuu PPM -signaalin varsinainen jäsentäminen ja kohdistaminen ohjaussauvan akseleille ja painikkeille. Päätin seuraavan kartoituksen:

Kanava / toiminto / ohjaussauva:

  1. Kaasu -> Kaasun akseli
  2. Siipi -> X -akseli
  3. Hissi -> Y -akseli
  4. Peräsimet -> X pyörimisakseli
  5. Läpät -> Y -kiertoakseli
  6. Jarru -> Z -akseli
  7. Vaihde -> Painike 0

Kun vaihde on alhaalla, ohjaussauvan ensimmäistä painiketta on painettava ja se vapautetaan vaihdetta nostettaessa. Tämä vaatii kuitenkin FSUIPC for FSX: n.

Annoin koodin nykyiselle versiolleni paljon kommentteja, mikä toimii minulle varsin hyvin - voit muuttaa tehtävääsi tai lisätä uusia toimintoja. Viimeiset 9 RC -kanavaa eivät ole tällä hetkellä käytössä.

Asennusta varten Joystick -luokka on alustettava, pohjimmiltaan määrittämällä numeeriset akselialueet:

/ * Aseta akselialue (määritetty otsikossa, 0-1000) */

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

Käyttämällä arvoja 0-1000 on mahdollista yhdistää pulssin pituus (600 - 1600µs) suoraan ohjaussauvan arvoihin ilman skaalausta.

DIN 3 alustetaan digitaalitulona, pullupit käytössä ja keskeytys liitettynä:

pinMode (PPM_PIN, INPUT_PULLUP);

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

Virheenkorjausta varten lisäsin joitain tulosteita sarjaliittymän kautta säännöllisin väliajoin käyttämällä arduino-ajastinkirjastoa:

jos (SERIAL_PRINT_INTERVAL> 0) {

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

Tapin keskeytys kutsutaan aina, kun nastan looginen arvo on muuttunut, eli jokaisen PPM -signaalin reunan osalta. Arvioi pulssin pituus yksinkertaisella ajoituksella käyttäen micros ():

uint32_t curTime = micros ();

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

Arvioimalla nykyisen nastan tila ja yhdistämällä se pulssin pituuteen ja aiempiin pulsseihin, uudet pulssit voidaan luokitella. Seuraava ehdollinen tunnistaa kehysten välisen aukon:

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

Seuraavia pulsseja varten pulssin pituus kartoitetaan akselitilaan leikkaamalla ja esijännittämällä pulssin pituus ohjaussauvan akselialueeseen sopivaksi:

uint16_t rxLength = pulseLength;

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

RxChannels -taulukko sisältää lopulta 16 arvoa 0-1000, jotka osoittavat tikun / liukusäätimen ja painikkeen sijainnin.

16 kanavan vastaanottamisen jälkeen kartoitetaan ohjaussauvaan:

/ * akselit */

Joystick.setThrottle (kanavat [0]); Joystick.setXAxis (kanavat [1]); Joystick.setYAxis (1000 kanavaa [2]); Joystick.setRxAxis (kanavat [3]); Joystick.setRyAxis (kanavat [4]); Joystick.setZAxis (1000 kanavaa [5]); / * -painikkeet */ Joystick.setButton (0, (kanavat [6] <500? 1: 0)); / * päivitä tiedot USB: n kautta */ Joystick.sendState ();

Käänsin joitain akseleita koodissa, mikä ei ole ehdottoman välttämätöntä, koska akseli voidaan kääntää myös kääntämällä servosuuntaa tai FSX: n osoittamista. Päätin kuitenkin säilyttää servo -ohjeet ja myös alkuperäisen FSX -tehtävän.

Painike kytketään päälle tai pois päältä rajaamalla kanava 7.

Älä myöskään unohda rastittaa ajoitinta… muuten virheenkorjausjälkiä ei näy.

void loop () {

ajastin.tick (); }

Liitetyssä kuvakaappauksessa näet, että kanava 1 siirrettiin 1000: sta (täyskaasu) 0: een (tyhjäkäynti).

FSX tunnistaa Arduinon aivan kuten mikä tahansa muu ohjaussauva, joten määritä vain painike ja akselit ja pidä hauskaa nousussa!

Pidän todella tästä lähestymistavasta, voit käyttää lähetintäsi kuten todellisessa mallissa, esim. käyttämällä lentovaiheita jne.

Suositeltava: