Innehållsförteckning:

Arduino -baserad (JETI) PPM till USB -joystick -omvandlare för FSX: 5 steg
Arduino -baserad (JETI) PPM till USB -joystick -omvandlare för FSX: 5 steg

Video: Arduino -baserad (JETI) PPM till USB -joystick -omvandlare för FSX: 5 steg

Video: Arduino -baserad (JETI) PPM till USB -joystick -omvandlare för FSX: 5 steg
Video: WIRELESS BLUETOOTH HEAD TRACKER FOR YOUR JETI - HOW TO MAKE IT WORK 2024, Juli
Anonim
Arduino -baserad (JETI) PPM till USB -joystick -omvandlare för FSX
Arduino -baserad (JETI) PPM till USB -joystick -omvandlare för FSX
Arduino -baserad (JETI) PPM till USB -joystick -omvandlare för FSX
Arduino -baserad (JETI) PPM till USB -joystick -omvandlare för FSX

Jag bestämde mig för att byta min JETI DC-16-sändare från läge 2 till läge 1, som i princip växlar gas och hiss från vänster till höger och vice versa. Eftersom jag inte ville krascha en av mina modeller på grund av viss vänster/höger förvirring i min hjärna undrade jag om det är möjligt att träna lite i FSX.

Jag läste och testade att JETI -sändarna faktiskt stöder ett joystick -läge ur lådan, men jag ville ha full flexibilitet för axlarna och omkopplarna och använda TX som med en riktig modell. Genom att använda mottagarens utgång är det också möjligt att utnyttja signalbehandlingen i DC-16 och använda mixers, flygfaser, dubbla hastigheter, vad du än kan programmera där.

Nyligen hittade jag en trevlig handledning om hur man gör en USB HID -ingångsenhet, nämligen en joystick, från en billig Arduino som en Pro Micro:

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

Detta skulle möjliggöra allt som behövs för att styra ett plan / helikopter / vad som helst i FSX! Massor av axlar och knappar tillgängliga.

Eftersom jag precis hade en extra JETI RSAT2 bestämde jag mig för att koppla ihop den med Arduino och försöka implementera en liten PPM -parser tillsammans med joystickbiblioteket.

Jag antar att någon som följer dessa steg är bekant med att ansluta och programmera en Arduino. Jag tar inga garantier för fel eller skador!

Tillbehör

Du kommer behöva…

  • vilken Arduino som helst som stöds av joystickbiblioteket använde jag en Sparkfun Pro Micro 5V / 16 MHz
  • en ny version av Arduino IDE
  • alla RC -mottagare som matar ut en PPM -signal, som JETI RSAT2
  • några bygelkablar (min. 3)
  • joystick -biblioteket installerat i Arduino IDE
  • arduino-timer-biblioteket:

Steg 1: Koppla upp RX och Arduino

Koppla upp RX och Arduino
Koppla upp RX och Arduino
Koppla upp RX och Arduino
Koppla upp RX och Arduino

Ledningarna är ganska enkla. Jag bestämde mig för att bara driva Arduino från USB, eftersom den ska emulera en joystick -enhet. Detta kommer att förse Arduino med 5V, som också kan användas för att driva RC -mottagaren.

Jag använde Pin VCC, som ger reglerad utgång, och närmaste Gnd -stift - anslut bara den till PPM: s kontakt + och - stift. När Arduino får ström startar mottagaren nu också.

För PPM -signalen bestämde jag mig för att använda avbrott för att analysera dem. Avbrott finns t.ex. vid Pin 3, så det är bara att ansluta det där - det finns ingen "native RC -pin" på arduino, men möjligen fler och olika sätt att läsa in mottagarsignalen.

Jag var tvungen att inaktivera RX -spänningslarmet, eftersom VCC -spänningen med USB -matning bara kommer att vara runt 4,5V - men ganska stabil, så inga problem alls.

Steg 2: Få några PPM -signaler

Skaffa några PPM -signaler
Skaffa några PPM -signaler
Skaffa några PPM -signaler
Skaffa några PPM -signaler

När mottagaren OCH TX är strömförande fick jag PPM -signaler som visas på bilden. 16 kanaler, upprepade för alltid. Om Failsafe på RSAT är inaktiverad och sändaren är avstängd kommer PPM -utdata att inaktiveras.

Mer information om PPM finns här:

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

Eftersom jag inte flyger riktiga grejer i det här fallet brydde jag mig inte om de teoretiska tiderna och tänkte bara på oscilloskopet vad min mottagare utmatade akut när jag flyttade pinnarna från helt vänster till helt höger (standardinställningar i TX). Det verkade -100% motsvarar pulser med en längd av 600µs och +100% till 1600µs. Jag brydde mig inte heller om längden på pauspulserna (400 µs) i min Arduino -kod, men jag antog ett ramavstånd på min. 3000 µs.

Steg 3: Konfigurera sändaren

Konfigurera sändaren
Konfigurera sändaren
Konfigurera sändaren
Konfigurera sändaren
Konfigurera sändaren
Konfigurera sändaren

