Доработка коптера Parrot Ardrone 2 под полноценную радиоаппаратуру (мод MiruMod)



Подарили мне квадрокоптер Parrot Ardrone 2. Далее буду звать его дроном. Интересная вещица, но обладает существенным недостатком: управляется через Wi-Fi и дальнобойность составляет в лучшем случае метров 50. У меня заканчивалась раньше. Например, поднял его метров на 20-30, подул ветер, сдул немного, и все, ты уже вне зоны доступа. Однажды он у меня так улетел в лес - к счастью, я его нашел.

Изучение большой темы про этот дрон на форуме rcdesign.ru дало два способа увеличения дальности: поставить усилитель Wi-Fi или сделать специальный "мод" для того, чтобы дроном можно было управлять классической пропорциональной радиоаппаратурой. Первый вариант мне не понравился, поскольку был каким-то половинчатым решением (дальность увеличивается незначительно, да и неудобное управление с сенсорного экрана планшета остается). Вариант с модом мне показался гораздо более привлекательным. К тому же, год назад мне подарили радиоуправляемый планер, а я ни разу его не запускал, поскольку не умею им управлять и не представляю, как можно предварительно потренироваться, не разбив его. В общем, временно я с него снял радиоаппаратуру и приступил к изучению мода.

Данный мод создал некий товарищ Miru, проживающий в канаде. На его сайте (http://mirumod.tk) есть и схемы, и доки, и все остальное. Если вкратце, то суть мода такова. Фактически мод - это посредник между приемником радиоаппаратуры и последовательным портом дрона (да, у него на плате есть такой). Этот посредник реализован на плате Arduino Pro Mini, то бишь реально на микроконтроллере AVR. Он считывает сигнал с приемника и передает в дрон управляющие команды. В сам дрон нужно еще загрузить программу-компаньон, посредник делает это сам автоматически. Эта программа-компаньон парсит мегасы от мода и управляет дроном, используя его API (сам дрон работает на Линуксе).

Выяснилась еще одна проблема, специфичная именно для меня. Моду требуется миниум пятиканальная аппаратура (4 канала управления полетом + 1 канал на команду взлета/посадки), а у меня была только 4х-канальная, и покупать другую я не собирался. Но поскольку исходник мода - открытый, то можно было что-то придумать (и об этом я скажу далее).

В общем, скачал я этот исходник и начал в него погружаться. И в целом о творчестве товарища Miru сложилось двоякое впечатление. С одной стороны, он проделал большую работу, сам мод достаточно широко настраивается, часть - в коде, часть - в процессе работы (различными комбинациями положения ручек на радиоаппаратуре). И на форуме активно отвечает. С другой стороны, этот исходник - просто адский говнокод. 70 Кб кода на Си в одном файле. Да, он немного откомментирован, но нормальные названия переменных - нет, не слышал. Я, конечно, понимаю, что в целом на Си под МК часто используется такой стиль, но, блин, он нифига не читается нормально. Все переменные сокращены до 3-4 букв, и поди догадайся, что это означает (попробуйте догадаться, что хранится в "gl.rxs.fms").

А теперь добавьте к этому еще крайнюю убогость среды разработки Arduino (по факту это практически блокнот)... В общем, для первоначального изучения я создал проект в Visual Studio, импортировал туда этот исходник, и начал хотя бы сворачивать функции в #region, расставлять свои комментарии по мере изучения. Разумеется, в студии ничего не компилируется - я ее использовал просто как удобный навигатор по коду (хотя конечно в таком исходнике Intellisence работать не будет).

Некоторые подсказки по коду я приведу в конце. А в первую очередь мне надо было заставить этот код работать с моей 4х-канальной аппаратурой. В общем-то, задача была несложная - придумать, как сымитировать 5-й канал и заставить дрон взлететь или сесть. Я решил сделать просто: если немного газ вверх - взлетаем, если до упора вниз - садимся. В полете положение "до упора вниз" все равно никогда не нужно, обычно используется положение стика где-то посерединке.

Покопавшись в исходниках, я нашел, как это сделать. Внес правки и приступил к сборке самой схемы, хотя бы для проверки, что все работает.

Вот фотография всего комплекса:

Доработка коптера Parrot Ardrone 2 под полноценную радиоаппаратуру (мод MiruMod)

Слева направо:
- разъем для подключения к дрону;
- платка с Ардуиной;
- приемник радиоаппаратуры.

Мудрый Miru предусмотрел отладочный режим, который позволяет на компе проверить, что получает мод с аппаратуры и что он отправляет на дрон. Фактически нужно подключить к ардуине ее же программатор (по факту являющийся конвертером USART <> USB, FTDI232), замкнуть один из выводов (11-й на плате) на землю и подключить все это хозяйство к гипертерминалу, работая через виртуальный COM-порт, который создает "программатор". Подробно об этом сказано вот здесь. Стоит иметь в виду, что данная дока актуальна только для Parrot Ardrone 1, а у меня 2-й. Но отладочный режим одинаков везде.

В общем, в отладочном режиме все заработало почти с первого раза. Я четко видел, как небольшое добавление газа дает команду на взлет, убирание газа до упора дает команду на посадку. Ну и сигналы с других каналов радиоаппаратуры принимались и обрабатывались нормально.

Я обрадовался и пошел дальше - стал готовить подключение платы к самому дрону. Для этого нужен конвертер уровней, поскольку Ардуина выдает 5-вольтовые сигналы, а дрон - 1.8. В документации об этом сказано и приведены конкретные девайсы, которые нужно купить. Я с рекомендуемого сайта Sparkfun заказывать не стал, т.к. дорого, и заказал на Aliexpress то же самое. Дождался, получил. Стал подключать. Все спаял, как рекомендовано, но здесь меня ждал облом - дрон не слушал команд и не собирался взлетать.

Пришлось снова лезть в исходники и искать, как можно хотя бы организовать отладочный вывод куда-либо. Выяснилось, что сам Миру для этого моргает встроенным светодиодом Ардуины. Ок, немного подшаманили данную функцию, расставили в ключевых точках кода... Оказалось, что проблема в коммуникации между дроном и Ардуиной - просто нет обмена, мод это обнаруживает и прекращает работу. Проверил еще раз схему - все собрано верно. Подключил вход FTDI к выходу дрона - дрон все исправно выдает в консоль (он там пишет сам процесс загрузки), даже без конвертера. Выход FTDI на вход дрона без конвертера подключать нельзя, т.к. можно спалить порт; но мне это и не было нужно, т.к. я хотел проверить, работает ли порт у дрона.

В общем, по-отдельности пакеты слал и дрон, и мод, но друг друга они не видели. И я стал грешить на конвертер уровней. Заказал еще один, из другого места и чуть другую модификацию. Опять не заработало. Пришлось лезть разбираться более подробно.

В ход пошел осциллограф. Оказалось, что проблема - в формировании опорного напряжения 1.8 вольт. Сам Миру это делает просто из 5 вольт через резисторный делитель. Но мой экземпляр конвертера в этом случае капризничал и не выдавал на выходе ноль при нуле на входе. Для проверки я подключил внешний источник на 1.8 и все наконец заработало. Значит, сопротивление делителя где-то оказывает влияние на работу самой схемы конвертера.

Здесь, возможно, мне не повезло с экземпляром - может полевик там другой поставили... Может быть тот, который продает именно Sparkfun - будет работать и так. Ведь на форуме rc-groups на это никто не жаловался. Но я просто пошел и купил интегральный стабилизатор на 1.8 вольт (LM1117 / 18). С ним все наконец заработало.

Понадобилось внести еще несколько правок в код, чтобы корректно работала моя 4-канальная аппаратура, но это уже мелочи :)

Вообще обмен между дроном и модом можно успешно слушать, подключив вход FTDI к нужной стороне обмена со стороны Ардуины - т.е. либо к TX, если хочется послушать, что мод шлет дрону, либо к RX, если нужно посмотреть, что дрон шлет моду. Еще нюанс - изначально дрон работает на 115200 бод, но мод переводит обмен на 38400, в исходнике есть комменты, что какие-то проблемы с тактами на других скоростях.

Дальше я все это собрал и смонтировал вчистовую. Можно летать :)

Напоследок приведу немного комментариев по основным функциям в коде, может кому пригодится.

  • main - он и в Африке main :)
  • dr_loop – главный цикл (опрашивает аппаратуру и отправляет команду в дрон)
  • rx_read – опрос положения ручек аппаратуры (т.е. сигнала с приемника), интерпретация и запись в глобальную структуру (оттуда возьмут другие)
  • at2so_exec – записывает прогу-компаньона в сам дрон, там же определяется блокировка wi-fi
  • su_loop - используется только в отладочном режиме (когда замкнуты перемычки, см. выше).
  • ms_dly – задержка (в мс)
  • blip – промигать светодиодом на плате Arduino заданное число раз
  • Что такое FMS:
    LAND – «нахожусь на земле или получил команду садиться»
    FM_1 – это обычный режим полета, с использованием камеры для отслеживания положения (когда положение ручек по нулям) – я захардкодил именно этот вариант при взлете
    FM_2 – типа более продвинутый, камера не используется, делай что хошь.
    FM_3 – для автопилота, в стандартной компаньонской программе не используется.


Ну и на всякий случай выложу два архива:
1. Мой модифицированный исходник под 4-канальную радиоаппаратуру. Вам он может быть ценен наличием некоторого кол-ва комментариев на русском;
2. Проект под Visual Studio - не компилируется, но немного лучше структурирован в #region. Сделан исключительно для удобства изучения.

И еще несколько полезных ссылок:

Документация от товарища Miru

В дополнение к документации - FAQ

Плюс в самом официальном исходнике от Miru есть readme, в котором описано многое, чего нет на сайте и в документации.
Квартирное
Утепление лоджии серии "Копэ парус"    
Перепланировка однушки в "Копэ парус"    

Автомобильное
Установка парктроника и камеры заднего вида на Honda Jazz    
Установка парктроника и камеры заднего вида на Honda Civic 5.5    
Установка парктроника и камеры заднего вида на Nissan Vanette Cargo    
Замена лампочек в фарах на Honda Jazz    
Замена бензонасоса в Honda Civic 5.5 (англичанка)    
Ремонт дверной ручки в Honda Civic    
Замена сайлентблоков, рычагов и стоек задней подвески Honda Civic    
Замена передних стоек на Honda Civic    

Электронное
Установка беспроводной зарядки в Nokia Lumia 625    
USB-зарядка, встроенная в розетку 220 вольт (Legrand)    
Автоматическая поливалка для цветов    
Ремонт клавиш клавиатуры Logitech K800    
Доработка квадрокоптера Parrot Ardrone 2 под полноценную радиоаппаратуру (мод от Miru)    

Отзывчивое
Отзыв о центре "Летаем без страха"     

Яндекс.Метрика