Съдържание:

Ардуино базиран (JETI) PPM към USB джойстик конвертор за FSX: 5 стъпки
Ардуино базиран (JETI) PPM към USB джойстик конвертор за FSX: 5 стъпки

Видео: Ардуино базиран (JETI) PPM към USB джойстик конвертор за FSX: 5 стъпки

Видео: Ардуино базиран (JETI) PPM към USB джойстик конвертор за FSX: 5 стъпки
Видео: CAMPI FLEGREI: ITALY'S SUPERVOLCANO PT4: ERUPTION SIMULATION IN PRESENT DAY 2024, Ноември
Anonim
Ардуино базиран (JETI) PPM към USB джойстик конвертор за FSX
Ардуино базиран (JETI) PPM към USB джойстик конвертор за FSX
Ардуино базиран (JETI) PPM към USB джойстик конвертор за FSX
Ардуино базиран (JETI) PPM към USB джойстик конвертор за FSX

Реших да превключвам моя предавател JETI DC-16 от режим 2 в режим 1, който основно превключва дросела и асансьора отляво надясно и обратно. Тъй като не исках да разбия един от моделите си поради някакво объркване наляво/надясно в мозъка ми, се чудех дали е възможно да се упражнявам малко във FSX.

Прочетох и тествах JETI предавателите всъщност поддържат режим на джойстик извън кутията, но исках пълна гъвкавост при задаването на оси и превключватели и използвам TX като с истински модел. Използвайки изхода на приемника, също е възможно да се използва обработката на сигнала в DC-16 и да се използват миксери, фази на полет, двойни скорости, каквото можете да програмирате там.

Наскоро намерих хубав урок за това как да направя USB HID входно устройство, а именно джойстик, от евтин Arduino като Pro Micro:

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

Това би позволило всичко необходимо за управление на самолет / хеликоптер / каквото и да е във FSX! Налични са много оси и бутони.

Тъй като току -що имах резервен JETI RSAT2, реших да го свържа с Arduino и да се опитам да внедря малък PPM анализатор заедно с библиотеката на джойстика.

Предполагам, че всеки, който следва тези стъпки, е запознат със свързването и програмирането на Arduino. Няма да поемам никакви гаранции за неизправности или повреди!

Консумативи

Ще имаш нужда…

  • всеки Arduino, поддържан от библиотеката на джойстика, използвах Sparkfun Pro Micro 5V / 16 MHz
  • скорошна версия на Arduino IDE
  • всеки RC приемник, извеждащ PPM сигнал, като JETI RSAT2
  • няколко джъмперни проводника (мин. 3)
  • библиотеката на джойстика, инсталирана в IDE на Arduino
  • библиотеката на arduino-timer:

Стъпка 1: Свържете RX и Arduino

Свържете RX и Arduino
Свържете RX и Arduino
Свържете RX и Arduino
Свържете RX и Arduino

Окабеляването е доста просто. Реших да захранвам Arduino само от USB, тъй като той ще подражава на джойстик устройство. Това ще захранва Arduino с 5V, което може да се използва и за захранване на RC приемника.

Използвах Pin VCC, който осигурява регулиран изход, и най -близкия Gnd пин - просто го свържете към конектора на PPM + и -. Когато Arduino се захранва, приемникът също се включва.

За PPM сигнала реших да използвам прекъсвания, за да ги анализирам. Налични са прекъсвания, напр. на Pin 3, така че просто го свържете там - няма "естествен RC щифт" на arduino, но вероятно повече и различни начини за четене в сигнала на приемника.

Трябваше да деактивирам алармата за напрежение RX, тъй като напрежението на VCC с USB захранване ще бъде само около 4.5V - но доста стабилно, така че изобщо няма проблем.

Стъпка 2: Получаване на някои PPM сигнали

Получаване на някои PPM сигнали
Получаване на някои PPM сигнали
Получаване на някои PPM сигнали
Получаване на някои PPM сигнали

Когато приемникът и TX се захранват, получавах PPM сигнали, както е показано на изображението. 16 канала, повтарящи се завинаги. Ако Failsafe на RSAT е деактивиран и предавателят е изключен, PPM изходът ще бъде деактивиран.

Повече информация за PPM е достъпна тук:

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

Тъй като в този случай не летя с истински неща, не ми пукаше за теоретичните срокове и просто разбрах на осцилоскопа какво издава моят приемник акутално при преместване на пръчките от напълно наляво към напълно надясно (стандартни настройки в TX). Изглежда -100% съответства на импулси с дължина 600µs и +100% до 1600µs. Също така не ме интересуваше дължината на паузните импулси (400 μs) в кода ми на Arduino, но предположих, че интервалът между кадрите е мин. 3000 μs.

Стъпка 3: Конфигуриране на предавателя

Конфигуриране на предавателя
Конфигуриране на предавателя
Конфигуриране на предавателя
Конфигуриране на предавателя
Конфигуриране на предавателя
Конфигуриране на предавателя

Тъй като трябва да се знае само действителното положение на управляващите повърхности, един канал / "серво" за RC функция е достатъчен. Следователно може да се направи доста проста настройка на предавателя - подобна на нормален модел RC. Основните функции на елерона, асансьора, кормилото и дросела изискват само по едно серво, съответно предавателен канал. Добавих и клапани, спирачки и предавки, оставяйки 9 канала свободни досега. Моля, обърнете внимание, че клапите са поставени на полетна фаза и не се управляват директно чрез пръчка, плъзгач или бутон.

Стъпка 4: Изпълнете джойстика

Пускане на джойстика
Пускане на джойстика
Пускане на джойстика
Пускане на джойстика

Библиотеката на джойстика е доста лесна за използване и предоставя някои примери и тестове. Трябва да е полезно първо да проверите дали Arduino е открит като подходящ джойстик, инструкциите, свързани в секцията за въвеждане и самата библиотека, предоставят някои добри насоки.

В контролния панел на устройства и принтери Arduino се показваше като „Sparkfun Pro Micro“, а прозорецът на джойстика показваше 7 оси и много поддържани бутони. Дори превключвател за шапка може да се използва, когато е програмиран в Arduino.

Стъпка 5: Кодиране на Arduino

Кодиране на Arduino
Кодиране на Arduino
Кодиране на Arduino
Кодиране на Arduino

Това, което все още липсва, е действителното разбор на PPM сигнала и присвояване на оси и бутони на джойстика. Реших за следното картографиране:

Присвояване на канал / функция / джойстик:

  1. Дросел -> Оста на дросела
  2. Елерон -> ос X
  3. Асансьор -> ос Y
  4. Кормило -> ос на въртене X
  5. Клапи -> ос на въртене Y
  6. Спирачка -> ос Z
  7. Gear -> Бутон 0

Когато предавката е спусната, първият бутон на джойстика трябва да бъде натиснат и ще се освободи при повдигане на предавката. Това обаче ще изисква FSUIPC за FSX, извън кутията, FSX ще приеме само бутон за превключване на предавката, което не е точно това, което се случва с моите модели.

Предоставих текущата си версия на кода с много коментари, което работи доста добре за мен - не се колебайте да промените заданието си или да добавите нови функции. Последните 9 RC канала в момента не се използват.

За настройката класът джойстик трябва да бъде инициализиран, основно чрез определяне на диапазоните на числовите оси:

/ * Задайте диапазон на осите (дефиниран в заглавката, 0 - 1000) */

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

Чрез използване на стойности от 0 до 1000 е възможно директно да се съпостави дължината на импулса (600 - 1600µs) към стойностите на джойстика без преоразмеряване.

DIN 3 се инициализира като цифров вход, активирани издърпвания и прикрепено прекъсване:

pinMode (PPM_PIN, INPUT_PULLUP);

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

За отстраняване на грешки добавих някои разпечатки през серийния интерфейс на редовни интервали, използвайки библиотеката на arduino-timer:

ако (SERIAL_PRINT_INTERVAL> 0) {

Scheduler.every (SERIAL_PRINT_INTERVAL, (void*) -> bool {SerialPrintChannels (); връщане true;}); }

Прекъсването на щифта ще се извиква винаги, когато логическата стойност на щифта се е променила, така че за всеки ръб в PPM сигнала. Оценете дължината на импулса само чрез просто синхронизиране с помощта на micros ():

uint32_t curTime = micros ();

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

Чрез оценка на състоянието на текущия щифт и комбинирането му с дължината на импулса и миналите импулси, новите импулси могат да бъдат класифицирани. Следното условно ще открие междукадровата пропаст:

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

За следващите импулси дължината на импулса ще бъде картографирана в състояние на ос чрез изрязване и отклонение на дължината на импулса, за да съответства на обхвата на ос на джойстика:

uint16_t rxLength = pulseLength;

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

Масивът rxChannels в крайна сметка съдържа 16 стойности от 0 - 1000, показващи позиции на пръчки / плъзгачи и бутони.

След получаване на 16 канала, картографирането към джойстика се извършва:

/* брадви */

Joystick.setThrottle (канали [0]); Joystick.setXAxis (канали [1]); Joystick.setYAxis (1000 - канала [2]); Joystick.setRxAxis (канали [3]); Joystick.setRyAxis (канали [4]); Joystick.setZAxis (1000 - канала [5]); / * бутони */ Joystick.setButton (0, (канали [6] <500? 1: 0)); / * актуализиране на данни чрез USB */ Joystick.sendState ();

Обърнах някои оси в кода, което не е абсолютно необходимо, тъй като оста може да бъде обърната и чрез обръщане на серво посоката или присвояването във FSX. Реших обаче да запазя серво насоките, а също и оригиналното задание на FSX.

Бутонът се включва или изключва от праговия канал 7.

И не забравяйте да маркирате графика … в противен случай няма да се виждат отпечатъци за отстраняване на грешки.

void loop () {

Scheduler.tick (); }

На скрийншота, който прикачих, можете да видите, че канал 1 е преместен от 1000 (пълна газ) на 0 (празен ход).

FSX ще открие Arduino, както всеки друг джойстик, така че просто задайте бутона и осите и се забавлявайте при излитане!

Това, което наистина харесвам в този подход, е, че можете просто да използвате вашия предавател като с реален модел, напр. използване на полетни фази и др.

Препоръчано: