Видеотрансляция на Youtube с Arduino Yun

Вероятно, вы встречали беспроводные камеры охранных систем.

Вы можете спокойно установить подобное устройство в вашем доме или за его пределами, подключить к вашей WiFi сети и получить доступ к видеостриму из любой части мира при наличии интернета. Но подобные видеокамеры используют интерфейс, предоставляемый производителем, что слегка ограничивает ваши возможности.

В этом проекте мы создадим наш собственный DIY аналог подобного устройства. Проект основан на Arduino Yun, к которому мы подключим стандартную USB веб-камеру и пироэлектрический датчик движения.

В первой части проекта мы реализуем возможность делать фотографии, когда обнаруживается движение - одна из стандартных задач современных охранных систем. Фотографии, сделанные с помощью USB камеры, будут храниться на SD карте, которая предварительно установлена на Yun. Но это не все! Так как мы живем в век интернета, эти фотографии будут автоматически загружаться в какое-то хранилище. В нашем конкретно случае, используем Dropbox для хранения снимков.

Следующий шаг - стрим видеопотока с нашей камеры на Youtube. В результате вы получите собственный стрим, доступный из любой точки мира в онлайн режиме. Интересно? Тогда давайте приступим!

Подключение оборудования

Сначала займемся подключением оборудования. Для проекта вам понадобятся: Arduino Yun, USB веб-камера, ПИР датчик движения, microSD карта.

Вы можете выбрать любую USB камеру, которая поддерживает UVC протокол. Большинство современных камер поддерживают этот протокол. В данном проекте используется видеокамера Logitech C270, которая делает снимки с разрешением 720p. Список совместимых видеокамер вы можете найти здесь

Сначала устанавливаем SD карту в плату Arduino Yun:

Установка SD карты в Arduino Yun

Подключите видеокамеру к USB порту вашей платы Yun:

Подключение USB видеокамеры к Arduino Yun

Ну и в конце подключите датчик движения к Yun. Просто подключите контакт VCC к пину 5V на Yun, GND к GND, а контакт SIG к пину номер 8 на Arduino Yun:

Подключение датчика движения и видеокамеры к Arduino Yun

Ну и в конце-концов подключайте весь проект к компьютеру с помощью microUSB порта!

Настраиваем Temboo и Dropbox аккаунты

Перед тем как приступать к разработке приложения, надо настроить аккаунты в веб-приложениях, которые мы будем использовать.

Первое приложение, в котором вам надо завести аккаунт - Temboo. Temboo будет связующим звеном между вашим Arduino Yun и Dropbox. Ссылка на сервис Temboo.

Вам предложат создать аккаунт и ваше первое приложение. Запишите имя аккаунта, название приложения и ваш API ключ. Они вам пригодятся в дальнейшем. Еще одна вещь, которая вам понадобится с вебсайта Temboo: Temboo Python SDK. Немного позже мы используем его для загрузки фотографий в Dropbox. Скачать можно по ссылке.

После загрузки, распакуйте архив на вашу microSD карту. Теперь переходим к вашему Dropbox аккаунту. Перейдите на сайт Dropbox.

После создания аккаунта, вам надо создать приложение (app), которое даст возможность Arduino Yun загружать снимки в папку в Dropbox. Для создания приложения, перейдите в раздел разработчика в Dropbox.

После этого нажмите “Create app” и выберите какой тип приложения вы хотите создать (в нашем проекте это будет Dropbox API app):

Создаем Dropbox API app

После этого выберите "Files and datastores":

Files and datastores в Dropbox API app

Сейчас надо получить все ключи (keys), которые имеют отношение к вашему Dropbox приложению, чтобы в дальнейшем вы могли использовать их в нашем проекте. На этом этапе нужны App Key и App Secret, которые отображаются на той же странице, что и ваш проект.

После этого нам надо получить Token Key и Token Secret key. Для того, чтобы к ним добраться, надо перейти в InitialiseOAuth Choreo на вебсайте Temboo.

Здесь надо ввести App Key и App Secret. В результате сгенерируется дополнительная информация вроде callback ID, и temporary token secret. Вам также предложат посетить Dropbox для подтверждения аутентификации. В конце попадаете на страницу FinalizeOAuth. Вас попросят ввести ваши App Key, App Secret, callback ID и temporary token secret.

После этого вы получите окончательный Token Key и Token Secret. Запишите их, в дальнейшем они вам пригодятся.

Вам также понадобится Google аккаунт для стрима видео Youtube. Для этого просто создайте его на этой странице.

Настраиваем Arduino Yun

Перед тем как писать программу для нашего проекта, надо установить дополнительный софт на ваш Arduino Yun. Кроме того, надо протестировать USB камеру, чтобы убедится в корректности работы драйверов. В дальнейшей части проекта предполагается, что ваш Arduino Yun настроен и подключен к локальной WiFi сети.

Сначала разбираемся с драйверами UVC. Для их установки вам надо подключить Yun через SSH. Просто откройте терминал и напишите:

ssh root@yourYunName.local

