Taula de continguts:

Convertidor de joystick PPM a USB basat en Arduino (JETI) per FSX: 5 passos
Convertidor de joystick PPM a USB basat en Arduino (JETI) per FSX: 5 passos

Vídeo: Convertidor de joystick PPM a USB basat en Arduino (JETI) per FSX: 5 passos

Vídeo: Convertidor de joystick PPM a USB basat en Arduino (JETI) per FSX: 5 passos
Vídeo: USB Joystick to PPM converter 2024, Juliol
Anonim
Convertidor de joystick PPM a USB basat en Arduino (JETI) per a FSX
Convertidor de joystick PPM a USB basat en Arduino (JETI) per a FSX
Convertidor de joystick PPM a USB basat en Arduino (JETI) per a FSX
Convertidor de joystick PPM a USB basat en Arduino (JETI) per a FSX

Vaig decidir canviar el meu transmissor JETI DC-16 del mode 2 al mode 1, que bàsicament canvia l’accelerador i l’ascensor d’esquerra a dreta i viceversa. Com que no volia estavellar un dels meus models a causa d'una certa confusió esquerra / dreta al cervell, em preguntava si és possible practicar una mica a FSX.

He llegit i provat que els transmissors JETI realment admeten un mode Joystick fora de la caixa, però volia una flexibilitat completa per a les assignacions d’eixos i commutadors i utilitzo el TX com amb un model real. En utilitzar la sortida del receptor, també és possible aprofitar el processament del senyal al DC-16 i utilitzar mescladors, fases de vol, velocitats dobles, tot allò que pugueu programar allà.

Recentment he trobat un bon tutorial sobre com fer un dispositiu d’entrada USB HID, és a dir, un Joystick, d’un Arduino barat com un Pro Micro:

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

Això permetria tot el necessari per controlar un avió / helicòpter / qualsevol cosa a FSX. Hi ha molts eixos i botons disponibles.

Com que només tenia un JETI RSAT2 de recanvi, vaig decidir connectar-lo amb l'Arduino i intentar implementar un petit analitzador PPM juntament amb la biblioteca Joystick.

Suposo que algú que segueix aquests passos està familiaritzat amb la connexió i la programació d'un Arduino. No agafaré cap garantia per mal funcionament o danys.

Subministraments

Necessitarà…

  • qualsevol Arduino compatible amb la biblioteca Joystick, he utilitzat un Sparkfun Pro Micro 5V / 16 MHz
  • una versió recent de l'IDE Arduino
  • qualsevol receptor RC que emeti un senyal PPM, com el JETI RSAT2
  • alguns cables de pont (mínim 3)
  • la biblioteca Joystick instal·lada a l'IDE Arduino
  • la biblioteca arduino-timer:

Pas 1: connecteu el RX i l'Arduino

Connecteu el RX i l’Arduino
Connecteu el RX i l’Arduino
Connecteu el RX i l’Arduino
Connecteu el RX i l’Arduino

El cablejat és pràcticament senzill. Vaig decidir alimentar l'Arduino només des del USB, ja que emularà un dispositiu Joystick. Això subministrarà a Arduino 5V, que es pot utilitzar també per alimentar el receptor RC.

He utilitzat el Pin VCC, que proporciona una sortida regulada, i el pin Gnd més proper, només cal que el connecteu als pins + i - del connector PPM. Quan l’Arduino s’encén, el receptor també s’encén.

Pel senyal PPM, vaig decidir utilitzar interrupcions per analitzar-les. Hi ha interrupcions disponibles, per exemple. al pin 3, així que només cal que el connecteu allà; no hi ha cap "pin RC natiu" a l'arduino, però possiblement hi ha més i diferents maneres de llegir el senyal del receptor.

Vaig haver de desactivar l'alarma de tensió RX, ja que la tensió VCC amb alimentació USB serà de només 4,5 V, però bastant estable, de manera que no hi ha cap problema.

Pas 2: Obtenir alguns senyals PPM

Obtenir alguns senyals de PPM
Obtenir alguns senyals de PPM
Obtenir alguns senyals de PPM
Obtenir alguns senyals de PPM

Quan el receptor I el TX s’alimenten, rebia senyals PPM com es mostren a la imatge. 16 canals, repetits per sempre. Si Failsafe a RSAT està desactivat i el transmissor apagat, la sortida PPM es desactivarà.

Podeu obtenir més informació sobre PPM aquí:

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

Com que en aquest cas no estic volant coses reals, no m'importaven els temps teòrics i només vaig esbrinar a l'oscil·loscopi el que el receptor emetia de manera aguda quan movia els pals de completament esquerra a completament dreta (configuració estàndard al TX). Semblava que -100% correspon a polsos amb una longitud de 600 µs i + 100% a 1600 µs. Tampoc no m'importava la durada dels polsos de pausa (400 µs) al meu codi Arduino, però vaig assumir un espai de fotogrames de mín. 3000µs.

Pas 3: Configuració del transmissor

Configuració del transmissor
Configuració del transmissor
Configuració del transmissor
Configuració del transmissor
Configuració del transmissor
Configuració del transmissor

Com que només cal conèixer la posició real de les superfícies de control, és suficient un canal / "servo" per funció RC. En conseqüència, es pot fer una configuració del transmissor bastant simple, similar a un model de RC normal. Les funcions principals de l’aleró, l’ascensor, el timó i l’accelerador només requereixen un canal de transmissor servo, respectivament. També he afegit solapes, frens i marxes, deixant 9 canals lliures fins ara. Tingueu en compte que els flaps es van posar en fase de vol i no es controlen directament mitjançant un pal, un control lliscant o un botó.

Pas 4: Execució del joystick

Funcionament del joystick
Funcionament del joystick
Funcionament del joystick
Funcionament del joystick

La biblioteca Joystick és molt fàcil d’utilitzar i proporciona alguns exemples i proves. Primer hauria de ser útil comprovar si l’Arduino es detecta com un joystick adequat, les instruccions enllaçades a la secció d’entrada i la pròpia biblioteca proporcionen una bona guia.

Al tauler de control de Dispositius i impressores, l'Arduino apareixia com a "Sparkfun Pro Micro" i la finestra de prova del joystick mostrava 7 eixos i molts botons compatibles. Fins i tot es pot utilitzar un interruptor de barret quan es programa a l’Arduino.

Pas 5: Codificació de l'Arduino

Codificació de l'Arduino
Codificació de l'Arduino
Codificació de l'Arduino
Codificació de l'Arduino

El que encara falta és l’anàlisi real del senyal PPM i l’assignació als eixos i botons del joystick. Vaig decidir el següent mapatge:

Assignació de canal / funció / palanca de control:

  1. Accelerador -> Eix de l'accelerador
  2. Aleró -> eix X
  3. Ascensor -> Eix Y
  4. Timó -> Eix de rotació X.
  5. Solapes -> Eix de rotació Y
  6. Fre -> eix Z
  7. Engranatge -> Botó 0

Quan l’engranatge està baix, es prem el primer botó del joystick i es deixarà anar quan s’aixequi l’engranatge. Tanmateix, això requerirà FSUIPC per a FSX; fora de la caixa, FSX només acceptarà un botó per canviar l’engranatge, que no és exactament el que està passant amb els meus models.

Vaig proporcionar la meva versió actual del codi amb molts comentaris, que funcionen bastant bé: no dubteu a canviar la vostra tasca o afegir funcions noves. Actualment no s’utilitzen els darrers 9 canals RC.

Per a la configuració, s’ha d’inicialitzar la classe Joystick, bàsicament definint els rangs d’eixos numèrics:

/ * Estableix el rang dels eixos (definit a la capçalera, 0 - 1000) * /

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

Mitjançant l'ús de valors de 0 a 1000, és possible assignar directament la longitud del pols (600 - 1600µs) als valors del joystick sense canviar l'escala.

El DIN 3 s’inicialitza com a entrada digital, s’expliquen els extractors i s’adjunta una interrupció:

pinMode (PPM_PIN, INPUT_PULLUP);

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

A efectes de depuració, he afegit algunes impressions a través de la interfície sèrie a intervals regulars, mitjançant la biblioteca de temporitzador arduino:

if (SERIAL_PRINT_INTERVAL> 0) {

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

La interrupció del pin es cridarà sempre que el valor lògic del pin hagi canviat, de manera que per a cada vora del senyal PPM. Avalueu la longitud del pols només amb un simple temps mitjançant micros ():

uint32_t curTime = micros ();

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

Avaluant l’estat del pin actual i combinant-lo amb la longitud del pols i els passos passats, es poden classificar els nous impulsos. El següent condicional detectarà el buit entre fotogrames:

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

Per a polsos posteriors, la longitud del pols es maparà a un estat d’eix retallant i polaritzant la longitud del pols perquè coincideixi amb l’interval de l’eix del joystick:

uint16_t rxLength = pulseLength;

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

La matriu rxChannels conté finalment 16 valors de 0 a 1000, que indiquen les posicions del botó / lliscant / lliscant.

Després de rebre 16 canals, es realitza l'assignació al joystick:

/ * eixos * /

Joystick.setThrottle (canals [0]); Joystick.setXAxis (canals [1]); Joystick.setYAxis (1000 canals [2]); Joystick.setRxAxis (canals [3]); Joystick.setRyAxis (canals [4]); Joystick.setZAxis (1000 canals [5]); / * botons * / Joystick.setButton (0, (canals [6] <500? 1: 0)); / * actualitzar dades mitjançant USB * / Joystick.sendState ();

He invertit alguns eixos al codi, cosa que no és absolutament necessària, ja que l'eix també es pot invertir girant la direcció del servo o l'assignació a FSX. No obstant això, vaig decidir mantenir les direccions del servo i també l’assignació original del FSX.

El botó està activat o desactivat mitjançant el llindar del canal 7.

I no oblideu marcar el planificador … en cas contrari, no es podran veure impressions de depuració.

bucle buit () {

scheduler.tick (); }

A la captura de pantalla que he adjuntat es pot veure, el canal 1 es va passar de 1000 (accelerador complet) a 0 (inactiu).

FSX detectarà l'Arduino igual que qualsevol altre joystick, així que només cal assignar el botó i els eixos i divertir-se enlairant-se.

El que m’agrada molt d’aquest enfocament és que només podeu utilitzar el transmissor com amb un model real, per exemple. utilitzant fases de vol, etc.

Recomanat: