Камера наблюдения для умного дома на Raspberry Pi + Arduino
Камера наблюдения для умного дома на Raspberry Pi + Arduino
Хотя есть очень много камер наблюдения, MakeUseOf взял его на следующий уровень с возможностью удаленного управления камерой. Это DIY панорамирование и наклон камеры использует Raspberry Pi плюс Arduino Uno, пару сервоприводов, и USB веб-камеру.
Стрим видео Pi на веб-страницу и добавлено несколько кнопок для перемещения камеры. Из-за отсутствия аппаратно ШИМ-пинов, сервоприводы управляются Arduino, который подключен к Pi. В то же время, сервер Python обрабатывает веб-интерфейс и команды.


Что нам нужно

    
Raspberry Pi 2 или 3 с картой MicroSD
    
Arduino UNO или аналогичный
    
2 x микро- или мини сервопривода
    
USB веб-камера
    
Папа-папа монтажные провода
    
Папа-мама монтажные провода

    Стяжки
    

Создание камеры наблюдения

Прикрепите для каждого сервопривода его винт. Теперь используйте стяжки, чтобы прикрепить один сервопривод к другому под прямым углом. Один из них будет поворачиваться слева направо, в то время как другой будет наклонятся вверх и вниз.
И, наконец, подключаем веб-камеру к одному из сервоприводов. Вы можете использовать стяжки для этого, хотя есть веб-камеры  с зажимом, что ввинчивается на дно. Можете сервоприводы поместить в коробку.

Слово о Веб-камере

Не все USB Веб-камеры созданы одинаково. Подключите веб-камеру к USB-порту вашего Pi и выполните следующую команду:

lsusb

Эта команда отображает информацию обо всех устройствах USB, подключенных к Pi. Если веб-камера не в списке, вы можете попробовать через USB хаб и повторить команду. Если веб-камера по-прежнему не видна вам, возможно, придется приобрести совместимую веб-камеру.

Настройка сервопривода

В то время как работа с сервоприводами может показаться чем-то страшным и сложным,на самом деле их очень просто подключить. Сервоприводы работают на широтно-импульсной модуляции (ШИМ), который представляет собой способ для цифровых систем имитации аналоговых сигналов. ШИМ-сигналы, по существу, быстрые ON - OFF сигналы. Сигнал ON или HIGH описывается с использованием рабочего цикла. Рабочий цикл выражается в процентах, и описывает, как долго длится сигнал. ШИМ-сигнал 25% рабочего цикла будет ON в течение 25% времени, и OFF для остальных 75%.

Сервоприводы ожидают этих импульсов и действуют соответствующим образом. Использование рабочего цикла 100% будет таким же, как "обычные" 5В, и 0% будет таким же, как земля.

Pi имеет только один аппаратный ШИМ пин. Простой Arduino также может справиться с задачей, так как они имеют несколько пинов аппаратного ШИМ.

Вот схема:

Дважды проверьте распайку для вашего Pi, они немного различаются между моделями. Вы должны выяснить, как ваши сервоприводы подключены. Сервоприводы требуют три провода, чтобы управлять ими, однако цвета немного отличаться:

    
Красный положительный, подключить к Pi + 5v
    
Коричневый или черный является отрицательным, подключить к GND на Pi
    
Оранжевый или белый провод подключить к Arduino штырям 9 и 10.


Установка Arduino

Arduino является платформой электроники прототипирования с открытым исходным кодом, основанная на гибкой, простой в использовании системе аппаратных средств и программного обеспечения. Она предназначена для художников, дизайнеров, любителей и всех, кто заинтересован в создании интерактивных объектов и т.п.

После того, как серво подключены, откройте Arduino IDE на вашем компьютере и загрузите этот тестовый код.  Board and Tools > Port menus">Не забудьте выбрать правильный  порт из Tools>инструменты> меню Port

<span title="#include // Import the library">#include <Servo.h> // Импорт библиотеки


