- PVSM.RU - https://www.pvsm.ru -
На последней сессии я как обычно тщательно готовился к экзаменам (то есть не знал, чем себя занять), и как по счастливой случайности, у меня образовалась радиоуправляемая машинка, большая и красивая, хотя и явно рассчитанная на детей. Поигравшись минут десять, я захотел ее модернизировать, а именно вместо неудобного джойстика с радиусом действия в 3 метра использовать коммуникатор с bluetooth. И удобнее, и дальность действия больше, и явно видны дальнейшие улучшения, о которых, как впрочем и о процессе прикручивания коммуникатора к детской машинке, и пойдет речь в данной статье.
<a rel="nofollow" name="habracut">
В прошлом мы с приятелями написали [1] собственную прошивку для роботов Lego Mindstorms NXT, поддерживающую удалённое управление роботом по bluetooth с Android-коммуникатора. Для экспериментов тогда была приобретена отладочная плата Olimex SAM7 с ARM7 на борту, которую в этот раз можно использовать в качестве управляющего контроллера.
В качестве шасси используем корпус игрушечной машинки.
Нужен bluetooth-модуль. Результат хотелось получить быстро, поэтому модуль был выбран из единственного доступного в магазине на тот момент BTM-112 [2], хотя он оказался сравнительно [3] дорогим.
Кроме того, оказалось, что управление с платы не может идти напрямую на моторы, нужен усиливающий контроллер (об этом чуть позже).
В сумме наши компоненты:
Теперь все необходимое у нас есть.
Для начала настроим доставку команд управляющему блоку. Схема соединения bluetooth-модуля и контроллера простая: по сути дела это UART с некоторыми управляющими ножками, то есть надо лишь присоединить модуль к интегрированному UART-контроллеру.
Программная составляющая не сильно сложнее. При соединении модуль пишет строку вида "CONNECT RE:MO:TE:BT:MA:CC xxx rn"
, а при отсоединении — "DISCONNECT xxx rn"
. Задача драйвера состоит в наблюдении за потоком символов и, в случае если сейчас активно соединение, передаче потока управляющему приложению. В итоге драйвер представляет собой конечный автомат, у которого переключение состояния означает переключение функции-обработчика.
Как было обещано, удаленное управление осуществляется с помощью Android-коммуникатора.
Наше прошлое приложение для Android (которое управляло Lego Mindstorms NXT, тоже посредством bluetooth) с помощью акселерометра отслеживало наклон коммуникатора и посылало соответствующие команды управления на NXT. Так что наиболее простым решением стало добавление протокола управления машинкой в уже существующее приложение. Сам протокол достаточно примитивен: фиксированная длина команды, фиксированный заголовок, после чего управление по осям X и Y.
Итак, на данном этапе мы можем “порулить” нашей платкой, правда моторы пока не подключены, так что индикация движений производится встроенными светодиодами (видео, к сожалению, нет, в этот момент снял только фотку), но всё равно прогресс есть, он виден, и это греет душу.
Изначально я думал, что смогу использовать управление со старой платы (зашитой в саму машинку), но оказалось, что использовать её в чистом виде нельзя, поскольку управление моторами было крепко сцеплено с радиочастью. Управлять моторами напрямую с ног головного контроллера тоже не получится из-за малой выходной мощности микросхемы. К сожалению, опыта в этой области у меня нет никакого (все-таки я программист, а не схемотехник), поэтому пришлось прибегнуть к помощи знакомых. По совету я взял микросхему усилителя L298N (избыточную для моих нужд, зато работающую из коробки) и собрал референсную схему [4].
Напомню, препарируемая машинка детская, и управление у нее немного хромает; когда я начал разбираться с моторами, я понял одну из причин. Для механизма поворота используется не сервопривод, а обычный электродвигатель, который может находиться в одном из трех состояний (выкл., вперед и назад). Таким образом, о плавном повороте мечтать не приходится.
В общем, функционально схема простая, один мотор используется как двигатель, второй мотор — как руль (у него стоит блокиратор на определенном угле поворота).
Для управления каждым мотором нужно подать напряжение на соответствующие управляющие ноги (положительное или отрицательное напряжение либо нуль). Напряжение измеряется между двумя точками (входными ногами управления), то есть мне нужно подавать напряжения на пару управляющих ног как-то так:
forward | reverse | off | ||
---|---|---|---|---|
PIN1 | 1 | 0 | 0 | 1 |
PIN2 | 0 | 1 | 0 | 1 |
Так как Android-приложение передает плавное управление, состояние моторов изменяется по преодолению заданного порога.
Код получился очень простой, я не буду приводить его здесь, но в конце поста есть ссылки на исходники всего проекта.
Ролик с работающей машинкой:
Понятно, есть недостатки:
Весь код есть в открытом доступе.
Прошивка для платы Olimex — тут [5].
Код Android приложения тут [6], собранная версия на Android Market [7].
Автор: antonkozlov
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/diy/2589
Ссылки в тексте:
[1] написали: http://habrahabr.ru/blogs/study/120367/#Embox
[2] BTM-112: http://www.sparkfun.com/datasheets/Wireless/Bluetooth/BTM112_wATcommands.pdf
[3] сравнительно: http://habrahabr.ru/blogs/DIY/125214/
[4] референсную схему: http://www.learn-c.com/l298.pdf
[5] тут: http://code.google.com/p/embox/
[6] тут: http://code.google.com/p/robobot/
[7] Android Market: http://market.android.com/details?id=org.embox.robobot
Нажмите здесь для печати.