INHOUDSOPGAWE:

Arduino -gebaseerde (JETI) PPM na USB -joystick -omskakelaar vir FSX: 5 stappe
Arduino -gebaseerde (JETI) PPM na USB -joystick -omskakelaar vir FSX: 5 stappe

Video: Arduino -gebaseerde (JETI) PPM na USB -joystick -omskakelaar vir FSX: 5 stappe

Video: Arduino -gebaseerde (JETI) PPM na USB -joystick -omskakelaar vir FSX: 5 stappe
Video: PPM/PWM Servo Signal Amplifier 90 Degree Extended to 180 Angle 2024, November
Anonim
Arduino -gebaseerde (JETI) PPM na USB -joystick -omskakelaar vir FSX
Arduino -gebaseerde (JETI) PPM na USB -joystick -omskakelaar vir FSX
Arduino -gebaseerde (JETI) PPM na USB -joystick -omskakelaar vir FSX
Arduino -gebaseerde (JETI) PPM na USB -joystick -omskakelaar vir FSX

Ek het besluit om my JETI DC-16-sender van modus 2 na modus 1 oor te skakel, wat basies Throttle en Elevator van links na regs skakel en omgekeerd. Aangesien ek nie een van my modelle wou neerstort as gevolg van verwarring in my brein links/regs nie, het ek gewonder of dit moontlik is om 'n bietjie in FSX te oefen.

Ek het gelees en getoets dat die JETI -senders eintlik 'n joystick -modus uit die boks ondersteun, maar ek wou volle buigsaamheid vir die asse en skakelaaropdragte hê en die TX gebruik soos met 'n regte model. Deur die uitvoer van die ontvanger te gebruik, is dit ook moontlik om die seinverwerking in die DC-16 te benut en mengers, vlugfases, dubbele snelhede te gebruik, wat u ook al daar kan programmeer.

Onlangs het ek 'n goeie handleiding gevind oor hoe om 'n USB HID -invoertoestel, naamlik 'n joystick, uit 'n goedkoop Arduino soos 'n Pro Micro te maak:

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

Dit sou alles moontlik maak om 'n vliegtuig / helikopter / wat ook al in FSX te beheer! Baie asse en knoppies beskikbaar.

Aangesien ek net 'n ekstra JETI RSAT2 gehad het, het ek besluit om dit saam met die Arduino aan te sluit en 'n klein PPM -ontleder saam met die joystick -biblioteek te probeer implementeer.

Ek neem aan dat iemand wat hierdie stappe volg, vertroud is met die koppeling en programmering van 'n Arduino. Ek neem geen waarborg vir foute of skade nie!

Voorrade

Jy sal nodig hê…

  • enige Arduino wat deur die Joystick -biblioteek ondersteun word, het ek 'n Sparkfun Pro Micro 5V / 16 MHz gebruik
  • 'n onlangse weergawe van die Arduino IDE
  • enige RC -ontvanger wat 'n PPM -sein uitstuur, soos die JETI RSAT2
  • 'n paar springdrade (min. 3)
  • die joystick -biblioteek geïnstalleer in die Arduino IDE
  • die arduino-timer biblioteek:

Stap 1: Draai die RX en die Arduino op

Draai die RX en die Arduino op
Draai die RX en die Arduino op
Draai die RX en die Arduino op
Draai die RX en die Arduino op

Die bedrading is redelik eenvoudig. Ek het besluit om die Arduino slegs via USB aan te dryf, aangesien dit 'n joystick -toestel sal naboots. Dit sal die Arduino van 5V voorsien, wat ook gebruik kan word vir die voeding van die RC -ontvanger.

Ek gebruik die Pin VCC, wat gereguleerde uitset bied, en die naaste Gnd -pen - koppel dit net aan die PPM se connector + en - pins. As die Arduino aangeskakel word, skakel die ontvanger ook aan.

Vir die PPM -sein het ek besluit om onderbrekings te gebruik om dit te ontleed. Onderbrekings is beskikbaar bv. by Pin 3, koppel dit net daar aan - daar is geen 'native RC pin' op die arduino nie, maar moontlik meer en verskillende maniere om die ontvanger sein in te lees.

Ek moes die RX -spanningsalarm deaktiveer, aangesien die VCC -spanning met USB -toevoer slegs ongeveer 4,5V sal wees - maar redelik stabiel, dus geen probleem nie.

Stap 2: Kry 'n paar PPM -seine

Kry 'n paar PPM -seine
Kry 'n paar PPM -seine
Kry 'n paar PPM -seine
Kry 'n paar PPM -seine

As die ontvanger EN die TX aangeskakel is, kry ek PPM -seine soos in die prentjie getoon. 16 kanale, vir ewig herhaal. As Failsafe op die RSAT gedeaktiveer is en die sender afgeskakel is, word PPM -uitset gedeaktiveer.

Meer inligting oor PPM is hier beskikbaar:

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

Aangesien ek in hierdie geval nie met regte dinge vlieg nie, het ek nie omgee vir die teoretiese tydsberekening nie, maar net op die ossilloskoop agtergekom wat my ontvanger akuut uitvoer wanneer ek die stokke van heeltemal links na regs skuif (standaardinstellings in die TX). Dit het gelyk asof -100% ooreenstem met pulse met 'n lengte van 600µs en +100% tot 1600µs. Ek het ook nie omgegee vir die lengte van die pouse -pulse (400µs) in my Arduino -kode nie, maar ek het 'n raamafstand van min aanvaar. 3000µs.

Stap 3: Stel die sender in

