В данной статье мы рассмотрим создание на основе платы Raspberry Pi роботизированной машины с камерой наблюдения, управляемой через веб-интерфейс. Она может быть использована в составе системы безопасности какого-нибудь объекта и ее можно собрать всего за несколько часов. Для создания данного проекта понадобится минимум компонентов: плата Raspberry Pi, USB камера и шасси роботизированной машины с двумя двигателями постоянного тока.
Использование USB web камеры открывает широкие возможности по управлению данной роботизированной машины из сети интернет. В частности, в данном проекте мы будем управлять ею со специально созданной веб-страницы, также ей можно управлять из веб-страницы на экране мобильного телефона. На веб-странице у нас будет 4 ссылки – Left, Right, Forward, Backward, с помощью которых можно будет управлять движениями нашей роботизированной машины влево, вправо, вперед и назад соответственно.
В данном проекте мы будем использовать библиотеку “Motion” для считывания видео потока с USB камеры и библиотеку “Flask” для передачи команд с веб-страницы на плату Raspberry Pi. Движениями робота мы будем управлять с помощью программы, написанной на Python.
Установка и настройка Motion для считывания видео потока с камеры
Ранее на нашем сайте мы уже подробно рассматривали установку и настройку библиотеки Motion в статье про камеру видеонаблюдения на Raspberry Pi с захватом движения, поэтому для детального изучения возможностей Motion вам рекомендуется изучить рекомендованную статью. В этой же статье мы рассмотрим только минимальный набор настроек Motion, который необходим для быстрого запуска работы с камерой.
Чтобы начать записывать видео с помощью библиотеки “Motion” и транслировать его через сеть интернет, понадобится ввести всего лишь несколько команд. Но перед этим убедитесь в том, что ваша плата Raspberry Pi подключена к сети Интернет – через LAN или Wi-Fi. После этого выполните следующую последовательность шагов.
Шаг 1. Обновите вашу Raspberry Pi OS до последней версии с помощью команды:
1 |
sudo apt-get update |
Шаг 2. Установите библиотеку ‘Motion’ с помощью следующей команды:
1 |
sudo apt-get install motion |
Шаг 3. Установите процесс Motion (Motion daemon) в состояние "yes" (чтобы он был всегда запущен и действовал) с помощью редактирования файла /etc/default/motion. Его можно отредактировать с помощью редактора ‘nano’, запустив его с правами суперпользователя.
1 |
sudo nano /etc/default/motion |
Затем сохраните файл нажав ‘CTRL+X’, затем ‘Y’, после чего нажав Enter.
Шаг 4. Далее нам необходимо установить разрешение на использование целевого каталога (/var/lib/motion/), в котором программное обеспечение Motion будет сохранять все записываемые видео и изображения. Вам необходимо установить Motion в качестве "владельца" этого каталога с помощью команды:
1 |
sudo chown motion:motion /var/lib/motion/ |
Это разрешение крайне необходимо выставить, иначе вы получите ошибку, показанную на рисунке ниже. Эта ошибка высветится если вы будете проверять состояние (статус) Motion с помощью команды: sudo service motion status.
Шаг 5. На этом этапе у нас уже практически все готово, нам необходимо всего лишь изменить одну настройку в конфигурационном файле Motion (/etc/motion/motion.conf) – мы должны выключить stream_localhost (off). Мы должны отключить эту настройку, иначе вы не сможете транслировать видео в сеть Интернет и оно будет доступно только на самой плате Raspberry Pi. Измените эту настройку в конфигурационном файле Motion (Motion Configuration file) с помощью редактора ‘nano’:
1 |
sudo nano /etc/motion/motion.conf |
Теперь у нас все готово к трансляции видеоизображения в сеть Интернет, получаемого с USB веб камеры, подключенной к плате Raspberry Pi. Запустите Motion с помощью следующей команды и откройте IP вашей Raspberry Pi на порту 8081 в вашем браузере (например, 192.168.1.103:8081):
1 |
sudo /etc/init.d/motion start |
После этого вы увидите транслируемое видеоизображение как показано на рисунке ниже. В данном проекте мы использовали очень дешевую USB веб камеру, но если вы хотите улучшить качество изображения в данном проекте, вы можете использовать более дорогую камеру с хорошим разрешением.
Кроме просмотра данного видеоизображения (видео стрима с камеры) на компьютере вы его также можете просматривать на любом устройстве, в котором есть браузер, например, смартфоне, планшете и т.д.
Установка библиотеки Flask для управления роботом через веб-страницу
В данном проекте мы с помощью библиотеки Flask создадим веб-сервер, с помощью которого можно будет передавать команды с веб-страницы на плату Raspberry Pi, которая, в свою очередь, управляет движениями робота. Flask позволит нам запускать наши скрипты на Python на веб-странице и, таким образом, получать и передавать данные от Raspberry Pi к веб-браузеру и наоборот. Flask представляет собой микро фреймворк (microframework) для Python. Он использует Unicode и имеет встроенный сервер разработки и отладки, поддержку тестирования интегрируемых компонентов, поддержку защищенных cookies и многое другое, что делает его весьма удобным для реализации проектов, подобных нашему.
Установить пакет для работы с Flask в Raspberry Pi можно с помощью следующей команды:
1 |
$ pip install Flask |
Далее мы можем подключить этот пакет в нашу программу также, как подключаем и другие библиотеки:
1 2 |
from flask import Flask from flask import Flask, render_template, request |
HTML код для веб-страницы
Для создания веб-страницы, с которой мы будем управлять нашим роботом, мы использовали язык HTML. Мы применили скрипт jQuery чтобы вызывать соответствующие функции в нашей программе на Python, в которой у нас будет запрограммировано 5 действий робота – Left (влево), Right (вправо), Forward (вперед), Backward (назад) и stop (остановка). Все эти функции будут вызываться при нажатии на соответствующие ссылки на нашей веб-странице. Функции запрограммированы таким образом, что робот движется в заданном направлении до тех пор пока мы удерживаем соответствующую ссылку нажатой. Как только мы отпускаем кнопку мыши, робот останавливается. Код нашей веб-страницы на HTML с включенными в него скриптами jQuery будет следующим:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
<html> <head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> </head> <body> <img src="http://192.168.43.199:8081" /> <!--Enter the IP Address of your Raspberry Pi--> <div style="float:right"> </div> <div style=" height:400px; width:300px; float:right;"> <center> <h1><span style="color:#5C5C5C;">Circuit</span><span style="color:#139442"> Digest</span></h1> <h2>Surveillance Robot</h2><br><br> <a href="#" id="up" style="font-size:30px;text-decoration:none;"> 🢁🢁<br>Forward</a><br><br></center> <a href="#" id="left" style="font-size:30px;text-decoration:none;"> 🢀🢀Left</a> <a href="#" id="right" style="font-size:30px; text-decoration:none;"> Right 🢂🢂</a><br><br> <center><a href="#" id="down" style="font-size:30px;text-decoration:none;"> Backward<br> 🢃🢃</a></center> </div> <script> $( document ).ready(function(){ $("#down").on("mousedown", function() { $.get('/down_side'); }).on('mouseup', function() { $.get('/stop'); }); $("#up").on("mousedown", function() { $.get('/up_side'); }).on('mouseup', function() { $.get('/stop'); }); $("#left").on("mousedown", function() { $.get('/left_side'); }).on('mouseup', function() { $.get('/stop'); }); $("#right").on("mousedown", function() { $.get('/right_side'); }).on('mouseup', function() { $.get('/stop'); }); }); </script> </body> </html> |
В представленном коде вы могли заметить IP, через который осуществляется трансляция (стриминг) видео. Мы его добавили в код страницы с помощью тега img src. Измените этот IP адрес в коде в соответствии с адресом вашей Raspberry Pi, но оставьте порт (port) без изменения.
1 |
<img src="http://192.168.43.199:8081" /> <!--Enter the IP Address of your Raspberry Pi--> |
Вам необходимо скопировать представленный фрагмент кода веб-страницы в любой текстовый редактор (например, notepad) и сохранить его с расширением .HTML (robot.html). Затем вам необходимо переместить этот файл в папку /templates, в которой находится программа на python. То есть вы должны создать папку templates, в которую поместить файл программы на Python для нашего проекта (приведен в конце статьи), а затем поместить в нее файл robot.html – это очень важно, иначе проект не будет работать. Открыть файл robot.html можно при помощи двойного клика мышки на нем, после этого вы можете попробовать нажимать на ссылки (стрелки), которые находятся на этой странице. Более подробно все эти процессы вы можете посмотреть на видео, приведенном в конце статьи.
После того, как все будет готово, вы должны запустить код программы на Python в Raspberry Pi и открыть IP адрес вашей платы с портом 5010 в вашем браузере (например, http://192.168.43.199:5010/).
Вы можете проверить IP адрес вашей платы Raspberry Pi используя команду ifconfig:
1 |
ifconfig |
Схема проекта
После того как вы протестировали работу трансляции видео с камеры и HTML код веб-страницы, вам необходимо разместить элементы конструкции проекта на шасси роботизированной машины. Сделать это можно с помощью клея, болтов, резиновой ленты и т.д.
Число соединений в нашей схеме невелико, нам необходимо сделать лишь несколько соединений с микросхемой драйвера двигателя L293D и электродвигателями постоянного тока. С целью экономии места мы закрепили микросхему L293D на перфорированной плате, но вы для этой цели можете также использовать макетную плату.
Схема роботизированной машины на Raspberry Pi с камерой наблюдения представлена на следующем рисунке.
Тестирование работы проекта
Принцип работы нашей роботизированной машины с камерой наблюдения достаточно прост. Создайте файл с расширением .py, скопируйте в него код программы, приведенный ниже, и сохраните его на своей Raspberry Pi. Затем поместите его вместе с HTML файлом веб-страницы в папку templates как описано выше в статье. Не забудьте поменять IP адрес, указанный в HTML файле.
Затем запустите программу Python на выполнение с помощью следующей команды:
1 |
python name_of_file.py |
Затем откройте IP адрес вашей Raspberry Pi с портом 5010, например, http://192.168.43.199:5010/. После этого вы увидите веб-страницу со ссылками в виде стрелок для управления роботом и транслируемое с камеры видео. Управлять роботом можно нажимая и удерживая в нажатом состоянии ссылки на веб-странице. При отпускании кнопки мышки робот будет автоматически останавливаться.
Исходный код программы на Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
from flask import Flask from flask import render_template, request import RPi.GPIO as GPIO import time app = Flask(__name__) m11=18 m12=23 m21=24 m22=25 GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(m11, GPIO.OUT) GPIO.setup(m12, GPIO.OUT) GPIO.setup(m21, GPIO.OUT) GPIO.setup(m22, GPIO.OUT) GPIO.output(m11 , 0) GPIO.output(m12 , 0) GPIO.output(m21, 0) GPIO.output(m22, 0) print "DOne" a=1 @app.route("/") def index(): return render_template('robot.html') @app.route('/left_side') def left_side(): data1="LEFT" GPIO.output(m11 , 0) GPIO.output(m12 , 0) GPIO.output(m21 , 1) GPIO.output(m22 , 0) return 'true' @app.route('/right_side') def right_side(): data1="RIGHT" GPIO.output(m11 , 1) GPIO.output(m12 , 0) GPIO.output(m21 , 0) GPIO.output(m22 , 0) return 'true' @app.route('/up_side') def up_side(): data1="FORWARD" GPIO.output(m11 , 1) GPIO.output(m12 , 0) GPIO.output(m21 , 1) GPIO.output(m22 , 0) return 'true' @app.route('/down_side') def down_side(): data1="BACK" GPIO.output(m11 , 0) GPIO.output(m12 , 1) GPIO.output(m21 , 0) GPIO.output(m22 , 1) return 'true' @app.route('/stop') def stop(): data1="STOP" GPIO.output(m11 , 0) GPIO.output(m12 , 0) GPIO.output(m21 , 0) GPIO.output(m22 , 0) return 'true' if __name__ == "__main__": print "Start" app.run(host='0.0.0.0',port=5010) |