#include <Servo.h> // Import the library
Servo servoPan, servoTilt; // Create servo objects
int servoMin = 20, servoMax = 160; // Define limits of servos
void setup() {
    // Setup servos on PWM capable pins
    servoPan.attach(9); 
    servoTilt.attach(10);
}
void loop() {
    for(int i = servoMin; i < servoMax; ++i) { 1
        // Move servos from minimum to maximum 
        servoPan.write(i); 
        servoTilt.write(i); 
        delay(100); // Wait 100ms 
    } 
    for(int i = servoMax; i > servoMin; --i) {
        // Move servos from maximum to minimum
        servoPan.write(i);
        servoTilt.write(i);
        delay(100); // Wait 100ms
    }
}
<span title="#include // Import the library">
Если все хорошо вы должны увидеть что оба сервопривода медленно двигаются взад и вперед. Обратите внимание на то, как "servoMin" и servoMax" определяются как 20 и 160 градусов (вместо 0 и 180). Это отчасти потому, что эти дешевые сервоприводы не могут точно перемещаться на полные 180 градусов, а также из-за физического размера веб-камеры нельзяиспользуется полный диапазон. Возможно, вам потребуется настроить их для вашей установки.

Если они не работают,  перепроверьте правильно ли подключена цепь.
Сервоприводы слишком мощные для Arduino по мощности, так что они будут получать питание от Pi. 5В дорожка на Pi ограничена 750 мА, на всех Pi, Pi и потребляет приблизительно 500мА, 250мА оставляя для сервоприводов. Эти микро сервоприводы потребляют около 80mA, а это означает Pi должен быть в состоянии обрабатывать их два. Если вы хотите использовать больше сервоприводов,  придется использовать внешний источник питания.

Теперь загрузите следующий код в Arduino.  Pi будет отправить эти данные через USB к Arduino, говоря ему, куда должны двигаться сервоприводы.


#include <Servo.h> // Import the library
Servo servoPan, servoTilt; // Create servo object
String data = ""; // Store incoming commands (buffer)
void setup() {
    // Setup servos on PWM capable pins
    servoPan.attach(9); 
    servoTilt.attach(10);
    Serial.begin(9600); // Start serial at 9600 bps (speed)
}
void loop() {
    while (Serial.available() > 0)
    {
        // If there is data
        char singleChar = Serial.read(); // Read each character
        if (singleChar == 'P') {
            // Move pan servo
            servoPan.write(data.toInt());
            data = ""; // Clear buffer
        }
        else if (singleChar == 'T') {
            // Move tilt servo
            servoTilt.write(data.toInt());
            data = ""; // Clear buffer
        }
        else {
            data += singleChar; // Append new data
        }
    }
}
<span title="#include // Import the library">
 Serial Monitor) and sending some test data:    ">Вы можете проверить этот код, открыв монитор последовательного порта (в правом верхнем углу> Serial Monitor) и отправить некоторые тестовые данные:

  • 90P
  • 0P
  • 20T
  • 100T
Обратите внимание на формат команды - это значение, а затем буква. Значение положение сервопривода, а буква (заглавными буквами) определяет панорамирование или наклон сервопривод. Поскольку эти данные передаются из Pi последовательно, каждый символ приходит через один за один раз. Arduino должен хранить их, пока не была передана вся команда. Последняя буква не только определяет какой сервопривод должен работать, он также позволяет Arduino знать, что нет больше данных в этой команде.

Наконец, отсоедините Arduino от компьютера и подключите его к Raspberry Pi через обычный USB порт.



 
 Настройка Pi

Теперь пришло время, чтобы настроить Pi. Во-первых, установите программу. Подключите веб-камеру и Arduino к USB Pi.
Загрузите на Pi:

sudo apt-get update
sudo apt-get upgrade
Установите движение:
sudo apt-get install motion

Движение это програмная обработка потокового видео веб-камерыОна обрабатывает всю тяжелую работу, и даже может выполнять обнаружение движения и записи (попробуйте построение системы безопасности движения захвата). Откройте файл конфигурации Motion:
sudo nano /etc/motion/motion.conf
Этот файл содержит множество опций для настройки Motion. Настройка следующим образом:

    
daemon on - Запустить программу
    
framerate: 100 - Сколько кадров или изображений / сек на поток
    
stream_localhost off - Разрешить доступ по сети
    
width 640 - ширина видео, настроить для вашей веб-камеры
    
height 320 - высота видео, настроить для вашей веб-камеры
    
stream_port 8081 - порт для вывода изображения
    
output_picture off - Не сохранять любые изображения


Теперь необходимо отредактировать еще один файл:

sudo nano /etc/default/motion
Набор "start_motion_daemon = да". Это необходимо для обеспечения движения.

Теперь узнать свой IP-адрес:


ifconfig

Эта команда покажет детали сетевого соединения для Pi. Посмотрите на второй строке, inet addr.
Запишите этот номер.

Теперь начните движения:
sudo service motion start
Переключение на ваш компьютер и перейдите к Pi из веб-браузера:


http://xxx.xxx.x.xx:8081
Где xxx.xxx.x.xx является Pi IP-адрес.
Вернемся к Pi, создайте папку и перейдите в нее:

mkdir security-cam
cd security-cam/
Теперь установите Twisted:
sudo apt-get install python-twisted
Twisted является веб-сервер написан на Python, который будет слушать команды, а затем действовать соответствующим образом.
После установки, нужно создать сценарий Python для выполнения команд (перемещения сервоприводов).
sudo nano servos.rpy
Обратите внимание на то, как расширение файла ".rpy" вместо "ру". Вот код:
# Import necessary files
import serial
from twisted.web.resource import Resource
# Setup Arduino at correct speed
try:
        arduino = serial.Serial('/dev/ttyUSB0', 9600)
except:
        arduino = serial.Serial('/dev/ttyUSB1', 9600)
class MoveServo(Resource):
        isLeaf = True
        def render_GET(self,request):
                try:
                # Send value over serial to the Arduino
                        arduino.write(request.args['value'][0])
                        return 'Success'
                except:
                        return 'Failure'
resource = MoveServo()
  Теперь вы можете запустить веб-сервер:

sudo twistd -n web -p 80 --path /home/pi/security-cam/
Позволяет разбить его - "-p 80" указывает порт (80). Это порт по умолчанию для веб-страниц. "–path /home/pi/security-cam/" сообщает Twisted для запуска сервера в указанном каталоге. Если вы сделаете какие-либо изменения в сценариях внутри папки "безопасности Cam" вам необходимо будет перезапустить сервер (CTRL + X, чтобы закрыть, а затем снова запустить команду).

Теперь создать веб-страницу:
sudo nano index.html
Вот код веб-страницы:
<!doctype html>
<html>
<head>
<title>Make Use Of DIY Security Camera</title>
<style type="text/css">
#container {
/* center the content */
margin: 0 auto;
text-align: center;
}
</style>
</head>
<body>
<div id="container">
<img src="http://PI_IP_ADDRESS:8081" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script><br />
<button onclick="servos.move('P', 10)">Left</button>
<button onclick="servos.move('P', -10)">Right</button>
<button onclick="servos.move('T', -10)">Up</button>
<button onclick="servos.move('T', 10)">Down</button>
</div>
</body>
<script>
var servos;
$( document ).ready(function() {
servos = moveServos();
});
function moveServos() {
// Store some settings, adjust to suit
var panPos = 70, 
tiltPos = 90, 
tiltMax = 170, 
tiltMin = 45, 
panMax = 170, 
panMin = 20;
return {
move:function(servo, adjustment) {
var value;
if(servo == 'P') {
if(!((panPos >= panMax && adjustment > 0) || (panPos <= panMin && adjustment < 0))) {
// Still within allowed range, "schedule" the movement
panPos += adjustment;
}
value = panPos + 'P';
}
else if(servo == 'T') {
if(!((tiltPos >= tiltMax && adjustment > 0) || (tiltPos <= tiltMin && adjustment < 0))) {
// Still within allowed range, "schedule" the movement
tiltPos += adjustment;
}
value = tiltPos + 'T';
}
// Use AJAX to actually move the servos
$.get('http://PI_IP_ADDRESS/servos.rpy?value=' + value);
},
}
}
</script>
</html>
Измените "PI_IP_ADDRESS" (используется дважды) к реальному IP-адрес вашего Pi (raspberrypi.local должны также работать, если вы используете последнюю версию Raspian). Перезапустите веб-сервер, а затем перейдите к Pi с вашего компьютера, нет необходимости указывать порт. Вы должны быть в состоянии перемещаться влево и вправо, и увидеть поток видео:

Там у вас есть ваша собственная камера наблюдения.

Источник
{poster_avatar}  admin
5 151