В этой статье я расскажу, как мы делали передатчик из телефона, приемник из микроконтроллера, как это начиналось и чем закончилось.
Как-то раз, изучая просторы интернета, я наткнулся на страничку на кикстартере с одним интересным проектом. Это небольшой модуль, который цепляется к бумажному самолетику и управляется через блютуз со смартфона. Данная вещь меня заинтересовала, но отдавать 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 мм:
На этом пока все.
Работа вряд ли была бы завершена, если бы не помощь и поддержка моего авиамодельного тренера Вадима Голуба и моего друга Радомира.
Спасибо за внимание.
Мне очень интересен этот проект. Потому что я пытаюсь тоже реализовать нечто подобное - планер размахом не более полуметра управляемый с помощью телефона.
Уже есть прототип (летающее крыло, на котором летал раньше) , но в отличие от вас я использовал arduino nano, написал приложение, в котором реализовал управление с помощью акселерометра (держим телефон в положении landscape, отклоняем вниз, самолет летит вниз, вверх - вверх и.т.д) и настройку нуля отклонения элеронов с помощью двух слайдеров. Но есть проблемы. Когда я отклоняю элероны с помощью , упомянутых выше слайдеров, серво машинки отрабатывают давольно плавно и практически без задержки, но когда я активирую управление с помощью акселерометра серво машинки срабатывают с задержкой и совсем не плавно. Еще нужно учесть тот факт , что это крыло, т.е управление тангажом и креном осуществленно лишь двумя элеронами.
Время между двумя принятыми сообщениями от телефона - около 10 - 15 мс. Есть несколько предположений почему серво машинки так себя ведут:
1. При управлении дрожат руки , которые создают шум в показаниях акселерометра.
2. Я повораючиваю телфон резко и машинки просто не успевают повернуться в нужное положение. Я был бы очень благодарен, если бы вы и другие участники обсуждения посоветовали, как мне сделать передачу угла отколонения телефона в угол поворота элеронов летающего крыла наиболее приближенным к традиционному управления.
А так же не могли бы выложить свой вариант приложения для Android и прошивки МК. Я в свою очередь тоже могу поделиться своими поделками.
По моему, блютуса пользы не много. Зато полученного опыта хватит, чтоб, скажем, идти к управлению по видекамере через мобильный интернет...
Хороший проект!
ЗА усердие и фантазию конечно ПЛЮС.