Международная конференция разработчиков
и пользователей свободного программного обеспечения

Raspberry Pi Tank

Павел Бондарь, Минск, Belarus

LVEE Winter 2014

Raspberry Pi Tank is an open source project implementing Wi-Fi remote control for a toy tank with Web and console iterfaces. Project includes software tools developed for remote control, such as daemon for controlling tank over GPIO, WebUI for transmitting commands and receiving video, and others. Working prototype is included as a part of presentation.

На сегодняшний день существуют сотни различных применений Raspberry Pi. Он может быть домашним медиацентром, роутером, устройством для автономного скачивания торрентов, а так же многим другим. Благодаря достаточному числу GPIO-портов и компактным размерам он хорошо подходит для взаимодействия с множеством других устройств, идеален для разработки в домашних условиях, а кроме того поддерживает установку практически любого дистрибутива Linux.

Raspberry Pi Tank – ещё одно нестандартное применение для Raspberry Pi, нацеленное на удаленное управление по Wi-Fi автономным роботом с телеметрией и использующее в качестве мобильной платформы массово выпускаемый и потому чрезвычайно дешевый игрушечный танк.

C точки зрения аппаратной составляющей Raspberry Pi Tank включает следующие части:

  1. Raspberry Pi.
  2. Собственно игрушечный радиоуправляемый танк.
  3. Батарея с USB-выходом.
  4. Веб-камера.
  5. 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 состоит из следующих составных частей:

  1. Arch Linux
  2. mjpg-streamer
  3. rpi-gpiod.pl
  4. rpi-keyboard.pl
  5. 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

Назад