Eftersom endast kontrollytornas faktiska läge behöver vara känt, räcker det med en kanal / "servo" per RC -funktion. Följaktligen kan en ganska enkel sändarinställning göras - liknande en vanlig RC -modell. Huvudfunktionerna aileron, hiss, roder och gasreglage kräver var och en endast en servo respektive sändarkanal. Jag har också lagt till klaffar, bromsar och växlar, så att 9 kanaler är lediga hittills. Observera att klaffar sattes i en flygfas och inte styrs direkt via en pinne, reglage eller knapp.

Steg 4: Kör joysticken

Kör joysticken
Kör joysticken
Kör joysticken
Kör joysticken

Joystick -biblioteket är ganska enkelt att använda och ger några exempel och tester. Det bör vara till hjälp att först kontrollera om Arduino upptäcks som korrekt joystick, instruktionerna som länkas i inmatningsavsnittet och biblioteket i sig ger bra vägledning.

På kontrollpanelen Enheter och skrivare visade sig Arduino som "Sparkfun Pro Micro" och joystick -testfönstret visade 7 axlar och massor av knappar som stöds. Även en hattbrytare kan användas när den är programmerad i Arduino.

Steg 5: Kodning av Arduino

Kodning av Arduino
Kodning av Arduino
Kodning av Arduino
Kodning av Arduino

Det som fortfarande saknas är den faktiska analysen av PPM -signalen och tilldelning till joystickaxlar och knappar. Jag bestämde mig för följande kartläggning:

Kanal / funktion / joystick -tilldelning:

  1. Gasreglage -> Gasreglageaxel
  2. Aileron -> X -axel
  3. Hiss -> Y -axel
  4. Rod -> X rotationsaxel
  5. Flikar -> Y -rotationsaxel
  6. Broms -> Z -axel
  7. Kugghjul -> Knapp 0

När växeln är nere ska den första knappen på joysticken trycks in och släppas när växeln höjs. Detta kommer dock att kräva FSUIPC för FSX, utanför lådan, FSX accepterar bara en knapp för att växla växeln, vilket inte är exakt vad som händer med mina modeller.

Jag gav min nuvarande version av koden många kommentarer, vilket fungerar ganska bra för mig - ändra gärna ditt uppdrag eller lägg till nya funktioner. De senaste 9 RC -kanalerna används för närvarande inte.

För installationen måste joystick -klassen initialiseras, i princip genom att definiera de numeriska axelområdena:

/ * Ställ in axelområdet (definierat i rubriken, 0 - 1000) */

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

Genom att använda värden från 0 till 1000 är det möjligt att direkt mappa pulslängden (600 - 1600µs) till joystickvärdena utan att skala om.

DIN 3 initieras som digital ingång, pullups aktiverad och ett avbrott bifogat:

pinMode (PPM_PIN, INPUT_PULLUP);

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

För felsökningsändamål lade jag till några utskrifter via det seriella gränssnittet med jämna mellanrum med hjälp av arduino-timer-biblioteket:

om (SERIAL_PRINT_INTERVAL> 0) {

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

Stiftets avbrott kommer att anropas när stiftets logiska värde har ändrats, så för varje kant i PPM -signalen. Utvärdera pulslängden bara genom enkel timing med hjälp av mikros ():

uint32_t curTime = micros ();

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

Genom att utvärdera det aktuella stiftets tillstånd och kombinera det med pulslängden och tidigare pulser kan de nya pulserna klassificeras. Följande villkorlig kommer att upptäcka mellanramens gap:

if (lastState == 0 && pulslängd> 3000 && pulslängd <6000)

För efterföljande pulser kommer pulslängden att mappas till ett axeltillstånd genom att klippa och förspänna pulslängden för att matcha joystickaxelområdet:

uint16_t rxLength = pulsLängd;

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

RxChannels -gruppen innehåller så småningom 16 värden från 0 - 1000, vilket indikerar stick / skjutreglage och knapplägen.

Efter att ha mottagit 16 kanaler utförs mappningen till joysticken:

/ * axlar */

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]); / * knappar */ Joystick.setButton (0, (kanaler [6] <500? 1: 0)); / * uppdatera data via USB */ Joystick.sendState ();

Jag inverterade några axlar i koden, vilket inte är absolut nödvändigt, eftersom axeln också kan inverteras genom att vända servoriktning eller tilldelningen i FSX. Jag bestämde mig dock för att behålla servoriktningarna och även det ursprungliga FSX -uppdraget.

Knappen slås på eller av med tröskelvärde för kanal 7.

Och glöm inte att kryssa i schemaläggaren … annars kommer inga felsökningsutskrifter att synas.

void loop () {

scheduler.tick (); }

På skärmdumpen jag bifogade kan du se, kanal 1 flyttades från 1000 (full gas) till 0 (inaktiv).

FSX kommer att upptäcka Arduino precis som alla andra joystick, så tilldela bara knappen och axlarna och ha kul att ta fart!

Det jag verkligen gillar med detta tillvägagångssätt är att du bara kan använda din sändare som med en riktig modell, t.ex. använda flygfaser etc.

Rekommenderad: