Obsah:

Převodník Joystick PPM na USB založený na Arduino (JETI) pro FSX: 5 kroků
Převodník Joystick PPM na USB založený na Arduino (JETI) pro FSX: 5 kroků

Video: Převodník Joystick PPM na USB založený na Arduino (JETI) pro FSX: 5 kroků

Video: Převodník Joystick PPM na USB založený na Arduino (JETI) pro FSX: 5 kroků
Video: Симулятор джойстика для аппаратуры управления на arduino / ppm 2024, Prosinec
Anonim
Převodník Joystick PPM na USB založený na Arduino (JETI) pro FSX
Převodník Joystick PPM na USB založený na Arduino (JETI) pro FSX
Převodník joysticku PPM na USB založený na Arduino (JETI) pro FSX
Převodník joysticku PPM na USB založený na Arduino (JETI) pro FSX

Rozhodl jsem se přepnout svůj vysílač JETI DC-16 z režimu 2 do režimu 1, který v podstatě přepíná škrticí klapku a elevátor zleva doprava a naopak. Vzhledem k tomu, že jsem kvůli nějakému zmatku vlevo/vpravo v mozku nechtěl jeden ze svých modelů rozbít, přemýšlel jsem, zda je možné ve FSX trochu cvičit.

Přečetl jsem a otestoval, zda vysílače JETI skutečně podporují režim joysticku, ale chtěl jsem plnou flexibilitu pro přiřazení os a přepínačů a používat TX jako u skutečného modelu. Pomocí výstupu přijímače je také možné využít zpracování signálu v DC-16 a použít mixéry, letové fáze, duální sazby, cokoli, co tam můžete naprogramovat.

Nedávno jsem našel pěkný návod, jak z levného Arduina, jako je Pro Micro, vyrobit USB HID vstupní zařízení, konkrétně Joystick:

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

To by umožnilo vše potřebné k ovládání letadla / helikoptéry / čehokoli v FSX! K dispozici je spousta seker a tlačítek.

Protože jsem právě měl náhradní JETI RSAT2, rozhodl jsem se jej propojit s Arduinem a zkusit implementovat malý PPM parser společně s knihovnou Joystick.

Předpokládám, že někdo po těchto krocích je obeznámen s připojením a programováním Arduina. Nepřijímám žádné záruky za poruchy nebo poškození!

Zásoby

Budete potřebovat…

  • jakékoli Arduino podporované knihovnou Joystick, použil jsem Sparkfun Pro Micro 5V / 16 MHz
  • nedávná verze Arduino IDE
  • jakýkoli RC přijímač s výstupem signálu PPM, jako JETI RSAT2
  • několik propojovacích vodičů (min. 3)
  • knihovna Joystick nainstalovaná v Arduino IDE
  • knihovna arduino-timer:

Krok 1: Zapojte RX a Arduino

Zapojte RX a Arduino
Zapojte RX a Arduino
Zapojte RX a Arduino
Zapojte RX a Arduino

Zapojení je celkem jednoduché. Rozhodl jsem se napájet Arduino pouze z USB, protože bude emulovat zařízení Joystick. To dodá Arduinu 5V, které lze použít také pro napájení RC přijímače.

Použil jsem Pin VCC, který poskytuje regulovaný výstup, a nejbližší pin Gnd - stačí jej připojit ke konektorům + a - pinů PPM. Když se Arduino začne napájet, přijímač se nyní také zapne.

U signálu PPM jsem se rozhodl použít přerušení k jejich analýze. Přerušení jsou k dispozici např. na Pin 3, tak to tam prostě připojte - na arduinu není žádný „nativní RC pin“, ale možná více a různých způsobů čtení signálu přijímače.

Musel jsem deaktivovat alarm napětí RX, protože napětí VCC s napájením USB bude pouze kolem 4,5 V - ale docela stabilní, takže vůbec žádný problém.

Krok 2: Získání signálů PPM

Získání signálů PPM
Získání signálů PPM
Získání signálů PPM
Získání signálů PPM

Když je přijímač AND TX napájen, přijímal jsem signály PPM, jak je znázorněno na obrázku. 16 kanálů, stále se opakujících. Pokud je Failsafe na RSAT deaktivováno a vysílač je vypnutý, výstup PPM bude deaktivován.

Více informací o PPM je k dispozici zde:

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

Vzhledem k tomu, že v tomto případě nelétám skutečné věci, nestaral jsem se o teoretická načasování a jen jsem na osciloskopu zjistil, co můj přijímač akutně vydával při pohybu páček z úplně doleva zcela doprava (standardní nastavení v TX). Zdálo se, že -100% odpovídá pulsům o délce 600 µs a +100% až 1600 µs. Také jsem se nestaral o délku pauzových impulzů (400 µs) v mém kódu Arduino, ale předpokládal jsem rozestup snímků min. 3000 µs.

Krok 3: Konfigurace vysílače

Konfigurace vysílače
Konfigurace vysílače
Konfigurace vysílače
Konfigurace vysílače
Konfigurace vysílače
Konfigurace vysílače

Protože je třeba znát pouze skutečnou polohu ovládacích ploch, stačí jeden kanál / „servo“na RC funkci. V důsledku toho lze provést poměrně jednoduché nastavení vysílače - podobné běžnému RC modelu. Hlavní funkce křidélek, výškovky, směrovky a škrticí klapky vyžadují pouze jedno servo, respektive kanál vysílače. Také jsem přidal klapky, brzdy a rychlostní stupeň, takže zatím bylo 9 kanálů volných. Vezměte prosím na vědomí, že klapky byly použity ve fázi letu a nejsou ovládány přímo páčkou, posuvníkem nebo tlačítkem.

Krok 4: Spuštění joysticku

Ovládání joysticku
Ovládání joysticku
Ovládání joysticku
Ovládání joysticku

Knihovna Joystick se velmi snadno používá a poskytuje několik příkladů a testů. Mělo by být užitečné nejprve zkontrolovat, zda je Arduino detekován jako správný joystick, pokyny propojené v vstupní části a samotná knihovna poskytují dobré vodítko.

Na ovládacím panelu Zařízení a tiskárny se Arduino zobrazovalo jako „Sparkfun Pro Micro“a testovací okno joysticku ukazovalo 7 os a spoustu podporovaných tlačítek. Při programování v Arduinu lze použít i kloboukový spínač.

Krok 5: Kódování Arduina

Kódování Arduina
Kódování Arduina
Kódování Arduina
Kódování Arduina

Co stále chybí, je skutečná analýza signálu PPM a přiřazení os a tlačítek joysticku. Rozhodl jsem se pro následující mapování:

Přiřazení kanálu / funkce / joysticku:

  1. Plyn -> Osa plynu
  2. Křidélka -> osa X
  3. Výtah -> osa Y
  4. Kormidlo -> osa rotace X
  5. Klapky -> osa rotace Y
  6. Brzda -> osa Z.
  7. Gear -> Tlačítko 0

Když je zařazený rychlostní stupeň, musí být stisknuto první tlačítko joysticku, které se uvolní při zvednutí rychlostního stupně. To však bude vyžadovat FSUIPC pro FSX, po vybalení bude FSX akceptovat pouze tlačítko pro přepínání rychlostního stupně, což se u mých modelů zrovna neděje.

Poskytl jsem své aktuální verzi kódu spoustu komentářů, což mi funguje docela dobře - můžete změnit své přiřazení nebo přidat nové funkce. Posledních 9 RC kanálů se aktuálně nepoužívá.

Pro nastavení je třeba inicializovat třídu Joystick, v zásadě definováním rozsahů číselné osy:

/ * Nastavit rozsah os (definováno v záhlaví, 0 - 1000) */

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

Použitím hodnot od 0 do 1000 je možné přímo mapovat délku pulsu (600 - 1600 µs) na hodnoty joysticku bez změny měřítka.

DIN 3 je inicializována jako digitální vstup, povoleny pullupy a připojeno přerušení:

pinMode (PPM_PIN, INPUT_PULLUP);

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

Pro účely ladění jsem přidal několik výtisků přes sériové rozhraní v pravidelných intervalech pomocí knihovny arduino-timer:

if (SERIAL_PRINT_INTERVAL> 0) {

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

Přerušení pinu bude vyvoláno vždy, když se změní logická hodnota pinu, tedy pro každou hranu v signálu PPM. Vyhodnoťte délku impulsu jednoduchým načasováním pomocí micro ():

uint32_t curTime = micros ();

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

Vyhodnocením aktuálního stavu kolíku a jeho kombinací s délkou pulsu a minulými impulsy lze klasifikovat nové impulsy. Následující podmíněné zjistí mezeru mezi snímky:

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

U následujících impulsů bude délka pulsu mapována do stavu osy oříznutím a posunutím délky pulsu tak, aby odpovídala rozsahu osy joysticku:

uint16_t rxLength = pulseLength;

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

Pole rxChannels nakonec obsahuje 16 hodnot od 0 do 1000, které označují polohy páčky / posuvníku a tlačítka.

Po přijetí 16 kanálů se provede mapování na joystick:

/* sekery */

Joystick.setThrottle (kanály [0]); Joystick.setXAxis (kanály [1]); Joystick.setYAxis (1000 kanálů [2]); Joystick.setRxAxis (kanály [3]); Joystick.setRyAxis (kanály [4]); Joystick.setZAxis (1000 kanálů [5]); / * tlačítka */ Joystick.setButton (0, (kanály [6] <500? 1: 0)); / * aktualizace dat přes USB */ Joystick.sendState ();

Obrátil jsem některé osy v kódu, což není absolutně nutné, protože osu lze také převrátit překlopením směru serva nebo přiřazením v FSX. Rozhodl jsem se však zachovat směry serv a také původní přiřazení FSX.

Tlačítko se zapíná nebo vypíná prahem kanálu 7.

A nezapomeňte zaškrtnout plánovač … v opačném případě nebudou vidět žádné výtisky ladění.

prázdná smyčka () {

scheduler.tick (); }

Na obrázku, který jsem připojil, vidíte, že kanál 1 byl přesunut z 1000 (plný plyn) na 0 (nečinný).

FSX detekuje Arduino stejně jako jakýkoli jiný joystick, takže stačí přiřadit tlačítko a osy a užít si start!

To, co se mi na tomto přístupu opravdu líbí, je, že svůj vysílač můžete používat jako u skutečného modelu, např. pomocí letových fází atd.

Doporučuje: