Raspberry Pi Tank
LVEE Winter 2014
На сегодняшний день существуют сотни различных применений Raspberry Pi. Он может быть домашним медиацентром, роутером, устройством для автономного скачивания торрентов, а так же многим другим. Благодаря достаточному числу GPIO-портов и компактным размерам он хорошо подходит для взаимодействия с множеством других устройств, идеален для разработки в домашних условиях, а кроме того поддерживает установку практически любого дистрибутива Linux.
Raspberry Pi Tank – ещё одно нестандартное применение для Raspberry Pi, нацеленное на удаленное управление по Wi-Fi автономным роботом с телеметрией и использующее в качестве мобильной платформы массово выпускаемый и потому чрезвычайно дешевый игрушечный танк.
C точки зрения аппаратной составляющей Raspberry Pi Tank включает следующие части:
- Raspberry Pi.
- Собственно игрушечный радиоуправляемый танк.
- Батарея с USB-выходом.
- Веб-камера.
- USB-совместимый адаптер Wi-Fi.
В качестве мобильной платформы танк содержит три двигателя: два для независимого вращения гусениц и один для вращения башни. Каждый двигатель может вращаться в прямом и обратном направлении, а потому на каждый двигатель используется по два управляющих контакта. С точки зрения схемотехники управление двигателем организовано по мостовой схеме.
Исходно танк поддерживает управление по радио интерфейсу, но в связке с Raspberry Pi используется прямое подключение выводов GPIO к управляющим контактам на плате.
Радиоуправление активно использовалось нами во время реверс-инжиниринга платы для выявления связи между контактами на плате и их функциональным назначением. В результате была получена распиновка внутренних контактов электроники танка и их функционального назначения. Благодаря тому что напряжение управляющих сигналов двигателей оказалось 3.3В, не понадобились дополнительные схемотехнические решения для согласования напряжений с GPIO-портами Raspberry Pi (там также используется напряжение 3.3В).
Как упоминалось, для питания Raspberry Pi используется батарея с выходом USB. Такие батареи обычно используются для зарядки телефонов и планшетов и выдают выходной ток до 2 А. Ёмкость использованной в проекте батареи 23 Вт*ч, и при типичном энергопотреблении Raspberry Pi (700 мА) этого должно быть достаточно на 23Вт*ч/(0,7А * 5В) = ~6,5 часов работы.
В плане программного обеспечения Raspberry Pi Tank состоит из следующих составных частей:
- Arch Linux
- mjpg-streamer
- rpi-gpiod.pl
- rpi-keyboard.pl
- rpi-tank-rack
В качестве дистрибутива для Raspberry Pi используется Arch Linux. Благодаря своей легковесности и гибкости, он отлично себя проявил на процессоре ARM с его ограниченными ресурсами. Из полезных особенностей хотелось бы отметить rolling release (что обеспечивает всегда свежие версии пакетов), быстрый менеджер пакетов pacman, асинхронную инициализацию на основе systemd, а также netctl (systemd style network manager).
Для передачи видео используется mjpg-streamer. Изображение передаётся в виде обновляющегося jpg-файла. При таком подходе не используется межкадровое сжатие, и в итоге, при высоком фреймрейте и разрешении, генерируется значительный по размерам видеопоток (3 – 10 Мбит).
Плюсом такого решения является минимизация нагрузки на процессор. Даже в при высоком фреймрейте и разрешении нагрузка на процессор не превышает 20%. Такое решение хорошо подходит для управления по Wi-Fi, но для управления через Интернет это не самый оптимальный вариант.
Ещё одним плюсом стриминга с помощью mjpg-streamer является встроенная поддержка M-JPEG практически всеми известными веб-браузерами (была протестирована возможность стримига видео в браузере Chrome на Android 4 и в Safari на iOS). Это позволяет сделать полноценный веб-интерфейс для удалённого управления и наблюдения практически с любого современного устройства.
Для Raspberry Pi Tank были специально разработаны несколько программ.
Для непосредственного управления GPIO-портами Raspberry Pi был написан демон rpi-gpiod.pl, который запускается как сервис systemd при запуске системы. С помощью Perl-модуля Device::BCM2835 команды отправляются на GPIO. Второй задачей демона является прослушивание порта TCP/IP и преобразование полученных команд в соответствующие сигналы для GPIO. Протокол управления является текстовым, в виде, приближенном к CLI-style. Это сделано для того, чтобы упростить разработку различных фронтэндов. В принципе, в качестве фронтэнда может выступать даже telnet: в ответ на команду help выдается список поддерживаемых команд с описанием их назначения (последнее пока реализовано лишь для некоторых команд). Таким образом можно получить информацию о командах, а потом поочередно экспериментировать с каждой их них.
На текущий момент существует 2 фронтэнда для rpi-gpiod.pl:
- rpi-keyboard.pl – консольное приложение.
- rpi-tank-rack – веб-интерфейс (WebUI).
Для непосредственного управления танком с клавиатуры можно использовать rpi-keyboard.pl. Скрипт устанавливает локальное или удалённое TCP/IP-соединение с демоном rpi-gpiod.pl. При запуске в консоли скрипт считывает нажатия клавиш. Управление движением осуществляется клавишами ‘WASD’: вперёд, влево, вправо, назад. Управление вращением башни осуществляют клавиши ‘[‘ и ‘]’ соответственно выполняя поворот влево и вправо.
Веб-интерфейс реализован через rpi-tank-rack (автором которого является Artem Sheremet). Приложение rpi-tank-rack написано на ruby, при старте запускается легковесный веб-сервер rack. Для взаимодействия клиента и сервера используется WebSocket. Управление с веб-страницы осуществляется как с помощью кнопок, так и с помощью клавиатуры по тому же принципу, что и в rpi-keyboard.pl.
Существует возможность настройки параметров воспроизведения потокового видео (частота кадров, разрешение) прямо из браузера.
Весь код проекта располагается на GitHub:
“https://github.com/bondar-pavel/rpi-tank ":https://github.com/bondar-pavel/rpi-tank
https://github.com/dotdoom/rpi-tank-rack
Abstract licensed under Creative Commons Attribution-ShareAlike 3.0 license
Назад