Innholdsfortegnelse:

Arduino -basert (JETI) PPM til USB -joystick -omformer for FSX: 5 trinn
Arduino -basert (JETI) PPM til USB -joystick -omformer for FSX: 5 trinn

Video: Arduino -basert (JETI) PPM til USB -joystick -omformer for FSX: 5 trinn

Video: Arduino -basert (JETI) PPM til USB -joystick -omformer for FSX: 5 trinn
Video: Extract GPS location in Arduino with Ublox Neo-6 and Neo 7m GPS modules 2024, Juli
Anonim
Arduino -basert (JETI) PPM til USB -joystick -omformer for FSX
Arduino -basert (JETI) PPM til USB -joystick -omformer for FSX
Arduino -basert (JETI) PPM til USB -joystick -omformer for FSX
Arduino -basert (JETI) PPM til USB -joystick -omformer for FSX

Jeg bestemte meg for å bytte JETI DC-16-sender fra modus 2 til modus 1, som i utgangspunktet bytter gass og heis fra venstre til høyre og omvendt. Siden jeg ikke ønsket å krasje en av modellene mine på grunn av litt venstre/høyre forvirring i hjernen min, lurte jeg på om det er mulig å øve litt på FSX.

Jeg leste og testet JETI -senderne støtter faktisk en joystick -modus ut av esken, men jeg ønsket full fleksibilitet for aksene og bryteroppgavene og brukte TX som med en ekte modell. Ved å bruke mottakerens utgang er det også mulig å utnytte signalbehandlingen i DC-16 og bruke miksere, flyfaser, doble hastigheter, alt du kan programmere der.

Nylig fant jeg en fin opplæring om hvordan du lager en USB HID -inngangsenhet, nemlig en joystick, fra en billig Arduino som en Pro Micro:

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

Dette vil gjøre alt som trengs for å kontrollere et fly / helikopter / hva som helst i FSX! Mange akser og knapper tilgjengelig.

Siden jeg nettopp hadde en ekstra JETI RSAT2, bestemte jeg meg for å koble den til Arduino og prøve å implementere en liten PPM -parser sammen med joystick -biblioteket.

Jeg antar at alle som følger disse trinnene er kjent med å koble til og programmere en Arduino. Jeg vil ikke ta noen garantier for funksjonsfeil eller skader!

Rekvisita

Du vil trenge…

  • enhver Arduino som støttes av joystick -biblioteket, brukte jeg en Sparkfun Pro Micro 5V / 16 MHz
  • en fersk versjon av Arduino IDE
  • enhver RC -mottaker som sender ut et PPM -signal, som JETI RSAT2
  • noen hoppetråder (min. 3)
  • joystick -biblioteket installert i Arduino IDE
  • arduino-timer-biblioteket:

Trinn 1: Koble opp RX og Arduino

Koble opp RX og Arduino
Koble opp RX og Arduino
Koble opp RX og Arduino
Koble opp RX og Arduino

Ledningene er ganske enkle. Jeg bestemte meg for å bare koble Arduino fra USB, siden den skal etterligne en joystick -enhet. Dette vil forsyne Arduino med 5V, som også kan brukes til å drive RC -mottakeren.

Jeg brukte Pin VCC, som gir regulert utgang, og nærmeste Gnd -pin - bare koble den til PPM -kontakten + og - pins. Når Arduino får strøm, starter mottakeren nå også.

For PPM -signalet bestemte jeg meg for å bruke avbrudd for å analysere dem. Avbrudd er tilgjengelig f.eks. på Pin 3, så det er bare å koble den til det - det er ingen "native RC -pin" på arduinoen, men muligens flere og forskjellige måter å lese inn mottakersignalet.

Jeg måtte deaktivere RX -spenningsalarmen, siden VCC -spenningen med USB -forsyning bare vil være rundt 4,5V - men ganske stabil, så ikke noe problem i det hele tatt.

Trinn 2: Få noen PPM -signaler

Få noen PPM -signaler
Få noen PPM -signaler
Få noen PPM -signaler
Få noen PPM -signaler

Når mottakeren OG TX er slått på, fikk jeg PPM -signaler som vist på bildet. 16 kanaler, gjentatt for alltid. Hvis Failsafe på RSAT er deaktivert og senderen slått av, blir PPM -utgangen deaktivert.

Mer informasjon om PPM er tilgjengelig her:

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

Siden jeg ikke flyr ekte ting i dette tilfellet, brydde jeg meg ikke om de teoretiske timene og fant ut på oscilloskopet hva mottakeren min sendte akutt når jeg flyttet pinnene fra helt til venstre til helt høyre (standardinnstillinger i TX). Det virket -100% tilsvarer pulser med en lengde på 600µs, og +100% til 1600µs. Jeg brydde meg heller ikke om lengden på pulsimpulsene (400µs) i min Arduino -kode, men jeg antok en rammeavstand på min. 3000µs.

Trinn 3: Konfigurere senderen

Konfigurere senderen
Konfigurere senderen
Konfigurere senderen
Konfigurere senderen
Konfigurere senderen
Konfigurere senderen

Siden bare den faktiske posisjonen til kontrollflatene trenger å være kjent, er en kanal / "servo" per RC -funksjon tilstrekkelig. Følgelig kan det gjøres et ganske enkelt senderoppsett - som en vanlig RC -modell. Hovedfunksjonene aileron, heis, ror og gass krever hver bare en servo henholdsvis senderkanal. Jeg la også til klaffer, bremser og gir, og la 9 kanaler være ledige så langt. Vær oppmerksom på at klaffene ble satt på en flyfase, og ikke styres direkte via en pinne, glidebryter eller knapp.

Trinn 4: Kjøre joysticken

Kjøre joysticken
Kjøre joysticken
Kjøre joysticken
Kjøre joysticken

Joystick -biblioteket er ganske enkelt å bruke, og gir noen eksempler og tester. Det bør være nyttig å først sjekke om Arduino er oppdaget som riktig joystick, instruksjonene som er lenket i oppføringsdelen og biblioteket i seg selv gir noen god veiledning.

I kontrollpanelet Enheter og skrivere dukket Arduino opp som "Sparkfun Pro Micro", og joystick -testvinduet viste 7 akser og mange støttede knapper. Selv en hattebryter kan brukes når den er programmert i Arduino.

Trinn 5: Koding av Arduino

Koder for Arduino
Koder for Arduino
Koder for Arduino
Koder for Arduino

Det som fortsatt mangler er selve analysen av PPM -signalet og tildeling til joystick -akser og -knapper. Jeg bestemte meg for følgende kartlegging:

Kanal / funksjon / styrespak:

  1. Gass -> Gassaksel
  2. Aileron -> X -aksen
  3. Heis -> Y -aksen
  4. Ror -> X rotasjonsakse
  5. Klaffer -> Y rotasjonsakse
  6. Brems -> Z -akse
  7. Gear -> Knapp 0

Når giret er nede, skal den første knappen på styrespaken trykkes ned og slippes når du hever giret. Dette vil imidlertid kreve FSUIPC for FSX, ut av esken, vil FSX bare godta en knapp for å bytte gir, noe som ikke akkurat er det som skjer med modellene mine.

Jeg ga min nåværende versjon av koden mange kommentarer, som fungerer ganske bra for meg - du kan gjerne endre oppgaven din eller legge til nye funksjoner. De siste 9 RC -kanalene brukes foreløpig ikke.

For oppsettet må joystick -klassen initialiseres, i utgangspunktet ved å definere de numeriske akseområdene:

/ * Angi aksenes område (definert i toppteksten, 0 - 1000) */

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

Ved å bruke verdier fra 0 til 1000 er det mulig å kartlegge pulslengden (600 - 1600µs) direkte til styrespakverdiene uten å skalere på nytt.

DIN 3 er initialisert som digital inngang, pullups aktivert og et avbrudd vedlagt:

pinMode (PPM_PIN, INPUT_PULLUP);

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

For feilsøkingsformål la jeg til noen utskrifter via det serielle grensesnittet med jevne mellomrom ved hjelp av arduino-timer-biblioteket:

hvis (SERIAL_PRINT_INTERVAL> 0) {

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

Pinnens avbrudd vil bli kalt når pinnens logiske verdi har endret seg, så for hver kant i PPM -signalet. Evaluer pulslengden bare ved enkel timing ved hjelp av mikro ():

uint32_t curTime = micros ();

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

Ved å evaluere den nåværende pinnens tilstand og kombinere den med pulslengden og tidligere pulser, kan de nye pulser klassifiseres. Følgende betinget vil oppdage mellomrammegapet:

hvis (lastState == 0 && pulslengde> 3000 && pulslengde <6000)

For påfølgende pulser vil pulslengden bli kartlagt til en aksetilstand ved å klippe og forspenne pulslengden for å matche joystick -akseområdet:

uint16_t rxLength = pulsLengde;

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

RxChannels -arrayet inneholder til slutt 16 verdier fra 0 - 1000, som indikerer pinne / glidebryter og knappestillinger.

Etter å ha mottatt 16 kanaler, utføres kartleggingen til styrespaken:

/ * akser */

Joystick.setThrottle (kanaler [0]); Joystick.setXAxis (kanaler [1]); Joystick.setYAxis (1000 - kanaler [2]); Joystick.setRxAxis (kanaler [3]); Joystick.setRyAxis (kanaler [4]); Joystick.setZAxis (1000 - kanaler [5]); / * knapper */ Joystick.setButton (0, (kanaler [6] <500? 1: 0)); / * oppdater data via USB */ Joystick.sendState ();

Jeg snudde noen akser i koden, noe som ikke er absolutt nødvendig, siden aksen også kan inverteres ved å snu servoretningen eller tildelingen i FSX. Imidlertid bestemte jeg meg for å beholde servo -instruksjonene og også den opprinnelige FSX -oppgaven.

Knappen slås på eller av av terskelkanal 7.

Og ikke glem å krysse av planleggeren … ellers vil ingen feilsøkingsutskrifter være synlige.

void loop () {

scheduler.tick (); }

På skjermbildet jeg la ved kan du se, kanal 1 ble flyttet fra 1000 (full gass) til 0 (inaktiv).

FSX vil oppdage Arduino akkurat som alle andre joystick, så bare tilordne knappen og aksene og ha det gøy å ta av!

Det jeg virkelig liker med denne tilnærmingen er, du kan bare bruke senderen som med en ekte modell, f.eks. ved bruk av flyfaser etc.

Anbefalt: