Керована за допомогою Raspberry Pi відеокамера безпеки
Рейтинг статті: / 10
НайгіршеНайкраще 
Security CamДізнайтеся, як зробити віддалено видиму камеру безпеки з керування поворотами та нахилом за допомогою Raspberry Pi.
Network Security Cam_1
Що потрібно:
• Raspberry Pi 2 або 3 з Micro SD-картою
• Arduino UNO або аналогічна плата
• Два мікро- або міні сервоприводи
• USB веб-камера
• Проводи для з’єднання
• Конструкції для кріплення камери
Конструювання камери безпеки
Прикріпіть кронштейни (маленькі пластикові "фігури") до кожного сервоприводу за допомогою доданого гвинта. Форма особливого значення не має, хоча, чим більша, тим краще. Не затягуйте гвинт.
Тепер використайте зв'язку кронштейнів, щоб прикріпити один сервопривід до іншого під прямим кутом. Один з них буде повертати (зліва-направо), в той час як інший буде нахиляти (вгору і вниз). Не має значення, який з них що робить - це можна скоригувати в коді.
Network Security Cam_2
І, нарешті, підключіть веб-камеру до одного з сервоприводів. Ви можете використати для цього зв'язку кронштейнів. Для стабільності, можете змонтувати всю установку в коробці. Проста картонна коробка робить все досить красиво. Можна вирізати акуратний квадратний отвір і змонтувати один сервопривід врівень з поверхнею.
Network Security Cam_3
Коротко про веб-камери
Не всі веб-камери USB однакові. Підключіть веб-камеру до USB-порту свого RPi і виконайте наступну команду:
lsusb
Ця команда відображає інформацію про всі пристрої USB, підключені до RPi. Якщо веб-камери немає в списку, тои можете спробувати USB-хаб і повторити команду. Якщо веб-камера, як і раніше, не визнається то, можливо, доведеться придбати сумісну веб-камеру.
Налаштування Servo
Сервоприводи можуть здатися страшними і складними, але в дійсності їх дуже просто підключити. Сервоприводи працюють з використанням широтно-імпульсної модуляції (ШІМ), яка представляє собою спосіб імітації аналогових сигналів для цифрових систем. ШІМ-сигнали, по суті, швидке перемикання сигналу ON - OFF. Сигнал, який ON або HIGH, описується з використанням робочого циклу. Робочий цикл виражається у відсотках і описує, як довго сигнал ON. ШІМ-сигнал на 25% робочого циклу буде включений протягом 25% періоду, і OFF - для інших 75%. Сигнал ON на початку, а потім OFF далі – це регулярні імпульси протягом дуже короткого періоду часу.
Сервоприводи прослуховують ці імпульси і реагують відповідним чином. Використання робочого циклу 100% буде таким же, як "звичайні" 5В, і 0% буде таким же, як земля. Не хвилюйтеся, якщо не в повній мірі зрозуміли, як працює ШІМ, ви вже зможете контролювати сервоприводи (дізнатися більше можна з уроку).
Є два основних способи використання ШІМ - апаратне або програмне забезпечення. Апаратні засоби PWM часто забезпечують більш низьку латентність (як довго між сервоприводом приймаються команди і виконується переміщення), ніж програмне забезпечення PWM, проте RPi має на відповідному виводі тільки одну апаратну ШІМ. Доступні зовнішні схеми для забезпечення безлічі каналів апаратного ШІМ, проте простий Arduino також може впоратися з завданням, так як він має кілька виводів апаратного ШІМ.
Нижче наведена схема:
Network Security Cam_4
Двічі перевірте роз’єми для свого RPi, вони трохи різняться між моделями. Ви повинні з'ясувати, як підключені ваші сервоприводи. Сервоприводи вимагають для управління три провідника, кольори яких будуть трохи відрізнятися:
• Червоний позитивний, підключити до RPi +5В
• Коричневий або чорний - негативний, підключити до GND на RPi
• Помаранчевий або білий сигнал - підключити до виводів 9 і 10 Arduino
Налаштування Arduino
Новачок в Arduino? Початок тут.
Після того, як підключені серво, відкрийте Arduino IDE на своєму комп'ютері і завантажте цей тестовий код. Не забудьте вибрати правильну плату і порт з меню Tools > Board і Tools > Port:
#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
    }
}
Якщо все добре, то ви повинні побачити, що обидва сервоприводи повільно рухаються назад і вперед. Зверніть увагу на те, що "servoMin" і "servoMax"визначаються як 20 і 160 градусів (замість 0 і 180). Це почасти тому, що дешеві сервоприводи не можуть точно переміщатися на повні 180 градусів, а також фізичний розмір веб-камери не дозволяє використовувати повний діапазон. Можливо, вам буде потрібно налаштувати їх для своєї установки.
Якщо вони не працюють взагалі, то перевірте, чи належним чином все підключено в схемі. Плати можуть іноді відрізнятися за якістю, тому їх також бажано перевірити.
Сервоприводи майже завжди занадто потужні для живлення Arduino, тому їм треба отримувати живлення від RPi. Вивід 5 В RPi обмежує струм 750 мА, який надається всьому RPi, а RPi споживає приблизно 500 мА, тому 250 мА залишається для сервоприводів. Ці мікро сервоприводи споживають близько 80 мA, а це означає, що RPi повинен бути в змозі живити два з них. Якщо хочете використовувати більше сервоприводів або моделі більш високої потужності, то вам, можливо, доведеться використати зовнішнє джерело живлення.
Тепер завантажте наступний код в Arduino. Він буде прослуховувати вхідні послідовні дані (послідовно, як і в Universal Serial Bus або USB). RPi буде відправляти ці дані через 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
        }
    }
}
Ви можете перевірити даний код, відкривши монітор послідовного порту (правий верхній кут > Serial Monitor) і відправити деякі тестові дані:
• 90P
• 0P
• 20T
• 100T
Зверніть увагу на формат команди - значення, а потім буква. Значення - положення сервоприводу, а буква (великими літерами) визначає панорамування або нахил сервоприводу. Оскільки ці дані передаються з RPi послідовно, то кожен один символ приходить за один раз. Arduino повинен "зберігати" їх, поки не буде передана вся команда. Остання буква не тільки визначає сервопривід, вона також дозволяє Arduino знати, що більше немає даних в цій команді.
Налаштування RPi
Тепер прийшов час, щоб налаштувати RPi. По-перше, встановіть операційну систему. Підключіть веб-камеру і Arduino до USB RPi.
Оновлення Pi:
sudo apt-get update
sudo apt-get upgrade
Встановлення motion:
sudo apt-get install motion
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 - Ніколи не зберігати ніяких зображень
Це досить великий файл, так що можете використати Ctrl+W для пошуку рядків. Після завершення, натисніть CTRL+X, а потім підтвердіть, щоб зберегти і вийти.
Тепер необхідно відредагувати ще один файл:
sudo nano /etc/default/motion
Встановіть "start_motion_daemon=yes". Це необхідно для забезпечення запуску Motion.
Тепер дізнайтеся свою IP-адресу:
ifconfig
Ця команда покаже деталі з мережі для RPi. Подивіться на другому рядку inet addr. Ви можете встановити статичну IP-адресу, але зараз запишіть цей номер.
Тепер запустіть Motion:
sudo service motion start
Ви можете зупинити або перезапустити Motion шляхом заміни "start" на "stop" або "restart".
Перейдіть на свій комп'ютер і зайдіть на RPi з веб-браузера:
http://xxx.xxx.x.xx:8081
Де xxx.xxx.x.xx є IP-адреса RPi. Наступне число після двокрапки - порт, який був раніше налаштований. Якщо все добре, то ви повинні побачити потік з веб-камери! Спробуйте повертати її навколо і побачити, як виглядають речі. Вам можливо треба буде відрегулювати налаштування яскравості та контрастності в файлі конфігурації. Також може знадобитися сфокусувати веб-камеру - деякі моделі мають невелике кільце фокусування навколо об'єктива. Поверніть його, поки зображення не стане найчіткішим.
Поверніться на RPi, створіть папку і перейдіть в неї:
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, що запускати сервер в зазначеному каталозі. Якщо ви зробите які-небудь зміни в сценаріях всередині папки "security-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-адресу свого RPi (raspberrypi.local повинно також працювати, якщо використовуєте останню Raspbian). Перезапустіть веб-сервер, а потім перейдіть до RPi зі свого комп'ютера, вказувати порт немає необхідності. Ви повинні бути в змозі переміщатися вліво і вправо, та побачити потік відео:
Тепер у вас є власна мережева камера з панорамування і нахилом. Якщо хочете виставити свою веб-камеру в Інтернеті, то не забудьте розглянути питання про безпеку - а потім глянути на перенаправлення портів, щоб ваш маршрутизатор знав, куди посилати вхідні запити. Можна додати зовнішнє джерело живлення і адаптер Wi-Fi для дійсно портативного пристрою.
(Джерело EN: makeuseof.com)
 
>
КнигаНовиниПрактика пошукуПартнериПро нас
Підтримка та дизайн: Могильний С.С. Шаблон: Joomla Templates by BuyHTTP Joomla Hosting