"Orks generate a potent psychic gestalt field that allows them to accomplish many feats of technological engineering that might otherwise seem impossible" (c) Выдержка из wiki по wh40k

⚠️ Дисклеймер

Автор осознаёт, что скрытая видеосъёмка нарушает законодательство и право на частную жизнь. Ничем подобным мы здесь заниматься не будем. Этот проект создан исключительно в образовательных и экспериментальных целях — для изучения Raspberry Pi, ее переферии и в целом - just for lulz.

Устройство не предназначено для скрытого наблюдения. Аналогичные устройства находятся в свободном обороте.

Во время тестов устройство устанавливалось с предупреждающей наклейкой, тестирование проводилось с согласия соседей.

Автор не планирует использовать видеоглазок в жилом помещении и настоятельно не рекомендует применять подобные устройства без соблюдения законов и норм приватности.

Предистория

Однажды, мне захотелось установить в квартире дверной глазок. Прочекав доступные варианты на рынке, я остался... Разочарован -_-
Большинство доступных решений страдают одной из трех проблем:

  • Управление через собственный UI азиатского происхождения, что с ненулевой вероятностью превращает ваш front door в back door.

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

  • Ряд полупрофессиональных решений имеет аналоговые видеовыходы (как от Sony Playstation 1 =)), соответственно, для вывода видеосигнала нужно узкоспециализированное оборудование (может нет, я не спец, но перспектива тянуть 5 метров колокольчиков через прихожую и гостиную к ламповому телевизору меня напугала).

Речь о подобных штуках
Аналоговые выводы этого устройства намекают на анал..оговые проблемы с выводом изображения, если потребуется реализовать что-то сложнее трансляции изображения на монитор
Аналоговые выводы этого устройства намекают на анал..оговые проблемы с выводом изображения, если потребуется реализовать что-то сложнее трансляции из��бражения на монитор

Я решил выяснить - получится ли создать собственное устройство с возможностью удаленного доступа к видеопотоку, мониторингу состояния и детектом движения, не имея опыта с микроконтроллерами, не будучи радиолюбителем и обладая весьма ограниченным набором инструментов?

Немного system design

Требования к велосипеду были следующие:

  • Возможность передачи картинки по локальной сети в реальном времени времени с минимально возможной задержкой в режиме минимальной шакализации

  • Возможность мониторить состояние устройства включено/отключено, температура

  • Установка устройства не должна повлечь за собой сверления/распила/деформации или любого иного перманентного изменения дверной панели

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

  • Стоимость комплектующих не имеет значения до тех пор, пока работа над проектом остается веселой и не требуется дорогостоящего оборудования, например 3D принтера, только ручной колхоз

Известно, что подобные самоделки делаются из головы, но понимая, что проект получится распределенным, ибо для мониторинга состояний (в частности, отключений) нам потребуется внешний наблюдатель, я изобрел некое подобие system design схемы:

Разумеется, некоторые идеи не дожили до релиза, в частности от motion пришлось отказаться, впрочем об этом позже
Разумеется, некоторые идеи не дожили до релиза, в частности от motion пришлось отказаться, впрочем об этом позже

Железки

За основу был взят Raspberry PI Zero 2 W. На момент начала работы я ни разу не держал в руках ни одну малинку, но слышал, что работа с ними достаточно интуитивна, т.к. на борту стоит свой дистрибутив linux, кроме того, присутствует нативная поддержка широкого спектра видеоустройств, предназначенных специально для Raspberry. На версию Zero 2 W выбор пал всвязи с т̶е̶м̶,̶ ̶ч̶т̶о̶ ̶о̶н̶а̶ ̶с̶а̶м̶а̶я̶ ̶д̶е̶ш̶е̶в̶а̶я̶̶ ̶и̶з̶ ̶а̶к̶т̶у̶а̶л̶ь̶н̶о̶й̶ ̶л̶и̶н̶е̶й̶к̶и̶ ее небольшими размерами. Начало было положено:

Обратите внимание на отсутствие GPIO расширителя с пинами на плате. В будущем это стало проблемой, впрочем... Я пока об этом не знаю...
Обратите внимание на отсутствие GPIO расширителя с пинами на плате. В будущем это стало проблемой, впрочем... Я пока об этом не знаю...

На фото выше представлена сама платка, 128 гб microSD и usb адаптер для оной. Сама настройка достаточно тривиальна - при помощи Raspberry Pi Imager, накатываем на microSD Raspberry PI OS, вставляем карточку в разъем на плате, даем питание, подключаемся к плате по SSH.
Не всегда все шло гладко, в процессе разработки несколько раз вайпал microSD, бывало что малинка не хотела автоматически подключаться к домашнему wi-fi, соответственно доступ к терминалу ломался. На этот случай на плате предусмотрен microUSB разъем под переферию, в паре с mini-HDMI для вывода GUI RPI os на монитор, чем я порой и пользовался для настройки сети.

Китайский разветвитель в данном случае был особенно удобен
Китайский разветвитель в данном случае был особенно удобен

В качестве камеры использована китайская rpi-совместимая 5 мп камера с AliExpress на гибком шлейфе. На самом деле, выбор камер под данный разъем невообразимо велик. Я прикинул, что качество и возможность ночной съемки (я не смогу адекватно вывести IR подсветку за пределы помещения) мне не принципиальны, однако возможность встроить объектив непосредственно в окуляр глазка выглядит привлекательно, поэтому выбор пал на данный вариант:

У данной камеры нет автофокуса, фокусировка производится поворотом кольца на объективе, это удобно, учитывая то, что фокусировку под окуляр придется настроить всего раз
У данной камеры нет автофокуса, фокусировка производится поворотом кольца на объективе, это удобно, учитывая то, чт�� фокусировку под окуляр придется настроить всего раз

Система

Архитектура клиент/сервер. Сервером в данном случае выступает внешняя VPS тачка с Ubuntu Server на борту и самыми дешевыми конфигами, которые только можно арендовать. Немудрено, ведь мы не собираемся транслировать видеопоток через сервер, фактически, он требуется в качестве хоста для tg бота уведомлений + как хранилище состояний подключенных клиентов. Реализация на Go внутри Docker контейнера.

Клиентом считаем саму Zero 2W. Внутри два логических компонента - клиент на Go внутри того-же контейнера и предустановленный mediamtx (https://github.com/bluenviron/mediamtx). Изначально планировалась реализация с использованием Motion - он проще в настройке, он поддерживает распознавание движения из коробки, у него есть собственное подобие фронтенда для доступа к трансляции и настройкам прямо во время работы. К сожалению, после первых тестов я получил от реалий по башке - распознавание движений даже на самых щадящих настройках, потребляет все ресурсы малинки, из-за чего трансляция становится шакальной и дерганной. На замену Motion я пробовал популярное решение RPi-Cam-Web-Interface, однако е̶г̶о̶ ̶я̶ ̶н̶е̶ ̶о̶с̶и̶л̶и̶л при работе с ним на новых версиях RPI os, существуют нюансы, в процессе колдунства над которыми, я наткнулся на mediamtx, с которым и продолжил работать. Сам mediamtx представляет собой интерфейс для работы с камерами + веб сервер для вывода картинки в локальную сеть (то, что нам нужно). Из дополнительных фич - отдельный функционал для работы с нативными камерами малинок, удобно. Basic авторизация, для работы в локальной сети - достаточно.

Изначально Go часть клиента предназначалась для решения двух задач: представляться серверу при запуске устройства (сервер выводит уведомление о подключении), отсылать heartbeat на сервер раз в n секунд (heartbeat прекращается = клиент RIP, выводим уведомление):

🐸
🐸

Однако после того, как я установил motion и начал с ним экспериментировать, возникла необходимость в системе охлаждения, ибо малинка начала выдавать 80c+ в пиках. Клиент научился репортить температуру при достижении определенных значений:

При тестировании, горячий воздух нагнетался при помощи ф̶е̶н̶а теплопушки п̶о̶д̶ ̶о̶д̶е̶я̶л̶о в тестовую камеру
При тестировании, горячий воздух нагнетался при помощи ф̶е̶н̶а теплопушки п̶о̶д̶ ̶о̶д̶е̶я̶л̶о в тестовую камеру

Проблемы с нагревом не исчезли ни после отказа от детекта движения, ни после того, как я добавил к малинке небольшой радиатор. Судя по всему Zero 2W не очень хорошо справляется с одновременной отправкой потокового видео и поддержкой небольшого контейнера. Пришлось задуматься об активной системе охлаждения.

Корпус и охлаждение

Изначально, я планировал использовать готовый распечатанный корпус для Zero 2W с маркетплейсов. Хотелось оставить возможность пользоваться глазком вручную, поэтому предполагалось, что сама малинка в корпусе будет крепиться к дверной панели при помощи магнитов/присосок/клейкой полосы, а камера, встроенная в некое подобие пробки из пенопласта, должна была выводиться непосредственно к глазку на гибком шлейфе. Таким образом, сам объектив можно было бы вручную вкладывать/вынимать из окуляра глазка, подобно винной пробке.

Примеры готовых корпусов
Тысячи их
Тысячи их

Из комплекта левого верхнего корпуса как раз и был позаимствован радиатор. Сам корпус неплох, но вентилятор на него без клея не закрепить + крепление самого корпуса к чему либо, в штатном виде, возможно только на клей. Насверлить новых отверстий негде, как вариант - заменить штатные шпильки которыми стянуты панели на более длинные, к удлиненным концам монтировать крепеж. Но проблема с креплением вентилятора остается


Частично из-за того, что мне не удалось с ходу найти годный корпус, частично, из-за того, что я хотел минимизировать использование готовых деталей, я решил мастерить корпус самостоятельно.

За основу корпуса была взята 40мм канализационная муфта, для арматуры использовалась алюминиевая полоса 2x30мм. Из алюминиевой полосы, на коленке была изготовлена скоба для крепления камеры. Из этой же полосы, на другой коленке была изготовлена станина для платы, ее предназначение - центрировать положение платы внутри трубы + защищать плату от изгибания при затягивании крепежа. Эстетические качества итогового изделия, скажем так... Сомнительные, однако свои задачи оно выполняет. Производить слесарные работы без тисков в домашних условиях весело и задорно.

Как упоминалось ранее, конкретно эта плата поставлялась без площадки с пинами, она была дополнительно заказана и припаяна к плате. В качестве кулера к 5v разъему малинки был подключен (а впоследствии - припаян) маленький вентилятор. В результате получилась такая гирлянда:

В дальнейшем, кулер закрепится в труб... Гхм.. В корпусе, при помощи резиновых распорок
В дальнейшем, кулер закрепится в труб... Гхм.. В корпусе, при помощи резиновых распорок

В результате, после сборки в корпусе, получилось это:

Behold! Шедевр оптико-сантехнического искуства
Behold! Шедевр оптико-сантехнического искуства

Тестирование и итоги

Учитывая небольшую цену комплектующих, с самого начала были сомнения, касательно качества передаваемого изображения. Первые отснятые снимки подтве��дили эти сомнения. Из-за особенностей NoIR камеры, при высоком уровне освещенности, картинка приобретает стойкий фиолетовый отенок, настройки контраста и цветового баланса немного исправили ситуацию, но в ярко освещенном помещении картинка выглядит так:

Слева - фото сделанное камерой Google Pixel 9, справа - нашей ноунейм rpi камерой
Слева - фото сделанное камерой Google Pixel 9, справа - нашей ноунейм rpi камерой

В рабочей среде результат значительно лучше, в тусклом освещении фиолетовый оттенок пропадает:

Небольшое смещение центровки связано с отсутствием направляющих на объективе...
Небольшое смещение центровки связано с отсутствием направляющих на объективе...

На мой взгляд, степень шакализации картинки - приемлемая для видеоглазка, при необходимости можно заменить китайскую камеру за 600 рублей на любую другую, благо на рынке изобилие rpi камер под разные запросы, но у меня такая необходимость врятли возникнет, т.к. лица людей, находящихся непосредственно перед дверью отлично различимы, а ничто другое нас не интересует.

Другая проблема связана с работой при отсутствии освещения, собственно, ничего не видно:

Напрашивается скример
Напрашивается скример

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

С автономностью тоже все не однозначно (в данной реализации - однозначно никак) в компактных фабричных вариантах питание реализовано консервативно - при помощи 5м кабеля. Я пошел этим же путем. Судя по информации с форумов, добавление внешнего акумулятора, даже на 10ма/ч, даст автономность в пределах 6-ти часов, даже если автономная работа будет обеспечиваться в пределах 12, 24, 48-ми часов, этого все-равно будет мало для задач устройства (быть онлайн 24/7), взамен мы получим дополнительную пожароопасную точку отказа в виде постоянно запитанного от сети акумулятора. Поможет автоматическое реле, переключающее питание на акумулятор, но в эту сторону я пока не копал.

Итого получили:

  • Вывод видео куда угодно, где есть браузер - есть

  • Мониторинг состояний - есть

  • Портативность - есть

  • Кастомизируемость - есть

  • Стоимость <= 3000 рублей, с учетом малинки, камеры, и всех остальных элементов

Перспективы:

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

  • В процессе пришлось отказаться от детекта движений всвязи с ограниченной производительностью Zero 2w. Вероятно, помимо вывода нпрямую, можно было бы транслировать видеопоток на сторонний сервер с производительностью чуть выше картошки, где изображение будет анализироваться на предмет движения. Навязать на все это tg алармы, возможно, LLM штучки с журналированием...

В общем, получилось как-то так =)

P.S. За форматирование прошу простить - первый пост на хабре.

Бонус для трипофобов
Бррр
Бррр

Эксперименты с перфорированием для отвода теплого воздуха пошли не по плану. Благо и без этих червоточин плата охлаждается превосходно