В этой строке надо вставить корректное имя вашего Arduino Yun, которое вы настраивали при его первом запуске. Вам также предложат ввести пароль. Если подключение прошло успешно, вы должны увидеть картинку из ASCII символов:

ASCII символы - Arduino Yun

Теперь мы можем установить необходимые расширения. Начните с обновления менеджера:

opkg update

После этого установите UVC драйвера:

opkg install kmod-video-uvc

И python-openssl:

opkg install python-openssl

Нам также понадобится утилита fswebcam, которую мы используем, чтобы делать снимки с терминала:

opkg install fswebcam

В последней части проекта нам понадобится библиотека mjpg streaming library:

opkg install mjpg-streamer

Теперь мы готовы тестировать веб-камеру. Убедитесь, SD карта установлена в Yun и перейдите в папку SD карты с помощью команды:

cd /mnt/sda1

Для проверки камеры сделайте фотографию. Для этого напишите:

fswebcam test.png

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

--- Opening /dev/video0...

2. Trying source module v4l2...

3. /dev/video0 opened.

Чтобы убедиться в том, что фотография была сделана успешно, извлеките SD карту из Arduino Yun и откройте на персональном компьютере. Фотография должна появиться в корне SD карты:

Содержимое SD карты на Arduino Yun

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

Загружаем фотографии на Dropbox с использованием Arduino Yun

Задача - сделать фотографию, если обнаружено движение в зоне чувствительности датчика движения. Когда фотография сделана, она сохраняется на SD карте и передается в Dropbox. Для этой задачи код делится на две части. Первая часть - это скрипт на Python, который обеспечивает подключение к Dropbox, сохраняет фотографию на SD карту и загружает ее на Dropbox. С использованием Python, загрузить файлы в Dropbox гораздо проще, чем напрямую из скетча Arduino. Вторая часть кода - это сам скетч Arduino, который вызывает Python скрипт, который делает фото с использованием библиотеки Bridge library платы Yun.

Давайте сначала напишем Python скрипт. Он начинается с подключения необходимых библиотек с Temboo Python SDK:

from temboo.core.session import TembooSession

from temboo.Library.Dropbox.FilesAndMetadata import UploadFile

Скрипт на Python принимает имя фотографии, оторую мы хотим загрузить в качестве аргумента:

with open(str(sys.argv[1]), "rb") as image_file:

encoded_string = base64.b64encode(image_file.read())

Помните Temboo запросы, которые вы составляли раньше? Вы должны в них указать:

session = TembooSession('yourTembooName', 'yourTembooApp', 'yourTembooKey')

После этого мы можем создать Dropbox библиотеку для загрузки файлов под названием "Choreo" на Temboo:

uploadFileChoreo = UploadFile(session)

uploadFileInputs = uploadFileChoreo.new_input_set()

Настало время ввести информацию о вашем Dropbox аккаунте, а именно: ваш app Key, app Secret, Access Token an Access Token Secret:

uploadFileInputs.set_AppSecret("appSecret")

uploadFileInputs.set_AccessToken("accessToken")

uploadFileInputs.set_FileName(str(sys.argv[1]))

uploadFileInputs.set_AccessTokenSecret("accessTokenSecret")

uploadFileInputs.set_AppKey("appKey")

uploadFileInputs.set_FileContents(encoded_string)

uploadFileInputs.set_Root("sandbox")

И, в конце-концов, загрузить файл на Dropbox:

uploadFileResults = uploadFileChoreo.execute_with_results(uploadFileInputs)

Теперь вы можете сохранить этот код в файле под названием upload_picture.py. Обратите внимание, что все файлы доступны на GitHub.

Теперь приступим к скетчу Arduino. Скетч начинается с подключения необходимых библиотек:

#include <Bridge.h>

#include <Process.h>

Нам надо объявить процесс, который мы собираемся использовать для вызова функций на Linux машине Yun (например, утилита fswebcam, которую мы использовали до этого):

Process picture;

Для каждой фотографии мы будем создавать имя файла, которое хранится в строке:

String filename;

Также мы объявляем пин, к которому подключен ПИР датчик движения:

int pir_pin = 8;

И путь к SD карте на Arduino Yun:

String path = "/mnt/sda1/";

Так как нам надо вызвать функции на Linux машине Yun, надо запустить Bridge:

Bridge.begin();

После этого, в loop() части скетча, проверяем, было ли обнаружено движение ПИР сенсором:

