Përmbajtje:

PPM në Joystick Converter bazuar në Arduino (JETI) për FSX: 5 hapa
PPM në Joystick Converter bazuar në Arduino (JETI) për FSX: 5 hapa
Anonim
Konvertuesi PPM në Joystick i bazuar në Arduino (JETI) për FSX
Konvertuesi PPM në Joystick i bazuar në Arduino (JETI) për FSX
Konvertuesi PPM në Joystick i bazuar në Arduino (JETI) për FSX
Konvertuesi PPM në Joystick i bazuar në Arduino (JETI) për FSX

Vendosa të kaloj transmetuesin tim JETI DC-16 nga Modaliteti 2 në Modalitetin 1, i cili në thelb kalon Throttle dhe Ashensor nga e majta në të djathtë dhe anasjelltas. Meqenëse nuk doja të rrëzoja një nga modelet e mia për shkak të një konfuzioni majtas/djathtas në trurin tim, po pyesja veten nëse është e mundur të praktikosh pak në FSX.

Kam lexuar dhe testuar transmetuesit JETI që në fakt mbështesin një mënyrë Joystick jashtë kutisë, megjithatë doja fleksibilitet të plotë për detyrat e akseve dhe çelsave dhe përdorja TX si me një model të vërtetë. Duke përdorur daljen e marrësit, është gjithashtu e mundur të shfrytëzoni përpunimin e sinjalit në DC-16 dhe të përdorni miksera, faza fluturimi, tarifa të dyfishta, gjithçka që mund të programoni atje.

Kohët e fundit gjeta një mësim të bukur se si të krijoni një pajisje hyrëse USB HID, domethënë një Joystick, nga një Arduino i lirë si një Pro Micro:

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

Kjo do të mundësonte gjithçka që nevojitej për të kontrolluar një aeroplan / helikopter / çfarëdo në FSX! Ka shumë akse dhe butona në dispozicion.

Meqenëse sapo kisha një JETI RSAT2 rezervë, vendosa ta lidh atë me Arduino dhe të përpiqem të zbatoj një analizues të vogël PPM së bashku me bibliotekën Joystick.

Supozoj se kushdo që ndjek këto hapa është i njohur me lidhjen dhe programimin e një Arduino. Unë nuk do të marr asnjë garanci për keqfunksionime ose dëmtime!

Furnizimet

Ju do të keni nevojë…

  • çdo Arduino i mbështetur nga biblioteka Joystick, kam përdorur një Sparkfun Pro Micro 5V / 16 MHz
  • një version i fundit i Arduino IDE
  • çdo marrës RC që nxjerr një sinjal PPM, si JETI RSAT2
  • disa tela kërcyes (min. 3)
  • biblioteka Joystick e instaluar në Arduino IDE
  • biblioteka arduino-timer:

Hapi 1: Lidhni RX dhe Arduino

Wire Up RX dhe Arduino
Wire Up RX dhe Arduino
Wire Up RX dhe Arduino
Wire Up RX dhe Arduino

Instalimet elektrike janë shumë të drejtpërdrejta. Unë vendosa ta furnizoj Arduino vetëm nga USB, pasi ai do të imitojë një pajisje Joystick. Kjo do të furnizojë Arduino me 5V, e cila mund të përdoret gjithashtu për të fuqizuar marrësin RC.

Kam përdorur Pin VCC, i cili siguron dalje të rregulluar, dhe pinin më të afërt Gnd - thjesht lidheni atë me lidhësin + dhe - të PPM të PPM. Kur Arduino fuqizohet, edhe marrësi tani po ndizet.

Për sinjalin PPM, vendosa të përdor ndërprerje për t'i analizuar ato. Ndërprerjet janë në dispozicion p.sh. në Pin 3, kështu që thjesht lidheni atje - nuk ka "pin RC amtare" në arduino, por ndoshta më shumë dhe mënyra të ndryshme për të lexuar në sinjalin e marrësit.

Më duhej të çaktivizoja alarmin e tensionit RX, pasi voltazhi VCC me furnizim USB do të jetë vetëm rreth 4.5V - por mjaft i qëndrueshëm, kështu që nuk ka fare problem.

