В этой статье я расскажу, как мы делали передатчик из телефона, приемник из микроконтроллера, как это начиналось и чем закончилось.


Как-то раз, изучая просторы интернета, я наткнулся на страничку на кикстартере с одним интересным проектом. Это небольшой модуль, который цепляется к бумажному самолетику и управляется через блютуз со смартфона. Данная вещь меня заинтересовала, но отдавать 45$ за двухканальное нечто с управлением по типу штурвала истребителя даже с нормальным еще курсом рубля было неохота. И вот тогда созрел план: сделать свое управление с телефона с многоканальностью и прочими авиамодельными плюшками.






Тут как раз появилось название проекта:

BTCP (Bluetooth controlled plane) - самолет на bluetooth-управлении.

В качестве платформы выбрал восьмибитный микроконтроллер фирмы Atmel, а именно - Atmega88. Кстати, именно такие стоят в большинстве регуляторов для БК моторов. Главным критерием выбора было наличие как минимум 4-х ШИМ каналов (ведь как известно, сервомашинки управляются с помощью широтно-импульсной модуляции). Самое интересное то, что эти аппаратные ШИМ каналы мне в итоге и не понадабились.

В качестве приемника - китайский bluetooth-модуль HC-05.



Два типа корпусов: PDIP слева, TQFP справа (пропорции сохранены). А совсем справа - блютуз модуль

Arduino я отверг сразу же, т.к. использовать уже готовое решение - это как-то не по-нашему. Да и вообще похоже на то, что я
ардуиноненавистник.


Ход разработки:

Постигнув лазерно-утюжную технологию, наваял плату для распайки атмеги и приемника. Вот это чудовище должно было устанавливаться на самолет:


Ранние фотографии, еще видны отверстия под конденсаторы на 22пф, которые было очень трудно найти в моем ареале обитания

Итак, микроконтроллеры (далее просто мк) на столе, программатор рядом, руки так и чешутся что-нибудь туда зашить. Да хотя бы простенькую программу возврата принятого символа/числа. Прошивка проходит успешно, но мк перестает отзываться. Чешу затылок. Беру запасной мк, повторяю с ним - та же ерунда! Дело начинает пахнуть керосином. Собственно, в России любят сначала сделать, и только потом читать инструкцию. А проблема всплывает следующая: из-за путаницы во fuse-битах, не разобравшись с ситуацией, я заблокировал в кристале возможность программирования по стандартному интерфейсу. Все, приехали...

Гугл подсказывает единственный возможный вариант для моей ситуации: собрать так называемый "Avr fuse-bit doctor" - устройство для реанимации попавших в такую беду мк. Для него нужна еще одна атмега, но под рукой лишь пара дохлых регуляторов, в которых мк имеют мелкий корпус, а не тот, который применяетси в готовой разводке. Ну что же, пытаюсь собрать устройство по схеме под имеющиеся детали.

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


Слева - моя попытка, справа - собранное по готовому дизайну


Программирование.

Облазив интернет, нашел лишь две статьи, которые хоть как-то пересекались с моей задумкой.
Из первой стянул исходные коды для приложения. Мне повезло: автор реализовал возможность управления машинкой на arduino с помощью наэкранного стика. мне лишь оставалось добавить второй стик, поддержку сразу двух касаний экрана и передачу данных в необходимом мне формате.
Вторая статья тоже интересна: ее автор как раз делал управление для самолета, правда, не с телефона.

С выбором языка, на котором буду писать прошивку для мк, долго не колебался: низкоуровневый ассемблер показался мне более простым и понятным, чем C++. Для написания android-приложения используется Java, тут альтернатив не существует.

В начале статьи я написал, что аппаратные ШИМ каналы мне не пригодились. Дело в том, что 128 положений сервопривода мне показалось мало, а больше не получилось бы сделать на 8-ми битных таймерах (хотя сейчас я понимаю, что ошибался тогда). Поэтому я сделал программную реализация ШИМа на 16-ти битном таймере, поочередно отсчитывая на нем длины импульсов.

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


Процесс симуляции поведения кода в микроконтроллере


На этом участке кода я пытался прикрутить экспоненту в приложении (пока что не удалось)


Так как я не брался за углубленное изучение Java, то знающие люди наверняка сходу могут оценить изящность и продуманность моего кода примерно на 2 из 10.

Скриншоты Android - приложения:


Главный экран (настроек пока что нет. совсем нет)


Самые значимые элементы - джойстики


В работе

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



От обвязки было решено отказаться (все равно от BECа идет более-менее чистый сигнал), в результате чего плата оказалась в 4 раза меньше предшественника по площади и стала весить около 8 грамм.

И тот всплывает крупный баг, суть которого заключалась в следующем: при отправке команды на изменение положения сервопривода через программу-терминал все работает хорошо, точно, но при отправке ограмного потока данных, которые образуются в результате дерганья стиков, мк клинило намертво. Из-за этой заразы я забросил проект на достаточно продолжительное время.

Но вот, в конце осени мне поднадоело учиться, и я, несколько раз перечитав учебный курс по программированию мк, сел и полностью переписал процедуру приема и обработки данных. И тут свершилось долгожданное: оно заработало!!! Радости не было предела, я тут же бросился ставить приемник на зальный самолет и настраивать его.


Наконец, появился свободный день для облета. Вот что из этого вышло:


(еще раз о багах. в приложении существует ошибка: если завести палец со стиком в зону другого стика, то их работа парализуется с предугадываемым результатом. я знал про это, но посчитал, что в реальных условиях никто не будет уводить палец так далеко. но на практике все получилось совсем по-другому)



Но многочисленные морковки не смогли попортить радость от того, что оно наконец-то полетело.
На данном этапе управление крайне неудобное. Нет экспоненты, небольшое изменение угла наклона пальца приводит к изменению положения стика и дребезжаниям. Ну и в не меньшей степени сказывается то, что в душе я - тракторист, и привычка дергать стики туда-сюда дает о себе знать. Единственное, что спасало летательный аппарат от полного одровенения - это односекундный failsave. Хотя сейчас я понимаю, что задержку нужно уменьшать как минимум в два раза.

На этом проект не останавливается. Нужно же довести все до ума. На Ar.Drone же как-то люди летают. Идей очень много:
  • исправить все, что мешает нормально летать
  • добавить настройки (реверсы, экспоненту, конечные точки и т.д.)
  • попробовать сделать управление наклоном телефона (просто узнать, насколько это будет удобно в реальности)
  • собрать ультрамикросамолет размахом до 400мм под 1S и весом до 40г. Для этого даже уже есть набросок мини платы на с мк в корпусе размером 9 х 9 мм:


На этом пока все.

Работа вряд ли была бы завершена, если бы не помощь и поддержка моего авиамодельного тренера Вадима Голуба и моего друга Радомира.

Спасибо за внимание.