if (digitalRead(pir_pin) == true) {

Если да, мы генерируем уникальное имя файла на основании даты, когда фото было сделано:

filename = "";

picture.runShellCommand("date +%s");

while(picture.running());

while (picture.available()>0) {

char c = picture.read();

filename += c;

}

filename.trim();

filename += ".png";

После этого мы делаем первый запрос к Linux машине для того, чтобы сделать фотографию с помощью утилиты fswebcam. Обратите внимание, что мы добавили дополнительный аргумент с помощью команды -r, которая настроила разрешение. Используется максимальное разрешение видеокамеры - 720p:

picture.runShellCommand("fswebcam " + path + filename + " -r 1280x720");

while(picture.running());

После этого мы делаем второй запрос к Linux машине, в этот раз для вызова скрипта Python с именем фотографии в качестве аргумента. Этот скрипт загрузит фотографию на Dropbox:

picture.runShellCommand("python " + path + "upload_picture.py " + path + filename);

while(picture.running());

Теперь вы готовы тестировать проект. Опять таки, все файлы доступны на GitHub.

Файл Python надо записать в корневую папку на SD карте, которая устанавливается на плату Yun. После этого загрузите скетч на ваш Arduino Yun. Теперь можете попробовать отследить движение, например, помахав рукой перед ПИР датчиком. С некоторой задержкой веб-камера должна тоже активироваться (например, в нашем случае на камере есть зеленый светодиод, который загорается при активации).

Для проверки работоспособности проекта, вы можете через некоторое время проверить содержимое SD карты. На ней должны быть записанные фотографии:

Фотографии на SD карте с Arduino Yun

Вы также можете проверить вашу папку на Dropbox, в которую должны были загрузиться те же фото. Фотографии должны располагаться в папке Dropbox apps:

Фотографии с Arduino Yun в Dropbox

Стрим видео на Youtube

В этой последней части проекта мы реализуем еще одно приложение: стрим видео на Youtube в режиме реального времени. Для начала обеспечим локальную передачу данных с видеокамеры в онлайн режиме, а после передадим этот стрим на ваш компьютер с помощью программы Wirecast, которая передаст ролик дальше на Youtube.

Передать видео локально достаточно просто благодаря софту, который мы установили до этого. Просто зайдите на Yun через SSH и напишите:

mjpg_streamer -i "input_uvc.so -d /dev/video0 -r 640x480 -f 25" -o "output_http.so -p 8080 -w /www/webcam" &

Некоторые пояснения по поводу кода выше: аргумент -r настраивает разрешение (тут используется меньшее разрешение, так как передача в HD качестве тормозит). Аргумент -p настраивает порт, на котором будет доступен стрим. Для того, чтобы просмотреть стрим, перейдите в (заменив имя вашего Arduino Yun):

http://myarduinoyun.local:8080/stream.html

Вы должны попасть на страницу стрима с вашего Yun. На этой странице будет онлайн трансляция видео с вашей камеры:

Видеотрансляция с камеры и Arduino Yun

Теперь наша задача - отправить этот стрим на Yuotube. Для этого зайдите на Youtube и создайте новый Live Event:

Создаем Live Event на Youtube

Youtube запросит информацию о вашем стриме и порекомендует софт, который поможет передавать видео с вашего компьютера. В данном примере используется Wirecast, но другие подобные программы должны тоже нормально отрабатывать.

Вам надо добавить новый Web Stream в Wirecast, используя следующие параметры: HTTP protocol, Motion JPEG format, и "nameofyourYun.local:8080/?action=stream" в качестве URI. На фото ниже показаны настройки, которые использовались в данном проекте:

Настройки Wirecast

Бесплатная версия Wirecast будет периодически добавлять на ваш стрим дополнительные изображения, но это не очень мешает, так как появляются они достаточно редко. Через некоторое время стрим с вашего Arduino Yun появится в Wirecast интерфейсе:

Стрим с Arduino Yun в окне Wirecast

Находясь в окне Wirecast, нажмите "Stream". Софт уточнит некоторые ваши Youtube настройки и автоматически обнаружит ваш онлайн стрим. После этого можете вернуться к вашему event'у на Youtube. В настройках стрима вы должны увидеть, что Youtube получает данные:

Youtube получает данные от Wirecast

Если статус "GOOD", можете кликнуть на "Preview", чтобы Youtube подготовил ваш стрим:

Youtube подготавливает видеострим

Настройка займет некоторое время (около нескольких минут), после чего вы сможете кликнуть на "Start streaming". После этого вы сможете получить доступ к вашему стриму так же, как и к любому другому виде на Youtube:

Arduino Yun + видеокамера на Youtube канале

Поздравляем, теперь вы можете мониторить ваш дом из любой точки мира, введя в адресной строке браузера URL этого Youtube event'a! Есть несколько опций для настройки стрима. Если вы хотите поделиться ссылкой на стрим только тем людям, которым доверяете, можете выбрать опцию "Unlisted".

Выводы и идеи для дальнейшего развития

В этом гайде мы разобрались как подключить USB камеру к вашему Arduino Yun и реализовать два интересных и полезных проекта. Первый - это камера системы безопасности, которая автоматически загружает фотографии на Dropbox при обнаружении движения в зоне чувствительности датчика движения. Второй проект - стрим видео с камеры на Youtube в режиме реально времени, благодаря чему вы можете отслеживать состояние вашего двора/дома/комнаты и т.п. Из любой точки мира.

Конечно же, на основании этого проекта можно разработать и другие крутые приложения. Например, можно не использовать датчик движения, а просто настроить систему таким образом, что камера будет делать фотографии через определенные, установленные промежутки времени и загружать их в облако. Можно расширить проект, добавив больше Yun и видеокамер и создать полноценную систему мониторинга вашего дома!

Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!