Inhoudsopgave:

Arduino-gebaseerde (JETI) PPM naar USB-joystick-converter voor FSX - Ajarnpa
Arduino-gebaseerde (JETI) PPM naar USB-joystick-converter voor FSX - Ajarnpa

Video: Arduino-gebaseerde (JETI) PPM naar USB-joystick-converter voor FSX - Ajarnpa

Video: Arduino-gebaseerde (JETI) PPM naar USB-joystick-converter voor FSX - Ajarnpa
Video: USB joystick to PPM via RC 2024, November
Anonim
Arduino-gebaseerde (JETI) PPM naar USB-joystick-converter voor FSX
Arduino-gebaseerde (JETI) PPM naar USB-joystick-converter voor FSX
Arduino-gebaseerde (JETI) PPM naar USB-joystick-converter voor FSX
Arduino-gebaseerde (JETI) PPM naar USB-joystick-converter voor FSX

Ik besloot mijn JETI DC-16-zender van modus 2 naar modus 1 te schakelen, die in feite Throttle en Elevator van links naar rechts en vice versa schakelt. Omdat ik niet een van mijn modellen wilde laten crashen vanwege wat links/rechts verwarring in mijn hoofd, vroeg ik me af of het mogelijk is om een beetje te oefenen in FSX.

Ik heb gelezen en getest dat de JETI-zenders uit de doos daadwerkelijk een Joystick-modus ondersteunen, maar ik wilde volledige flexibiliteit voor de assen en schakelaars en de TX gebruiken zoals bij een echt model. Door de uitgang van de ontvanger te gebruiken, is het ook mogelijk om de signaalverwerking in de DC-16 te benutten en mixers, vliegfasen, dubbele snelheden te gebruiken, wat je daar ook kunt programmeren.

Onlangs vond ik een leuke tutorial over het maken van een USB HID-invoerapparaat, namelijk een Joystick, van een goedkope Arduino zoals een Pro Micro:

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

Dit zou alles mogelijk maken om een vliegtuig / helikopter / wat dan ook in FSX te besturen! Tal van assen en knoppen beschikbaar.

Omdat ik net een reserve JETI RSAT2 had, besloot ik om het aan te sluiten op de Arduino en te proberen een kleine PPM-parser te implementeren samen met de Joystick-bibliotheek.

Ik neem aan dat iedereen die deze stappen volgt, bekend is met het aansluiten en programmeren van een Arduino. Ik aanvaard geen garanties voor storingen of beschadigingen!

Benodigdheden

Je zal nodig hebben…

  • elke Arduino ondersteund door de Joystick-bibliotheek, ik gebruikte een Sparkfun Pro Micro 5V / 16 MHz
  • een recente versie van de Arduino IDE
  • elke RC-ontvanger die een PPM-signaal uitvoert, zoals de JETI RSAT2
  • een paar jumperdraden (min. 3)
  • de Joystick-bibliotheek geïnstalleerd in de Arduino IDE
  • de arduino-timer bibliotheek:

Stap 1: Sluit de RX en de Arduino aan

Sluit de RX en de Arduino aan
Sluit de RX en de Arduino aan
Sluit de RX en de Arduino aan
Sluit de RX en de Arduino aan

De bedrading is vrij eenvoudig. Ik heb besloten om de Arduino alleen van stroom te voorzien via USB, omdat het een Joystick-apparaat zal emuleren. Dit zal de Arduino van 5V voorzien, die ook kan worden gebruikt voor het voeden van de RC-ontvanger.

Ik gebruikte de Pin VCC, die gereguleerde uitvoer levert, en de dichtstbijzijnde Gnd-pin - sluit hem gewoon aan op de PPM-connector + en - pinnen. Wanneer de Arduino wordt gevoed, wordt de ontvanger nu ook ingeschakeld.

Voor het PPM-signaal besloot ik interrupts te gebruiken om ze te ontleden. Onderbrekingen zijn beschikbaar b.v. op Pin 3, dus sluit hem daar gewoon aan - er is geen "native RC-pin" op de Arduino, maar mogelijk meer en verschillende manieren om het ontvangersignaal in te lezen.

Ik moest het RX-spanningsalarm uitschakelen, omdat de VCC-spanning met USB-voeding slechts rond de 4,5 V zal zijn - maar redelijk stabiel, dus helemaal geen probleem.

Stap 2: Sommige PPM-signalen krijgen

Enkele PPM-signalen ontvangen
Enkele PPM-signalen ontvangen
Enkele PPM-signalen ontvangen
Enkele PPM-signalen ontvangen

Wanneer de ontvanger EN de TX van stroom worden voorzien, kreeg ik PPM-signalen zoals weergegeven in de afbeelding. 16 kanalen, voor altijd herhaald. Als Failsafe op de RSAT is uitgeschakeld en de zender is uitgeschakeld, wordt de PPM-uitvoer uitgeschakeld.

Meer informatie over PPM vindt u hier:

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

Aangezien ik in dit geval geen echte dingen vlieg, gaf ik niet om de theoretische timing en kwam ik er net op de oscilloscoop achter wat mijn ontvanger acuut uitvoerde bij het verplaatsen van de sticks van volledig links naar volledig rechts (standaardinstellingen in de TX). Het leek erop dat -100% overeenkomt met pulsen met een lengte van 600µs, en +100% tot 1600µs. Ik gaf ook niet om de lengte van de pauzepulsen (400 µs) in mijn Arduino-code, maar ik ging uit van een frameafstand van min. 3000 µs.

Stap 3: De zender configureren

De zender configureren
De zender configureren
De zender configureren
De zender configureren
De zender configureren
De zender configureren

Omdat alleen de actuele positie van de bedieningsvlakken bekend hoeft te zijn, is één kanaal / "servo" per RC-functie voldoende. Bijgevolg kan een vrij eenvoudige zenderconfiguratie worden gemaakt - vergelijkbaar met een normaal RC-model. De hoofdfuncties rolroer, hoogteroer, roer en gas hebben elk slechts één servo- respectievelijk zenderkanaal nodig. Ik heb ook kleppen, remmen en uitrusting toegevoegd, waardoor er tot nu toe 9 kanalen vrij zijn. Houd er rekening mee dat Flaps op een vliegfase zijn gezet en niet rechtstreeks worden bestuurd via een stick, slider of knop.

Stap 4: De joystick gebruiken

De joystick gebruiken
De joystick gebruiken
De joystick gebruiken
De joystick gebruiken

De Joystick-bibliotheek is vrij eenvoudig te gebruiken en biedt enkele voorbeelden en tests. Het zou handig moeten zijn om eerst te controleren of de Arduino wordt gedetecteerd als de juiste joystick, de instructies in het invoergedeelte en de bibliotheek zelf bieden goede richtlijnen.

In het configuratiescherm Apparaten en printers werd de Arduino weergegeven als "Sparkfun Pro Micro", en het joystick-testvenster toonde 7 assen en veel ondersteunde knoppen. Zelfs een hat-schakelaar kan worden gebruikt wanneer deze in de Arduino is geprogrammeerd.

Stap 5: De Arduino coderen

De Arduino coderen
De Arduino coderen
De Arduino coderen
De Arduino coderen

Wat nog ontbreekt is de daadwerkelijke ontleding van het PPM-signaal en de toewijzing aan Joystick-assen en -knoppen. Ik heb gekozen voor de volgende mapping:

Kanaal / Functie / Joystick-toewijzing:

  1. Gasklep -> Gasklepas
  2. Rolroer -> X-as
  3. Lift -> Y-as
  4. Roer -> X-rotatie-as
  5. Flappen -> Y-rotatie-as
  6. Rem -> Z-as
  7. Versnelling -> Knop 0

Wanneer de versnelling omlaag is, wordt de eerste knop van de joystick ingedrukt en wordt deze losgelaten wanneer de versnelling omhoog gaat. Dit vereist echter FSUIPC voor FSX, uit de doos accepteert FSX alleen een knop om de versnelling te schakelen, wat niet precies is wat er gebeurt met mijn modellen.

Ik heb mijn huidige versie van de code voorzien van veel opmerkingen, wat best goed werkt voor mij - voel je vrij om je opdracht te wijzigen of nieuwe functies toe te voegen. De laatste 9 RC-kanalen worden momenteel niet gebruikt.

Voor de installatie moet de Joystick-klasse worden geïnitialiseerd, in principe door de numerieke asbereiken te definiëren:

/* Asbereik instellen (gedefinieerd in de kop, 0 - 1000) */

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

Door waarden van 0 tot 1000 te gebruiken, is het mogelijk om de pulslengte (600 - 1600 µs) direct toe te wijzen aan de joystickwaarden zonder opnieuw te schalen.

De DIN 3 wordt geïnitialiseerd als digitale ingang, pullups ingeschakeld en een interrupt aangesloten:

pinMode (PPM_PIN, INPUT_PULLUP);

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

Voor foutopsporingsdoeleinden heb ik met regelmatige tussenpozen enkele afdrukken via de seriële interface toegevoegd, met behulp van de arduino-timerbibliotheek:

if(SERIAL_PRINT_INTERVAL > 0) {

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

De interrupt van de pin wordt aangeroepen wanneer de logische waarde van de pin is gewijzigd, dus voor elke flank in het PPM-signaal. Evalueer de pulslengte door eenvoudige timing met micros():

uint32_t curTime = micros();

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

Door de status van de huidige pin te evalueren en deze te combineren met de pulslengte en eerdere pulsen, kunnen de nieuwe pulsen worden geclassificeerd. De volgende voorwaardelijke zal de interframe-gap detecteren:

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

Voor volgende pulsen wordt de pulslengte toegewezen aan een asstatus door de pulslengte te knippen en te vertekenen zodat deze overeenkomt met het asbereik van de joystick:

uint16_t rxLength = pulslengte;

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

De rxChannels-array bevat uiteindelijk 16 waarden van 0 - 1000, die stick / slider en knopposities aangeven.

Na ontvangst van 16 kanalen wordt de mapping naar de joystick uitgevoerd:

/* assen */

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

Ik heb enkele assen in de code omgekeerd, wat niet absoluut nodig is, omdat de as ook kan worden omgekeerd door de servorichting om te draaien of de toewijzing in FSX. Ik besloot echter om de servo-richtingen en ook de originele FSX-toewijzing te behouden.

De knop wordt in- of uitgeschakeld door drempelwaarde kanaal 7.

En vergeet niet de planner aan te vinken…anders zijn er geen foutopsporingsafdrukken zichtbaar.

lege lus() {

planner.tick(); }

In de screenshot die ik heb bijgevoegd, kun je zien dat kanaal 1 is verplaatst van 1000 (vol gas) naar 0 (inactief).

FSX detecteert de Arduino net als elke andere joystick, dus wijs gewoon de knop en assen toe en veel plezier bij het opstijgen!

Wat ik erg leuk vind aan deze aanpak, is dat je je zender gewoon kunt gebruiken zoals bij een echt model, b.v. gebruik vluchtfasen etc.

Aanbevolen: