FPV гонки на симуляторе (делаем USB джойстик из пульта радиоуправления)
Зима в северных широтах — время, когда у FPV пилота появляется время, чтобы отдохнуть от гонок и постоянных поломок, взять в руки паяльник, и смастерить что-нибудь полезное для своего хобби.
Раз уж на улице летать холодно, то будем тренировать навыки пилотирования на симуляторах. Для этого нужно подключить свою радиоаппаратуру к компьютеру через специальный адаптер, который преобразует PPM сигнал с пульта в сигналы USB-джойстика, понятные компу. Такие адаптеры, конечно не редкость и стоят копейки в китайских магазинах. Однако доставки заказа ждать долго, да и будет ли он работать так как мы ожидали? Например у меня есть вот такой:
Он по каким-то, еще не постигнутым мною причинам, наотрез отказывается адекватно калиброваться в симуляторе FPV Freerider, хотя прекрасно работает в Phoenix RC и Aerofly RC 7. А FPV Freerider вполне неплохо передает физику акро-полета на гоночном коптере, да к тому же имеет бесплатный демо-режим.
Решено — делаем адаптер сами!
Немного матчасти:
Чтобы декодировать PPM нужно точно замерять интервалы времени между последовательными импульсами (при этом не имеет значения между какими фронтами: передними или задними, ведь длительность самих импульсов всегда одинакова).
Реализация:
Почерпнув вдохновения из статьи AlexeyStn о создании PPM-to-USB адаптера на базе STM32F3Discovery, но имея в распоряжении только Arduino Pro Micro (Leonardo) с аппаратной поддержкой USB, начнем несложный путь к своему адаптеру.
На гитхабе можно найти несколько похожих проектов, и некоторые даже не требуют аппаратного USB в контроллере. Однако большинство из них нужно серьезно допиливать напильником, чтобы получить нечто рабочее. Годным проектом оказался rc-leonardo-joy, который начал работать почти сразу после заливки скетча, но в нем тут же обнаружились некоторые недостатки: все показания джойстика были не очень стабильными — маркер курсора в панели управления все время плясал вокруг установленной точки. Не могу сказать, что это существенно влияло на управляемость в симуляторе, но мы ведь хотим тренироваться на хорошей аппаратуре!
Что ж, лезем в код и видим: вычисление ширины импульса PPM сделано через обработку внешнего прерывания и замер интервалов между вызовами функции micros():
Читаем о функции micros() в документации Arduino:
Returns the number of microseconds since the Arduino board began running the current program. This number will overflow (go back to zero), after approximately 70 minutes. On 16 MHz Arduino boards (e.g. Duemilanove and Nano), this function has a resolution of four microseconds (i.e. the value returned is always a multiple of four). On 8 MHz Arduino boards (e.g. the LilyPad), this function has a resolution of eight microseconds.
То есть мало того, что функция не отличается особой точностью и всегда возвращает значения кратные 4 мкс, так она еще и переполнится через 70 минут, выдав нам какое-нибудь кривое значение замеренного интервала. Не годится. Лучше будет использовать таймер и его прерывания по захвату внешних сигналов.
Смотрим дальше: большая часть данных о положении джойстика искусственно ограничены одним байтом (0-255):
Хм, хотелось бы поточнее. Но для этого придется перепилить HID дескриптор и поправить все сопутствующие типы данных.
Сказано — сделано!
Форкаем репозиторий, переписываем код на использование таймера для отсчета PPM интервалов:
Увеличиваем интервалы отклонения стиков до 0-1000 в HID descriptor:
Попутно меняем uint8_t на uint16_t везде где передаются значения отклонений стиков.
Убираем лишний код, добавляем десяток #define и получается неплохой скетч, заточенный на работу в качестве адаптера PPM-USB.
Настройки скетча:
Имеет смысл убрать дефайн для футабы, если у вас другая аппаратура:
и по-необходимости подстроить значения микросекунд в параметрах, если ваша аппаратура выдает другие тайминги:
Компиляция:
Чтобы скомпилировать и залить скетч, нужно подменить библиотеки работы с USB в самой среде Arduino, предварительно сделав бэкапы.
Для этого идем в недра Arduino по пути . \Arduino\hardware\arduino\cores\arduino\, бэкапим usbapi.h и hid.cpp, после чего перезаписываем их одноименными файлами из папки ArduinoLibs репозитория. Далее открываем скетч, подключаем Arduino Leonardo и заливаем.
Подключение:
В Windows 7 устройство распознается как составное (клавиатура, мышь, джойстик) с именем Arduino Leonardo.
Отдельного упоминания заслуживает разъем в аппаратуре. Где-то это обычный аудио-джек, а где-то (как в моей Futaba 7C) – нечто похитрее:
Для сборки различных «папа»-разъемов я уже давно успешно использую горячий клей. Для этого кладем на «маму» бумагу, или полиэтилен, протыкаем эту подложку пинами, чтобы они воткнулись в разъем с другой стороны, а затем постепенно заливаем между пинами клей, попутно придавая ему форму мокрыми пальцами. Провода, конечно, нужно припаять заранее, чтобы не расплавить застывший клей при пайке. Получается не всегда эстетично, но весьма функционально:
(Здесь в разъеме 4 штырька нужны для однозначного позиционирования, рабочих только два.)
Вот и все. Качаем симулятор, подключаем аппаратуру и тренируем навыки пилотирования, попивая горячий чай перед камином темными зимними вечерами.
Что делать если нет Arduino Leonardo, но есть вот такая Minimum Development Board на STM32F103C8T6?
Не волнуйтесь, все путем. Для вас, а также для собственного развития, я портировал уже упомянутый проект Алексея Станкевича.
Исходники и скомпилированные бинарники для заливки в этот контроллер можно найти здесь: github.com/voroshkov/STM32-RC-USB-Adapter.
На все вопросы с удовольствием отвечу в комментах.
Источник
Пульт радиоуправления моделями своими руками
Всем привет. Представляю на общее обозрение самодельный пульт радиоуправления для управления различными объектами на расстоянии. Это может быть машинка, танк, катер и т.д. изготовленное мной для “детского” радио кружка. С применением радио модуля NRF24L01 и микроконтроллера ATMEGA16.
Давно у меня лежала коробка одинаковых поломанных игровых джойстиков от приставок. Досталась от игрового заведения. Особого применения в неисправных игровых джойстиках я не видел, да и выкидывать или разбирать жалко. Вот и стояла коробка мертвым грузом пылилась. Идея применения игровых джойстиков, пришла, как только пообщался со своим приятелем. Приятель вел кружок для юных радиолюбителей в интернате, причем бесплатно по выходным, приобщал любознательных детишек к миру радиоэлектроники. Дети они ведь как губка, впитывают информацию. Так как я сам очень приветствую подобные кружки для детей, а тут еще и в таком месте. То и предложил идею, как задействовать нерабочие джойстики. Идея заключалась в следующем: создать самодельный радио дистанционный пульт управления моделями, собранными своими руками, который хотелось бы предложить детям для изучения проекта. Идея ему очень понравилась, учитывая, что финансирование детских учреждений мягко сказать не очень, да и мне был интересен данный проект. Пускай я тоже внесу свою лепту в развитие радио кружка.
Цель проекта создать законченное устройство не только как радио дистанционный пульт, но и ответную часть на радиоуправляемый объект. Учитывая, что пульт для детей то и подключение приёмной части на модель, также должно быть по возможности простым.
Сборка и комплектующие:
Разобрав игровой джойстик на составляющие, сразу стало ясно, нужно изготовить новую печатную плату, причем, весьма необычной формы. Сначала, хотел развести печатную плату на микроконтроллер ATMEGA48, но как оказалось портов микроконтроллера просто не хватает под все кнопки. Конечно, такое количество кнопок в принципе не нужно и можно было ограничиться только четырьмя портами микроконтроллера АЦП для двух джойстиков и два порта для тактовых кнопок, размещенных на джойстиках. Но мне захотелось по возможности максимально большое количество кнопок задействовать, кто знает, чего там детишки ещё захотят добавить. Так была рождена печатная плата под микроконтроллер ATMEGA16. Сами микроконтроллеры у меня были в наличии, остались от какого-то проекта.
Резинки на кнопках очень сильно были изношены, и восстановлению не подлежали. Но это не удивительно учитывая, где джойстики использовались. По этой причине применил тактовые кнопки. Пожалуй, к минусам тактовых кнопок можно отнести сильное щелканье, возникавшие в результате нажатия на кнопку. Но для данного проекта это весьма терпимо.
Плату с джойстиками не пришлось переделывать, оставил какая есть, что значительно сэкономило времени. Торцевые кнопки также сохранил в первоначальном виде.
В качестве приемопередатчика выбрал радиомодуль NRF24L01, так как цена весьма мала в Китае по цене 0.60$ за шт. купил. Несмотря на свою малую стоимость, радиомодуль обладает не малыми возможностями и конечно мне подходил. Следующей проблемой, с которой столкнулся, а собственно где радиомодуль разместить. Пространство в корпусе свободного маловато, по этой причине радио модуль разместил в одной из ручек корпуса джойстика. Даже фиксировать не пришлось, модуль плотно прижимался, когда собирался полностью корпус.
Пожалуй, самой большой проблемой стал вопрос с питанием для радио пульта. Покупка каких-то специализированных аккумуляторов, скажем литиевых, влетало в немалую копеечку, так как собирать решено было семь комплектов. Да и оставшееся свободное пространство в корпусе не очень позволяло использовать стандартные аккумуляторы серии AA. Хотя потребление и не значительное можно использовать разные подходящие источники питания. Как всегда, на помощь пришла дружба, коллега на работе подогнал аккумуляторы литиевые плоские от мобильных телефонов и бонусом зарядки к ним. Все же немного пришлось переделать их, но это незначительно и гораздо лучше, чем делать с нуля зарядку для аккумуляторов. Вот на плоских литиевых аккумуляторах я и остановился.
В процессе испытания радио модуль, свою заявленную дальность оправдал и уверенно работал по прямой видимости на расстоянии 50 метров, через стены дальность значительно уменьшилась. Также было в планах установить вибромотор, который реагировал, скажем на какие-то столкновения или другие действия в радиоуправляемой модели. В связи с этим предусмотрел на печатной плате транзисторный ключ для управления. Но дополнительные усложнения я оставил на потом сначала нужно обкатать программу, так как она ещё сыровата. Да и конструкция, учитывая, что это прототип требует мелких доработок. Вот так как говорится “с миру по нитке”, практически с минимальными вложениями был создан пульт радиоуправление.
Источник
Аппаратура радиоуправления на Arduino
Для передатчика понадобятся:
1 x Arduino NANO/UNO/ProMini
1 x Плата защиты BMS для трех Li-ion банок
1 x разъем 5,5 x 2,1 мм
1 x повышающий DC/DC преобразователь XL6009
1 x небольшой понижающий преобразователь LM2596 (о нем скажу отдельно)
3 x 18650 :
2 x джойстики JH-D202X (продаются на али)
2 x тумблер
1 x i2c OLED-экран 0,96 дюйма 128X64
1 x радио модуль NRF24l01 с усилителем и антенной
9 x тактовая кнопка 6 * 6 * 5 мм
Резисторы выводные (смотри схему)
Для приемника понадобятся:
1 х Arduino NANO/UNO/Pro Mini
1 х радио модуль NRF24l01
1 х AMS1117 3,3 В стабилизатор напряжения
30 х PLS гребенки
1 х макетная плата
1 х 10 мкФ конденсатор
Кнопки соединяются между собой резисторами, таким образом по сути выходит небольшая резистивная клавиатура, что позволяет использовать всего один вывод платы ардуино. К потенциометрам джойстиков припаиваются провода, крайние выводы идут на землю и 5 В, средний на соответствующий вывод Arduino. У меня в планах повторить эту схему, уже немного поэкспериментировал и могу сказать, что в коде заложена функция автоматического инвертирования каналов по необходимости, однако я пока не понял, как схема определяет эту самую необходимость. Это я к тому, что так-то инвертирование канала по сути производиться перепаиванием крайних выводов местами. Такие джойстики, на момент написания статьи, продаются на али по цене примерно 7 долларов за штуку, много это или мало решать Вам. Вместо них можно использовать модули джойстиков для ардуино или джойстики от игровых манипуляторов.
По сути джойстик работает как делитель, отклоняя ручку мы меняем напряжение на среднем выводе потенциометра, и в зависимости от этого напряжения ардуино определяет отклонение.
[center] [/center]
Так же подключаются и тумблеры. Тумблеры нужны двухпозиционные, так как канал дискретный и имеет только два значения — 0 или 1, в зависимости от того, к чему притягивается вывод ардуино — к земле или питанию 5 В. При чем обязательно двухпозиционный, если оставить вывод «висеть в воздухе», что было бы при использовании трех позиционного, контроллер не понимает что происходит и значение рандомно скачет то 0, то 1 (по моим опытам). Дополнительные потенциометры можете не ставить, на данный момент они не задействованы. А можете поставить и мониторить страницу источника, возможно автор со временем выложит обновленную прошивку.
Источник