Indholdsfortegnelse:

Arduino -baseret (JETI) PPM til USB Joystick -konverter til FSX: 5 trin
Arduino -baseret (JETI) PPM til USB Joystick -konverter til FSX: 5 trin

Video: Arduino -baseret (JETI) PPM til USB Joystick -konverter til FSX: 5 trin

Video: Arduino -baseret (JETI) PPM til USB Joystick -konverter til FSX: 5 trin
Video: Использование бесконтактного датчика температуры MLX90614 с NodeMCU D1 Mini через WiFi 2024, Juli
Anonim
Arduino -baseret (JETI) PPM til USB Joystick -konverter til FSX
Arduino -baseret (JETI) PPM til USB Joystick -konverter til FSX
Arduino -baseret (JETI) PPM til USB Joystick -konverter til FSX
Arduino -baseret (JETI) PPM til USB Joystick -konverter til FSX

Jeg besluttede at skifte min JETI DC-16 sender fra Mode 2 til Mode 1, som dybest set skifter gas og elevator fra venstre til højre og omvendt. Da jeg ikke ville gå ned på en af mine modeller på grund af en vis venstre/højre forvirring i min hjerne, spekulerede jeg på, om det er muligt at øve lidt i FSX.

Jeg læste og testede, at JETI -transmitterne faktisk understøtter en joystick -tilstand ud af boksen, men jeg ønskede fuld fleksibilitet for akserne og switch -opgaverne og brug TX som med en rigtig model. Ved at bruge modtagerens output er det også muligt at udnytte signalbehandlingen i DC-16 og bruge mixere, flyvefaser, dobbeltfrekvenser, uanset hvad du kan programmere der.

For nylig fandt jeg en god tutorial om, hvordan man laver en USB HID -inputenhed, nemlig et joystick, ud af en billig Arduino som en Pro Micro:

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

Dette ville muliggøre alt, hvad der er nødvendigt for at styre et fly / helikopter / hvad som helst i FSX! Masser af akser og knapper til rådighed.

Da jeg lige havde en ekstra JETI RSAT2, besluttede jeg at koble den til Arduino og prøve at implementere en lille PPM -parser sammen med joystick -biblioteket.

Jeg går ud fra, at alle, der følger disse trin, er fortrolige med tilslutning og programmering af en Arduino. Jeg vil ikke tage nogen garantier for funktionsfejl eller skader!

Forbrugsvarer

Du får brug for…

  • enhver Arduino, der understøttes af Joystick -biblioteket, brugte jeg en Sparkfun Pro Micro 5V / 16 MHz
  • en nylig version af Arduino IDE
  • enhver RC -modtager, der udsender et PPM -signal, som JETI RSAT2
  • et par springtråde (min. 3)
  • joystick -biblioteket installeret i Arduino IDE
  • arduino-timer-biblioteket:

Trin 1: Forbind RX og Arduino

Tråd op RX og Arduino
Tråd op RX og Arduino
Tråd op RX og Arduino
Tråd op RX og Arduino

Ledningerne er stort set ligetil. Jeg besluttede kun at tænde for Arduino fra USB, da den skal efterligne en joystick -enhed. Dette vil forsyne Arduino med 5V, som også kan bruges til at drive RC -modtageren.

Jeg brugte Pin VCC, som giver reguleret output, og den nærmeste Gnd pin - bare tilslut den til PPM's stik + og - ben. Når Arduino får strøm, tænder modtageren nu også.

For PPM -signalet besluttede jeg at bruge afbrydelser til at analysere dem. Afbrydelser er tilgængelige f.eks. ved Pin 3, så bare tilslut den der - der er ingen "native RC pin" på arduinoen, men muligvis flere og forskellige måder at læse i modtagersignalet på.

Jeg var nødt til at deaktivere RX -spændingsalarmen, da VCC -spændingen med USB -forsyning kun vil være omkring 4,5V - men ganske stabil, så slet ikke noget problem.

Trin 2: Få nogle PPM -signaler

Få nogle PPM -signaler
Få nogle PPM -signaler
Få nogle PPM -signaler
Få nogle PPM -signaler

Når modtageren OG TX er tændt, fik jeg PPM -signaler som vist på billedet. 16 kanaler, gentaget for evigt. Hvis Failsafe på RSAT er deaktiveret og senderen slukket, deaktiveres PPM -output.

Flere oplysninger om PPM findes her:

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

Da jeg ikke flyver rigtige ting i dette tilfælde, var jeg ligeglad med de teoretiske tidspunkter og fandt lige ud af oscilloskopet, hvad min modtager akut udsendte, når jeg flyttede pindene fra helt til venstre til helt til højre (standardindstillinger i TX). Det virkede -100% svarer til pulser med en længde på 600µs og +100% til 1600µs. Jeg var også ligeglad med længden af pausepulserne (400µs) i min Arduino -kode, men jeg antog en rammeafstand på min. 3000 µs.

Trin 3: Konfiguration af senderen

Konfiguration af senderen
Konfiguration af senderen
Konfiguration af senderen
Konfiguration af senderen
Konfiguration af senderen
Konfiguration af senderen

Da kun den faktiske position af styrefladerne skal kendes, er en kanal / "servo" pr. RC -funktion tilstrækkelig. Derfor kan der foretages en ret simpel senderopsætning - svarende til en normal RC -model. Hovedfunktionerne aileron, elevator, ror og gasspjæld kræver hver kun en servo henholdsvis senderkanal. Jeg tilføjede også klapper, bremser og gear, så 9 kanaler var ledige indtil videre. Bemærk, at klapper blev sat på en flyvefase og ikke styres direkte via en pind, skyder eller knap.

Trin 4: Kør joysticket

Kører joysticket
Kører joysticket
Kører joysticket
Kører joysticket

Joystick -biblioteket er ret let at bruge og indeholder nogle eksempler og tests. Det burde være nyttigt først at kontrollere, om Arduino opdages som korrekt joystick, instruktionerne i indgangssektionen og selve biblioteket giver nogle gode vejledninger.

I kontrolpanelet Enheder og printere viste Arduino sig som "Sparkfun Pro Micro", og joystick -testvinduet viste 7 akser og masser af understøttede knapper. Selv en hatkontakt kan bruges, når den er programmeret i Arduino.

Trin 5: Kodning af Arduino

Kodning af Arduino
Kodning af Arduino
Kodning af Arduino
Kodning af Arduino

Det, der stadig mangler, er selve analysen af PPM -signalet og tildeling til joystick -akser og -knapper. Jeg besluttede mig for følgende kortlægning:

Kanal / funktion / joystick -tildeling:

  1. Gashåndtag -> Gashåndtag
  2. Aileron -> X -akse
  3. Elevator -> Y -akse
  4. Ror -> X rotationsakse
  5. Klapper -> Y rotationsakse
  6. Bremse -> Z -akse
  7. Gear -> Knap 0

Når gearet er nede, skal der trykkes på den første knap på joysticket og slippes, når gearet hæves. Dette vil dog kræve FSUIPC til FSX, ud af kassen, FSX accepterer kun en knap til at skifte gear, hvilket ikke ligefrem er, hvad der sker med mine modeller.

Jeg forsynede min nuværende version af koden med mange kommentarer, hvilket fungerer ganske godt for mig - du er velkommen til at ændre din opgave eller tilføje nye funktioner. De sidste 9 RC -kanaler bruges i øjeblikket ikke.

For opsætningen skal joystick -klassen initialiseres, grundlæggende ved at definere de numeriske akseområder:

/ * Indstil aksens område (defineret i overskriften, 0 - 1000) */

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

Ved at bruge værdier fra 0 til 1000 er det muligt direkte at kortlægge pulslængden (600 - 1600µs) til joystickværdierne uden at skalere.

DIN 3 initialiseres som digital indgang, pullups aktiveret og en afbrydelse vedhæftet:

pinMode (PPM_PIN, INPUT_PULLUP);

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

Til fejlretning formål tilføjede jeg nogle udskrifter via den serielle grænseflade med jævne mellemrum ved hjælp af arduino-timer biblioteket:

hvis (SERIAL_PRINT_INTERVAL> 0) {

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

Pinens afbrydelse vil blive kaldt, når pinens logiske værdi er ændret, så for hver kant i PPM -signalet. Evaluer pulslængden ved simpel timing ved hjælp af mikro ():

uint32_t curTime = micros ();

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

Ved at evaluere den aktuelle pin -tilstand og kombinere den med pulslængden og tidligere pulser kan de nye impulser klassificeres. Følgende betinget vil registrere mellemrammegabet:

hvis (lastState == 0 && pulslængde> 3000 && pulslængde <6000)

For efterfølgende impulser vil pulslængden blive kortlagt til en aksetilstand ved at klippe og forspænde pulslængden, så den matcher joystickakseområdet:

uint16_t rxLength = pulsLængde;

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

RxChannels -arrayet indeholder til sidst 16 værdier fra 0 - 1000, hvilket angiver stick / skyder og knappositioner.

Efter modtagelse af 16 kanaler udføres kortlægningen til joysticket:

/ * 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)); / * opdater data via USB */ Joystick.sendState ();

Jeg vendte nogle akser i koden, hvilket ikke er absolut nødvendigt, da aksen også kan vendes ved at vende servoretning eller tildelingen i FSX. Jeg besluttede mig dog for at beholde servo -anvisningerne og også den originale FSX -opgave.

Knappen tændes eller slukkes med tærskelværdi kanal 7.

Og glem ikke at markere planlæggeren … ellers vil der ikke være synlige fejlfindingsudskrifter.

void loop () {

scheduler.tick (); }

I det skærmbillede, jeg vedhæftede, kan du se, kanal 1 blev flyttet fra 1000 (fuld gas) til 0 (inaktiv).

FSX vil opdage Arduino ligesom ethvert andet joystick, så tildel bare knappen og akserne og have det sjovt at tage af!

Det jeg virkelig kan lide ved denne tilgang er, at du bare kan bruge din sender som med en rigtig model, f.eks. ved hjælp af flyvefaser osv.

Anbefalede: