Вы читаете:
Робот для видеонаблюдения на Raspberry Pi
«ХАКЕР» ДОСТУПЕН ТОЛЬКО В ЭЛЕКТРОННОЙ ВЕРСИИ
Оформи подписку — получи:
  • доступ к платным материалам сайта
  • доступ ко всем номерам PDF
3900
2700 р.
на год
400 р.
на месяц
60 р.
за 1 статью

8

Робот для видеонаблюдения на 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). Расскажу немного о настройке:

  1. Подключаем Wi-Fi к Raspberry.
  2. Смотрим, определилась ли она
    #lsusb
    

    Получим что-то подобное:

    Bus 001 Device 005: ID 07d1:3c07 D-Link System DWA-110 Wireless G Adapter(rev.A1) [Ralink RT2571W]
    
  3. Подключаемся к нашей сетке:
    # 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 в автоматизации и робототехнике.

Установка интерфейса производится следующим образом:

  1. Скачиваем архив программы в любой каталог командой
    # wget http://webiopi.googlecode.com/files/WebIOPi-0.6.0.tar.gz
    
  2. Распаковываем архив в текущую директорию
    tar xvzf WebIOPi-0.6.0.tar.gz
    
  3. Переходим в каталог с программой
    # cd WebIOPi-0.6.0
    

    Вес пакета составляет всего 152 Кб.

  4. Запускаем установочный файл
    # sudo ./setup.sh
    
  5. И ставим веб-интерфейс на автозапуск
    # 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. Дальше по списку:

  1. Проверяем «подключенность»
    # lsusb
    

    Получим что-то подобное: Bus 001 Device 004: ID 03f0:9207 Hewlett-Packard

  2. Устанавливаем пакет video for Linux
    # apt-get install libv4l-0
    
  3. Устанавливаем утилиту mjpg-streamer-rpi
    # wget http://www.bobtech.ro/get?download=36:mjpg-streamer-rpi
    
  4. Переименовываем скачанный файл
    # mv get\?download\=36\:mjpg-streamer-rpi mjpg-streamer-rpi.tar.gz
    
  5. Распаковываем
    # tar -zxvf mjpg-streamer-rpi.tar.gz
    
  6. Переходим в каталог с программой
    # cd mjpg-streamer
    
  7. Запускаем
    # ./mjpg-streamer.sh start
    
  8. При необходимости настраиваем скрипт под себя
    # 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

Сборка

Чтобы наша модель ездила, нужно реализовать управление двигателями. Рекомендую делать в виде ключей из транзисторов, как я (смотри схему драйвера).

nablud-drv

nablud-bp

Схема взята из самой машинки. Все номиналы деталей и транзисторы взяты прямо оттуда. Транзисторы 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 устройств, то реализовать можно практически все. Я в дальнейшем планирую переделать колесную базу на гусеничную и помощнее — хочется, чтобы модель была более серьезных размеров :). Далее поставить лазеры, атомный источник питания и тому подобное, но это уже мелочи :).

 

Об авторе
Алексей Лаптев
Автор журнала «Хакер»

You must log in to post a comment