Hapi 2: Marrja e disa sinjaleve PPM

Marrja e disa sinjaleve PPM
Marrja e disa sinjaleve PPM
Marrja e disa sinjaleve PPM
Marrja e disa sinjaleve PPM

Kur marrësi DHE TX është mundësuar, unë po merrja sinjale PPM siç tregohet në imazh. 16 kanale, të përsëritura përgjithmonë. Nëse Failsafe në RSAT është i çaktivizuar dhe transmetuesi fiket, dalja PPM do të çaktivizohet.

Më shumë informacion mbi PPM janë në dispozicion këtu:

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

Meqenëse nuk po fluturoj me sende të vërteta në këtë rast, nuk më interesoi koha teorike dhe thjesht kuptova në oshiloskop atë që marrësi im po nxirrte në mënyrë akute kur lëviz shkopinjtë nga e majta në të djathtë plotësisht (cilësimet standarde në TX) Me Dukej -100% korrespondon me pulsimet me një gjatësi prej 600µs, dhe +100% deri në 1600µs. Unë gjithashtu nuk u kujdesa për gjatësinë e pulseve të pauzës (400µs) në kodin tim Arduino, por supozova një distancë kornizë prej min. 3000μs

Hapi 3: Konfigurimi i Transmetuesit

Konfigurimi i transmetuesit
Konfigurimi i transmetuesit
Konfigurimi i transmetuesit
Konfigurimi i transmetuesit
Konfigurimi i transmetuesit
Konfigurimi i transmetuesit

Meqenëse vetëm pozicioni aktual i sipërfaqeve të kontrollit duhet të dihet, një kanal / "servo" për funksionin RC është i mjaftueshëm. Rrjedhimisht, mund të bëhet një konfigurim mjaft i thjeshtë i transmetuesit - i ngjashëm me një model normal RC. Funksionet kryesore aileron, ashensor, timon dhe mbytje secila kërkon vetëm një servo përkatësisht kanal transmetues. Unë gjithashtu shtova përplasje, frena dhe ingranazhe, duke lënë 9 kanale të lira deri më tani. Ju lutemi vini re se Flaps janë vënë në një fazë fluturimi dhe nuk kontrollohen drejtpërdrejt përmes një shkopi, rrëshqitësi ose butoni.

Hapi 4: Drejtimi i Joystick

Drejtimi i Joystick
Drejtimi i Joystick
Drejtimi i Joystick
Drejtimi i Joystick

Biblioteka Joystick është mjaft e lehtë për t’u përdorur dhe ofron disa shembuj dhe teste. Duhet të jetë e dobishme që së pari të kontrolloni nëse Arduino është zbuluar si Joystick i duhur, udhëzimet e lidhura në pjesën e hyrjes dhe vetë biblioteka japin disa udhëzime të mira.

Në panelin e kontrollit Pajisjet dhe Printerët, Arduino po shfaqej si "Sparkfun Pro Micro", dhe dritarja e provës së levës tregonte 7 akse dhe shumë butona të mbështetur. Edhe një ndërprerës i kapelës mund të përdoret kur programohet në Arduino.

Hapi 5: Kodimi i Arduino

Kodimi i Arduino
Kodimi i Arduino
Kodimi i Arduino
Kodimi i Arduino

Ajo që ende mungon është analizimi aktual i sinjalit PPM dhe caktimi i akseve dhe butonave të Joystick. Vendosa për hartën e mëposhtme:

Kanali / Funksioni / Caktimi i xhojstikut:

  1. Mbyt -> Boshti i mbytjes
  2. Aileron -> boshti X
  3. Ashensor -> boshti Y
  4. Drejtues -> boshti i rrotullimit X
  5. Flaps -> Boshti i rrotullimit Y
  6. Frena -> boshti Z
  7. Gear -> Butoni 0

Kur ingranazhi është ulur, butoni i parë i Joystick do të shtypet dhe do të lëshohet kur ngrini ingranazhin. Sidoqoftë, kjo do të kërkojë FSUIPC për FSX, jashtë kutisë, FSX do të pranojë vetëm një buton për ndërrimin e ingranazheve, gjë që nuk është saktësisht ajo që po ndodh me modelet e mia.

I ofrova versionin tim aktual të kodit me shumë komente, i cili po funksionon mjaft mirë për mua - mos ngurroni të ndryshoni detyrën tuaj ose të shtoni funksione të reja. 9 kanalet e fundit RC aktualisht nuk përdoren.

Për konfigurimin, klasa Joystick duhet të inicializohet, në thelb duke përcaktuar vargjet e boshtit numerik:

/ * Vendosni diapazonin e akseve (të përcaktuara në kokë, 0 - 1000) */

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

Duke përdorur vlerat nga 0 në 1000, është e mundur që të hartohet drejtpërdrejt gjatësia e pulsit (600 - 1600µs) në vlerat e levës pa rishpallje.

DIN 3 është inicializuar si hyrje dixhitale, tërheqjet e aktivizuara dhe një ndërprerje e bashkangjitur:

pinMode (PPM_PIN, INPUT_PULLUP);

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

Për qëllime të korrigjimit, shtova disa printime përmes ndërfaqes Seriale në intervale të rregullta, duke përdorur bibliotekën arduino-timer:

nëse (SERIAL_PRINT_INTERVAL> 0) {

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

Ndërprerja e kunjit do të thirret sa herë që vlera logjike e kunjit ka ndryshuar, kështu për secilën anë në sinjalin PPM. Vlerësoni gjatësinë e pulsit vetëm me një kohë të thjeshtë duke përdorur mikro ():

uint32_t curTime = mikros ();

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

Duke vlerësuar gjendjen e kunjit aktual dhe duke e kombinuar atë me gjatësinë e pulsit dhe impulset e kaluara, impulset e reja mund të klasifikohen. Me kushtin e mëposhtëm do të zbulohet hendeku ndërkufitar:

nëse (shteti i fundit == 0 && puls Gjatësia> 3000 && puls Gjatësia <6000)

Për impulset e mëvonshme, gjatësia e pulsit do të hartohet në një gjendje boshti duke prerë dhe paragjykuar gjatësinë e pulsit që të përputhet me gamën e boshtit të levës:

uint16_t rxLength = impulsLength;

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

Grupi rxChannels përfundimisht përmban 16 vlera nga 0 - 1000, duke treguar pozicionet e shkopit / rrëshqitësit dhe butonit.

Pas marrjes së 16 kanaleve, hartimi në Joystick kryhet:

/ * akset */

Joystick.setThrottle (kanalet [0]); Joystick.setXAxis (kanalet [1]); Joystick.setYAxis (1000 - kanale [2]); Joystick.setRxAxis (kanalet [3]); Joystick.setRyAxis (kanalet [4]); Joystick.setZAxis (1000 - kanale [5]); / * buttons */ Joystick.setButton (0, (kanalet [6] <500? 1: 0)); / * përditësoni të dhënat përmes USB */ Joystick.sendState ();

Unë përmbysa disa akse në kod, i cili nuk është absolutisht i nevojshëm, pasi boshti gjithashtu mund të përmbyset duke rrotulluar drejtimin e shërbimit ose caktimin në FSX. Sidoqoftë, vendosa të mbaj udhëzimet servo dhe gjithashtu caktimin origjinal të FSX.

Butoni ndizet ose fiket nga kanali i pragut 7.

Dhe mos harroni të shënoni programuesin … përndryshe, asnjë printim debug nuk do të jetë i dukshëm.

lak void () {

scheduler.tick (); }

Në pamjen e ekranit që kam bashkangjitur mund të shihni, kanali 1 u zhvendos nga 1000 (mbytje e plotë) në 0 (i papunë).

FSX do të zbulojë Arduino ashtu si çdo Xhojstik tjetër, kështu që thjesht caktoni butonin dhe akset dhe argëtohuni duke u ngritur!

Ajo që më pëlqen vërtet në këtë qasje është, ju thjesht mund të përdorni transmetuesin tuaj si me një model të vërtetë, p.sh. duke përdorur fazat e fluturimit etj.

Recommended: