Вторая версия моей смарт-камеры видеонаблюдения: после неудачного опыта с Orange Pi перешел на Raspberry Pi Zero W.
Так камера выглядит в раскрытом виде: плата Pi Zero W, конечно, заметно меньше, чем Orange Pi PC Plus - в корпусе осталось много свободного пространства. Зато получилась неплохая платформа, в которой можно тестировать разные платы :)
Веб-камеру я заменил на Raspberry Pi Camera Module v1.3 с разрешением 5 Mp. Для ее подключения к Zero Pi нужно использовать шлейф CSI - microCSI.
Модели переходных плат можно найти в git проекта. Остальные детали остались теми же, что и в первой версии.
Для начала не стал подключать PIR-сенсор и сфокусировался на том, чтобы сделать timelapse-камеру, которой можно было бы управлять с помощью web-приложения из любого браузера. Например, с телефона, что особенно актуально при настройке камеры где-нибудь на дереве.
Связь с камерой - по wi-fi, причем как для настройки / отладки (подключение к домашней сети), так и для работы (точка доступа). Чтобы было удобно переключаться между этими режимами, сделал скрипт wifi_config.sh (все исходники есть в git проекта)
для его работы в папке /etc необходимо создать два файла:
- dhcpcd.wifi.conf - без dhcp для подключения к существующей wi-fi сети
- dhcpcd.ap.conf - со статическим адресом для интерфейса wlan0
ими подменяется файл /etc/dhcpcd.conf в зависмости от требуемой настройки сети.
Запускать скрипт необходимо в правами root и одним из параметров ap / wifi:
$ sudo ./wifi_config.sh ap
Можно переходить к web-приложению: оно написано на python3 с помощью фреймворка flask . Структура проекта:
|--- snapshot.sh
|--- timelapse.sh
|--- static/
|--- style.css
|--- img/
|--- snapshot.jpg
|--- index.html
Немного расскажу о составных частях проекта. Сначала - основной модуль app.py - не буду приводить полный листинг, он есть в git.
У приложения одна страница, так она выглядит в браузере:
Приложение должно выполнять три задачи:
Захват кадра для предпросмотра:
это блокирующий вызов - приложение ожидает завершение метода call, который возвращает код завершения скрипта snapshot.sh. Это удобно, т.к. после нажатия на кнопку SNAPSHOT страница в браузере переходит в загрузку и обновляется после получения нового кадра, что занимает несколько секунд: видно, что процесс идет, есть реакция на нажатие кнопки.
Из параметров камеры, которые бы мне хотелось настраивать - вывел на страницу только white balance (awb) - т.к. в автоматическом режиме при съемке серии он непредсказуемо меняется, что не здорово сказывается на итоговом видео: лучше зафиксировать awb для всей серии.
Запуск скрипта съемки серии кадров:
Модуль subprocess содержит метод poll, который возвращает код завершения процесса или None, если тот еще длится:
Приложение содержит всего одну страницу, за отображение которой отвечает функция index():
в ней обрабатываются запросы HTTP: GET и POST. Для отображения страницы используется функция render_template:
параметры отображения ей при этом передаются с помощью словаря templateData - такой способ не ограничивает их количество:
Некоторую сложность для меня составило то, что после съемки кадра предпросмотра, он не обновлялся на странице - нашел такое комбинированное решение:
установить параметр конфигурации SEND_FILE_MAX_AGE_DEFAULT:
и добавить функцию отключения кэширования данных, выполняемую после каждого запроса:
Работает на Chrome и на Firefox - если изображение /static/img/snapshot.jpg изменяется, то на страницу загружается обновленное.
Что касается скриптов: snapshot.sh просто вызывает raspistill с требуемыми параметрами - ничего особенного; timelapse.sh поинтересней:
в него я добавил еще пару функций:
- очистка папки, куда будут записываться новые изображения
- завершение работы приложения и выключение wi-fi для энергосбережения
- выключение камеры после съемки - чтобы узнать, сколько заряда тратится на продолжительную съемку (например, за сутки).
Код страницы index.html также есть на git, приводить его здесь полностью нет смысла. Хочу только заметить, что изначально поставил себе цель заполнять шаблон данными из приложения, для чего flask, как мне видится, дает достаточно удобный функционал (правда, это мой первый подобный опыт, так что сравнивать особо не с чем). Например, для заполнения списка установок баланса белого и сохранения выбранного элемента при обновлении страницы, можно использовать для формирования <select> такой цикл, в который достаточно передать список и имя выбранного элемента:
Стили в style.css я использовал по минимуму: настройка фона, шрифтов и положения элементов на странице, чтобы вынести элементы для настройки и запуска таймлапса на отдельную строку.
Сделал автозапуск приложения с помощью cron:
$ crontab -e
добавив в конец файла строку:
Собственно, о приложении на этом все. Но есть еще один момент, о котором нужно упомянуть.
На модуле камеры есть красный светодиод, который включается на время съемки:
В светлое время это не создает проблем, а вот при съемке ночью, свет от него, отраженный от защитного стекла, начинает создавать очень неприятные блики в правом нижнем углу кадра:
Чтобы его отключить, необходимо в конец файла config.txt
$ sudo nano /boot/config.txt
добавить строку
после чего перезагрузить raspberry.
Вот такой получился проект :) Напоследок, таймлапс на 14 часов с интервалом съемки 20 секунд:
Let`s go design!
Комментарии
Отправить комментарий