Содержание статьи
Все материалы сюжета:
- Собираем роботов-самоходов на Arduino
- Робот для видеонаблюдения на Raspberry Pi
- Тестируем робота без самого робота
Arduino, безусловно, популярная и интересная платформа, но и у нее есть свои ограничения. Что, если тебе нужно использовать на роботе дополнительный софт? Подключать периферию? На помощь приходит хорошо знакомый Raspberry Pi.
В этой статье я покажу, как сделать управляемого по Wi-Fi робота с веб-камерой на базе Raspberry Pi. Эта платформа позволит нам работать со всем понятным Linux, с легкостью использовать любой нужный нам софт, а также задействовать почти любую периферию.
Набор
- Raspberry Pi модели В — 2200 р.
- Веб-камера — 1500 р.
- Wi-Fi-донгл — 300 р.
- Аккумулятор на 12 В 7 А • ч — 500 р.
- Колесная база, провода и двигатели от какой-нибудь игрушки
Итог: 4500 р.
О компьютере
Я использовал стандартный Raspberry Pi версии B, который обладает двумя USB-портами, Ethernet-портом и 512 Мб оперативной памяти. Также существует модель А, в которой есть только один USB-порт, 256 Мб памяти и отсутствует Ethernet. Такая плата более сложна в настройке, но зато ей нужно намного меньше питания.
В качестве ОС я выбрал стандартную Raspbian (оптимизированный под железо «малинки» Debian). Для установки операционной системы нам потребуется SD- или SDHC-карта объемом желательно не менее 4 Гб класса 10 и любой компьютер с кардридером. Сам процесс заливки довольно тривиален. Пользователям UNIX будет достаточно утилиты dd. Вставляем готовую карточку в «малинку», подключаем ее к сети, включаем любимый SSH-клиент. Стандартный логин pi, пароль — raspberry.
При первом запуске появится окно с конфигурациями — если этого не произошло, то его можно вызвать командой raspi-config. Нас волнует несколько пунктов:
- Expand filesystem — расширение основного раздела на всю карту памяти. Иначе системе не будет доступно больше 4 Гб.
- Change User Password — стандартный пароль лучше все-таки сменить.
- Internationalisation Options — выставляем локаль ru_RU.UTF-8 UTF-8 и соответствующий часовой пояс.
- Enable Camera — включение поддержки камеры. Потребуется для камер с DSI-интерфейсом (например, для официальной камеры), но в моем примере это не нужно, то есть можно поставить значение Disable.
Для того чтобы избавиться от сетевого кабеля, нужен поддерживаемый Wi-Fi-донгл. Я использовал D-Link DWA-110, а полный список есть в интернете (bit.ly/1cQXMFP). Расскажу немного о настройке:
- Подключаем Wi-Fi к Raspberry.
- Смотрим, определилась ли она
#lsusb
Получим что-то подобное:
Bus 001 Device 005: ID 07d1:3c07 D-Link System DWA-110 Wireless G Adapter(rev.A1) [Ralink RT2571W]
- Подключаемся к нашей сетке:
# sudo wpa_passphrase имя_точки ключ_точки > /etc/wpa_supplicant/ wpa_supplicant.conf # sudo iwconfig wlan0 essid имя_точки # sudo wpa_supplicant -B -Dwext -i wlan0 -c /etc/wpa_supplicant/ wpa_supplicant.conf # sudo ifconfig wlan0 down # sudo ifconfig wlan0 up
и проверим, подключились ли мы к точке доступа:
# ifconfig
Управление
Для начала установим веб-интерфейс, через который мы будем управлять роботом. Я остановился на WebIOPi. Этот продукт разработан специально для применения RPi в автоматизации и робототехнике.
Установка интерфейса производится следующим образом:
- Скачиваем архив программы в любой каталог командой
# wget http://webiopi.googlecode.com/files/WebIOPi-0.6.0.tar.gz
- Распаковываем архив в текущую директорию
tar xvzf WebIOPi-0.6.0.tar.gz
- Переходим в каталог с программой
# cd WebIOPi-0.6.0
Вес пакета составляет всего 152 Кб.
- Запускаем установочный файл
# sudo ./setup.sh
- И ставим веб-интерфейс на автозапуск
# update-rc.d webiopi defaults
Теперь займемся созданием страницы управления. Для начала скачаем архив проекта по адресу bit.ly/1di2qgl. Распакуем его в каталог пользователя:
# tar xvfz robot.tar.gz
Далее редактируем конфиг из корня сервера webiopi:
# sudo nano /etc/webiopi/config
Что меняем:
myscript = /home/pi/robot/python/script.py
doc-root = /home/pi/robot/html/
welcome-file = index.html
gpio-export = 25, 11, 8, 9
gpio-post-value = true
Устанавливаем «глаза»
Итак, подключаем к роботу веб-камеру. Я использовал камеру HP HD-4110 с поддержкой Full HD и V4L, но смысла брать именно Full HD камеру нет, так как у нас разрешение изображения 640 на 480. Полный список есть здесь: bit.ly/1cR06N4. Почти для каждой камеры в этой табличке указано, требуется ли ей внешнее питание. Это важно, поскольку «малинка» может стабильно питать по USB далеко не каждый девайс, а у некоторых камер питание в принципе подводится через внешний адаптер. Поэтому стоит остерегаться некоторых моделей от Logitech и Microsoft. Дальше по списку:
- Проверяем «подключенность»
# lsusb
Получим что-то подобное: Bus 001 Device 004: ID 03f0:9207 Hewlett-Packard
- Устанавливаем пакет video for Linux
# apt-get install libv4l-0
- Устанавливаем утилиту mjpg-streamer-rpi
# wget http://www.bobtech.ro/get?download=36:mjpg-streamer-rpi
- Переименовываем скачанный файл
# mv get\?download\=36\:mjpg-streamer-rpi mjpg-streamer-rpi.tar.gz
- Распаковываем
# tar -zxvf mjpg-streamer-rpi.tar.gz
- Переходим в каталог с программой
# cd mjpg-streamer
- Запускаем
# ./mjpg-streamer.sh start
- При необходимости настраиваем скрипт под себя
# sudo nano ./mjpg-streamer.sh VIDEO_DEV="/dev/video0" — идентификатор устройства; FRAME_RATE="30" — частота кадров (FPS); RESOLUTION="640x480" — разрешение; PORT="8080" — HTTP-порт; YUV="false" — флаг YUV-кодирования.
При 30 кадрах в секунду моя система работала нормально (без оверклока), но, чтобы снять нагрузку с компьютера, значение можно снизить вплоть до 5. Также обрати внимание на YUV — это позволит нам немного оптимизировать размер видеопотока за счет другого принципа кодирования цвета. Создаем скрипт автоматизации запуска:
$ cd /home/pi
$touch autostart.sh
$ nano autostart.sh
#!/bin/sh
sudo /etc/init.d/webiopi start
cd /home/pi/mjpg-streamer
./mjpg-streamer.sh start
Далее для автозапуска с системой мы добавляем строчку с нашим скриптом в файл / etc/rc.local до строчки exit 0.
#!/bin/sh -e
#
# rc.local
...
cd /home/pi
./autostart.sh
exit 0
Если хочешь полюбоваться результатом, то зай ди в браузере по адресу http://raspberrypi:8000, логин webiopi, пароль raspberry. В качестве бонуса можно открыть веб-интерфейс в «мир». Для этого нужно дать в твоем роутере доступ к портам 8000 и 8080 для IP твоей «малинки». Естественно, перед этим нужно сменить стандартные логин и пароль WebIOPi командой
# sudo webiopi-passwd
После чего запустится генератор файла пароля и запросит сначала логин, а потом пароль дважды. Результатом будет: Hash: «длинная-длинная строчка с множеством символов» Saved to /etc/webiopi/passwd
После проведенных операций требуется перезагрузка сервера
# sudo /etc/init.d/webiopi restart
Сборка
Чтобы наша модель ездила, нужно реализовать управление двигателями. Рекомендую делать в виде ключей из транзисторов, как я (смотри схему драйвера).
Схема взята из самой машинки. Все номиналы деталей и транзисторы взяты прямо оттуда. Транзисторы Q1, Q2 лучше использовать B772, транзисторы Q3, Q4 — D882. Если ты экономишь место, то транзисторы Q5 и Q6 лучше брать SMD с маркировкой 6C. Схема скопирована с платы машинки, от которой взята колесная база, но я добавил резисторы на 1 МОм параллельно входам управления, дабы погасить наводки. Двигатель питается напрямую через драйверы от аккумулятора 12 В. При желании можно организовать регулировку скорости машинки посредством широтно-импульсной модуляции. Теперь подключаем все по такой схеме:
- За движение вперед отвечает порт GPIO 11, назад — GPIO 9, влево — GPIO 25, вправо — GPIO 8. Подключаем к драйверам двигатели, а драйверы к соответствующим портам на Raspberry Pi.
- Питание управляющей части робота осуществляется через DC/DC-преобразователь на микросхеме LM2596.
- На вход мы подключаем аккумулятор, а на выход Raspberry Pi. Когда наш робот выключен, у нас будет утечка тока через транзисторы драйверов и БП Raspberry, поэтому надо поставить тумблеры в разрез цепям питания, первый тумблер между плюсом аккумулятора и преобразователем, а второй так же между плюсом аккумулятора и клеммой питания драйверов.
Итак, долгожданный пуск готового устройства. Производим подключение по следующей схеме:
- К RPi подключаем веб-камеру, USB-адаптер Wi-Fi, преобразователь и проводники, ведущие к драйверам.
- Далее подсоединяем Raspberry к аккумулятору через преобразователь и включаем его. Аккумулятора хватает на два-три часа.
- После загрузки компьютера включаем тумблер подачи напряжения на драйверы.
- Заходим с любого устройства из нашей локалки по адресу http:/адрес_твоего_RPi:8000 и катаемся на машинке по квартире :).
Читателю
Функциональность Raspberry Pi зависит только от фантазии, здравого смысла и потребности человека, держащего его в руках. Мой пример — не единственный, как можно применить этот компьютер, созданный для обучения детей программированию. Готового робота можно модернизировать как угодно. Можно подключить к нему датчики изгиба по шине I2C и сервоприводы, пошаманить с механикой и получить манипулятор, как вот здесь: bit.ly/1e1pOQ0, на Arduino. Далее дополнить его еще одним АЦП и сделать робота, управляемого голосом! Например, вот этот: bit.ly/1fJwTvz, специализированный под RPi АЦП. Так как шина I2C поддерживает до 127 устройств, то реализовать можно практически все. Я в дальнейшем планирую переделать колесную базу на гусеничную и помощнее — хочется, чтобы модель была более серьезных размеров :). Далее поставить лазеры, атомный источник питания и тому подобное, но это уже мелочи :).