Stel die sender in
Stel die sender in
Stel die sender in
Stel die sender in
Stel die sender in
Stel die sender in

Aangesien slegs die werklike posisie van die bedieningsoppervlakke bekend moet wees, is een kanaal / "servo" per RC -funksie voldoende. Gevolglik kan 'n redelik eenvoudige senderopstelling gemaak word - soortgelyk aan 'n normale RC -model. Die hooffunksies rolstoel, hysbak, roer en versneller benodig elk slegs een onderskeidelik servokanaalkanaal. Ek het ook kleppe, remme en rat bygevoeg, en ek het tot dusver 9 kanale vrygelaat. Let daarop dat kleppe in 'n vlugfase geplaas is en nie direk met 'n stok, skuifknop of knoppie beheer word nie.

Stap 4: Draai die joystick

Die bestuur van die joystick
Die bestuur van die joystick
Die bestuur van die joystick
Die bestuur van die joystick

Die joystick -biblioteek is redelik maklik om te gebruik en bied voorbeelde en toetse. Dit moet handig wees om eers te kyk of die Arduino as die regte joystick opgespoor word, die instruksies wat in die inskrywingsgedeelte en die biblioteek self gekoppel is, goeie leiding gee.

Op die bedieningspaneel van toestelle en drukkers verskyn die Arduino as 'Sparkfun Pro Micro', en die joystick -toetsvenster toon 7 asse en baie ondersteunde knoppies. Selfs 'n hoedskakelaar kan gebruik word as dit in die Arduino geprogrammeer word.

Stap 5: Kodering van die Arduino

Kodering van die Arduino
Kodering van die Arduino
Kodering van die Arduino
Kodering van die Arduino

Wat nog ontbreek, is die werklike ontleding van die PPM -sein en die toewysing aan die joystick -asse en -knoppies. Ek het besluit vir die volgende kartering:

Kanaal / funksie / joystick -opdrag:

  1. Gaspedaal -> Gaspedaalas
  2. Aileron -> X -as
  3. Hysbak -> Y -as
  4. Roer -> X rotasie -as
  5. Klappe -> Y rotasie -as
  6. Rem -> Z -as
  7. Toerusting -> Knoppie 0

As die rat af is, word die eerste knoppie van die joystick ingedruk en sal dit losgelaat word wanneer die rat gehys word. Dit vereis egter FSUIPC vir FSX, maar FSX aanvaar net 'n knoppie om die rat te skakel, wat nie presies gebeur met my modelle nie.

Ek het baie kommentaar op my huidige weergawe van die kode gegee, wat vir my baie goed werk - verander gerus u opdrag of voeg nuwe funksies by. Die laaste 9 RC -kanale word tans nie gebruik nie.

Vir die opstelling moet die joystick -klas geïnisialiseer word, basies deur die numeriese asreeks te definieer:

/ * Stel asbereik (gedefinieer in die kop, 0 - 1000) */

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

Deur waardes van 0 tot 1000 te gebruik, is dit moontlik om die polslengte (600 - 1600µs) direk aan die joystick -waardes te koppel sonder om te herskaal.

Die DIN 3 word geïnisialiseer as digitale invoer, pullups geaktiveer en 'n onderbreking aangeheg:

pinMode (PPM_PIN, INPUT_PULLUP);

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

Vir ontfoutingsdoeleindes het ek gereeld afdrukke bygevoeg via die seriële koppelvlak met behulp van die arduino-timer biblioteek:

as (SERIAL_PRINT_INTERVAL> 0) {

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

Die onderbreking van die pen sal gebel word wanneer die logiese waarde van die pen verander het, dus vir elke rand in die PPM -sein. Evalueer die polslengte net deur eenvoudige tydsberekening met behulp van micros ():

uint32_t curTime = micros ();

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

Deur die toestand van die huidige pen te evalueer en dit te kombineer met die pulslengte en vorige pulse, kan die nuwe pulse geklassifiseer word. Die volgende voorwaardelike sal die tussenraam gaping opspoor:

if (lastState == 0 && pulslengte> 3000 && polslengte <6000)

Vir daaropvolgende pulse word die pulslengte in 'n as -toestand gekarteer deur die polslengte af te sny en te vooroordeel om by die joystick -asreeks te pas:

uint16_t rxLength = polslengte;

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

Die rxChannels -skikking bevat uiteindelik 16 waardes van 0 - 1000, wat dui op stok- / skuif- en knopposisies.

Nadat u 16 kanale ontvang het, word die kartering na die joystick uitgevoer:

/ * asse */

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

Ek het 'n paar asse in die kode omgekeer, wat absoluut nie nodig is nie, aangesien die as ook omgedraai kan word deur die servorigting of die opdrag in FSX om te draai. Ek het egter besluit om die servo -aanwysings en ook die oorspronklike FSX -opdrag te hou.

Die knoppie word deur kanaal 7 in- of uitgeskakel.

En moenie vergeet om die skeduleerder aan te merk nie … anders is geen ontfoutafdrukke sigbaar nie.

leemte -lus () {

scheduler.tick (); }

Op die skermkiekie wat ek aangeheg het, kan u sien dat kanaal 1 van 1000 (vol gas) na 0 (ledig) verskuif is.

FSX sal die Arduino opspoor net soos enige ander joystick, dus ken net die knoppie en byle toe en geniet dit!

Wat ek regtig van hierdie benadering hou, is dat u u sender net soos met 'n regte model kan gebruik, bv. met behulp van vlugfases, ens.

Aanbeveel: