Поворотная вебкамера на arduino

Поворотная вебкамера на Arduino

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

Недавно я озадачился вопросом, как еще можно применить Arduino кроме мигания светодиодов.
Эта идея пришла ко мне во время утренней беседы с коллегами по Skype, и я решил сделать так, чтобы они при помощи веб камеры могли смотреть, что происходит в нашем офисе. В один дождливый воскресный день я склонил к этому своего приятеля, и мы построили Arducam.

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

Каркас из конструктора

Мы использовали старый конструктор, который я купил в комиссионном магазине для построения каркаса. Мы построили каркас и закрепили его на основе.

Соединение с валом сервопривода

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

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

Монтаж веб-камеры

Веб-камера
Я использовал веб-камеру фирмы Logitech.
Вероятно, полезно будет удалить с неё противовес, чтобы сделать её легче, но это не моя веб камера, а из офиса, поэтому я не стал этого делать.

Распределение веса
Я добавил 2 толстых прокладки, чтобы избежать давления вала на камеру. Они смещают вес камеры на весь каркас с вала сервопривода.

Монтаж веб-камеры
Крепежный элемент веб-камеры состоит из круга с отверстием, совпадающим с валом по центру. Это позволяет обеспечить тягу между валом и кругом.
Некоторое пространство создается за счет прокладки, которая предотвращает нажатие на вал.

Проблемы:
— Камера не закреплена в каркасе, и она будет падать, если её максимально наклонить.
— Отверстия в конструкторе над сервоприводом большие, и позволяют сервоприводу делать значительные горизонтальные движения из-за нагрузки.
— Вращающий момент камеры вызывает чрезмерное вращение, что в свою очередь, деформирует сервопривод. Я хочу попробовать исправить это путём вращения камеры на 1 градус назад после периода непрерывного движения, но я предпочитаю механические решения. Возможно это можно исправить путем добавления передачи и установки веб камеры на отдельный вал с ременным приводом?
— . Или использовать более мощный сервопривод.

Электроника

Подключение сервоприводов и светодиодов
Сервопривод имеет 3 провода:
— GND
— +5V
— Сигнал
Я использовал 9 контакт для управления сервоприводом.
Светодиод подключен к +5В и GND с резистором на линии +5В и будет светиться при подаче питания.

Подключение джойстика
У меня был старый сломанный моим сыном джойстик от PS3.
Мне помогли статьи от Finnio и jhoffnun, чтобы понять как работает джойстик и его электроника.

Управление сервоприводом

Arduino
Программу для Arduino как и все файлы проекта можно скачать ниже или взять на github.
Программа позволяет управлять веб камерой при помощи USB и джойстика.
Можно использовать модем-контроль / эмулятор терминала приложений, таких как Minicom или Putty для связи с USB-порт.

Установка по центру:
— Программа будет устанавливать сервопривод на 90 градусов при запуске.
— И при нажатии «m»

Поворот влево и право
— Когда джойстик перемещается в горизонтальной плоскости.
— Влево при нажатии ‘F’
— Вправо при нажатии «J»

Node.js
Кроме того, мы реализовали веб-сервер в node.js чтобы облегчить контроль над arducam.
Инструкцию можно найти на сайте gihub проекта.

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

Поворотная веб-камера на Arduino

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

Материалы, которые использовались автором для создания данного устройства:
1) металлический конструктор
2) холодная сварка
3) веб-камера
4) сервопривод
5) светодиоды
6) Arduino
8) джойстик от PS3

Рассмотрим более подробно конструкцию и основные моменты создания устройства для управления камерой.

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

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

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

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

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

Камера закреплена на специальной круглой платформе, которая базируется на вале идущем от сервопривода. Таким образом посредством крестовой передачи реализуется управление камерой.

После того, как механическая часть конструкции была готова, автор занялся ее электронной начинкой.

Для начала он решил подключить сервоприводы и светодиоды, которые будут показывать состояние системы.

Сам сервопривод имеет 3 провода: -GND,+5V и Сигнал. Автор использовал 9 контакт чтобы реализовать возможность управления приводом. Для того, чтобы сделать индикатор включения привода, автор установил диод, который подключен к двум проводам: +5В и GND с резистором на линии +5В.

Затем автор подобрал программу для Arduino, благодаря которой появляется возможность использовать джойстик и USB порт, чтобы управлять сервоприводом. Для связи с USB-портом автор использовал модем-контроль и эмулятор терминала приложений такие как Minicom или Putty.

В данной программе предусмотрены несколько функций для управления камерой.

Для того, чтобы установить камеру по центру на 90 градусов необходимо нажать «m», так же камера будет автоматически приходить в это положение при включении питания сервопривода. Для того, чтобы повернуть камеру влево необходимо нажать на клавишу «F», а через нажатие кнопки «J» осуществляется поворот камеры вправо.

Программу вы можете скачать в конце статьи.

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

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

TTL-модуль видеокамеры для Ардуино со стандартом NTSC

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

Такой обширный функционал достигается благодаря множеству модулей различного предназначения, одним из которых является Ардуино камера. Она пригодится как для написания умных нейросетей, так и для простого отслеживания того, что происходит у вас в квартире, когда вы не дома. Давайте разберёмся, какие характеристики есть у таких датчиков и как их лучше всего реализовать в жизнеспособных системах.

Основным производителем таких камер сейчас является компания — adafruit.com.

Пример модуля камеры: OV7670 300KP VGA Camera Module

Характеристики TTL камеры

Сам TTL модуль работает на стандарте NTSC протокола, который известен всему миру благодаря возможности безналичной оплаты в смартфонах. Андроид, в отличие от продукции купертиновцев, давно научился применять эту технологию для беспроводного управления любой техникой.

TTL Serial JPEG камера с NTSC видео от Adafruit

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

Но не только в защитных целях годится Аrduino камера, её можно применять и для создания собственных фотоаппаратов и вебок, если вы захотите. А благодаря встроенным возможностям по настройке диафрагмы и насыщенности цветов можно получить такие кадры, которые не каждая зеркалка или мыльница с хорошим объективом способны выдать.

Читайте также  Выбор кабеля для проводки в квартире

И, наконец, авто-контраст и авто-яркость прекрасно подходят для отслеживания движений даже в тёмных помещениях, что позволяет устанавливать их вместо соответствующих датчиков. Но, конечно, без соответствующего софта это просто груда железа. Благо, найти подходящие библиотеки, благодаря доступности Ардуино, не так и сложно, достаточно просмотреть пару тематически англоязычных форумов.

Но не заблуждайтесь, такие модули не предназначены для профессиональной фотографии, ведь их максимальное разрешение не выходит за пределы 630 на 480, предоставляемых даже самой дешёвой веб-камерой. Пример того как выглядит итоговое изображение:

При этом, у неё есть куда более значимые достоинства, перекрывающие все недостатки, например:

  1. Камеры чувствительны к ИК излучению, что не только даёт обнаружить любые изменения в цветопередаче, но и позволяет отслеживать движения в полной темноте. Учитывайте, что каждый модуль индивидуален, и подбирать его стоит по вашим требованиям, в данном случае мы рассмотрим именно систему видеонаблюдения.
  2. Размеры в 32 мм квадратных при фотоматрице CMOS в четверть дюйма.
  3. Соответственно разрешению, и мегапикселей немного – всего 0.3.
  4. А вот формат выходных данных зависит от камеры; если вам нужен простой модуль для видеонаблюдения, то подойдёт и стандарт M-JPEG, который будет выдавать не более 30 кадров в секунду.
  5. Все параметры, будь то баланс белого или экспозиция, автоматически подстраиваются в зависимости от программы.
  6. Максимальное усиление – 16 Дб, а вот динамический диапазон – все 60 Дб.
  7. Угол обзора небольшой – всего 60 градусов, учитывайте это, когда будете выбирать место для установки. Но его можно значительно расширить, прикупив специальные фишай линзы.
  8. Фокусное расстояние – от 10 до 15 метров.
  9. Битрейт установлен изначально 38400, менять его вроде бы и можно, с помощью АТ+ команд, но на деле это не работает или же попросту бесполезно.
  10. Потребляют такие модули в среднем 75 мА, учитывайте это, если собираетесь сделать автономную камеру видеонаблюдения.
  11. Работает в функциональном напряжении 5В, а подключается по 3.3 В TTL через три проводника.

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

Подключение и настройка

Зачастую камера для Ардуино приходит без коннекторов, поэтому вам необходимы специальные проводники, которые придётся подпаивать к пинам отдельно. Благо контакты расположены приблизительно в 2-х мм друг от друга, что упрощает подключение видео с Аrduino к МК.

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

Если же вам не нужна видеосъемка, по какой-то причине, то достаточно и 4-х проводов. Естественно, лучше подобрать разные цвета, для удобного кабель-менеджмента, когда вы будете упаковывать поделку в заготовленный корпус. В нашем случае расклад таков:

  1. Для 5В пина подключаем красный проводник.
  2. На заземление отправляем черный.
  3. Белый идёт на пин для получения данных.
  4. Зеленый – на TX, предназначенный для передачи картинки.

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

Соединение деталей, схема

Теперь соединим всё вместе. Эта схема предоставлена самим производителем таких камер — Adafruit:

Программирование

Так как мы говорим о простейшей реализации, то предполагаем, что у вас нет навыков работы с С++, а соответственно, сгодится любая библиотека из общественного источника.

Но если малейший опыт работы с МК имеется, то постарайтесь выбрать код, который не будет работать через раз и по необъяснимой магии. Это значительно сэкономит вам нервы, ведь в сообществе, тем более русскоязычном, есть множество «недоинженеров», пишущих функции без каких-либо знаний базовых алгоритмов и основ программирования.

Для камеры нужно использовать приложение Windows Comm Tool. Нужно использовать серийный протокол. Сами производители рекомендуют переходник для FTDI или USB/TTL конвертер. Для Arduino можно брать серийный чип (FTDI) и загрузить скетч в мк:

Для плат типа Leonardo нужно брать этот код:

Теперь нужно скачать и настроить библиотеку от производителя:

Обнаружение движения

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

Когда телефон удаляется настолько, что NTSC перестаёт работать, информация и СМС будут передаваться по беспроводному интернету и наоборот.

Связка: камера, Ардуино и Андроид

Как уже упоминалось, всю систему можно привязать к вашему смартфону, и это решение имеет множество достоинств. Сделать это удастся с помощью специального приложения, но новичкам лучше не использовать NTSC, доступный в модуле, ведь с ним будет много мороки.

Лучшим выбором, для проверки работоспособности проекта в принципе, будет блютуз модуль и соответствующее приложение на Андроид, позволяющее работать с ним. А уже затем можно начинать эксперименты с усложнением системы.

Использование видеокамеры с Arduino

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

  1. Видеонаблюдение за квартирой.
  2. Автоматизированные фермы и теплицы, в которых есть микроклимат, и, дабы его не нарушать, наблюдение стоит вести удалённо.
  3. Замена датчику движения, при соответствующем софте.

Подключение камеры OV7670 к Arduino Uno

Видеокамеры (камеры) в настоящее время находят широкое применение в электронной промышленности и имеют множество применений, таких как система мониторинга посетителей, система наблюдения, система учета посещаемости и т.д. Камеры, которые мы используем сегодня, умны и имеют множество функций, которых не было в предыдущих моделях камер. Современные цифровые камеры не только захватывают изображения, но также захватывают и высокоуровневые описания изображений и анализируют то, что они видят. Они широко используются в робототехнике, искусственном интеллекте, машинном обучении и т. д. Захваченные кадры обрабатываются с помощью искусственного интеллекта и машинного обучения, а затем используются во многих приложениях, таких как обнаружение номерных знаков, обнаружение объектов, обнаружение движения, распознавание лиц и т. д.

В этой статье мы рассмотрим подключение наиболее часто используемого сейчас модуля камеры OV7670 к плате Arduino Uno. Аналогичным образом ее можно подключить и к плате Arduino Mega. Модуль камеры достаточно тяжел в подключении поскольку он имеет большое количество контактов. Также при использовании камеры достаточно важен выбор проводов, которыми вы ее подключаете, поскольку качество проводов может значительно влиять на качество картинки и уровень зашумленности видеоизображения.

Камера OV7670 работает от напряжения 3.3V, поэтому следует избегать прямого ее подключения к обычным контактам ввода/вывода Arduino, которые работают с напряжением 5V. OV7670 является камерой с буфером FIFO (first in, first out – первым пришел, первым вышел). Но в этом проекте мы будем захватывать изображения без использования данного буфера. Мы постарались максимально упростить данный проект чтобы его можно было повторить даже начинающим радиолюбителям.

Необходимые компоненты

Аппаратное обеспечение

  1. Плата Arduino Uno (купить на AliExpress).
  2. Модуль камеры (Camera Module) OV7670 (купить на AliExpress).
  3. Резистор 10 кОм – 2 шт. (купить на AliExpress).
  4. Резистор 4,7 кОм – 2 шт. (купить на AliExpress).
  5. Соединительные провода.

Программное обеспечение

Arduino IDE
Serial Port Reader (для анализа выходного изображения)

Некоторые особенности модуля камеры OV7670

OV7670 представляет собой модуль камеры с буфером типа FIFO. В настоящее время он производится несколькими фирмами и доступен с различной распиновкой. OV7670 обеспечивает полномасштабное (full frame) 8 битовое изображение в окне. OV7670 умеет работать с различными форматами видео изображения. В VGA разрешении камера обеспечивает до 30 кадров в секунду.

Модуль камеры OV7670 включает:

  • массив датчиков изображений (разрешения примерно 656 x 488 пикселов);
  • тактовый генератор;
  • процессор обработки сигналов;
  • аналого-цифровые преобразователи;
  • генератор тестовых шаблонов;
  • цифровой сигнальный процессор;
  • устройство для масштабирования изображений;
  • цифровой видео порт;
  • светодиод и выход управления стробоскопической вспышкой.

Датчик изображения камеры OV7670 управляется с помощью шины SCCB (Serial Camera Control Bus — последовательная шина управления камерой) по протоколу I2C (контакты SIOC, SIOD) с максимальной частотой синхронизации 400 кГц.

Внешний вид модуля камеры OV7670 показан на следующих рисунках.

OV7670 модуль VGA камеры

Модуль камеры OV7670 (со снятой линзой)

Модуль камеры OV7670 (нижняя сторона платы)

Камера использует следующие квитирующие (подтверждающие) сигналы:

  • VSYNC : Vertical Sync Output (выход вертикальной синхронизации (для строк) – низкий уровень во время кадра;
  • HREF : Horizontal Reference (горизонтальная синхронизация (для колонок) – высокий уровень во время активных пикселов ряда (строки);
  • PCLK : Pixel Clock Output (пиксельная синхронизация (тактовый сигнал передачи байта из параллельного порта D0–D7) – независимый генератор синхронизирующих импульсов. Данные правильны на нарастающем фронте.

В дополнение к этому камера оперирует еще следующими сигналами:

  • D0-D7 : параллельный цифровой 8-битный видеовыход в формате YUV/RGB;
  • PWDN : Power Down Mode Selection — включение (лог. 0) и выключение (лог. 1) камеры;
  • XCLK : внешнее тактирование (синхронизация);
  • Reset : сигнал сброса.

Камера OV7670 синхронизируется с помощью генератора на 24 МГц. Это обеспечивает выход пиксельной синхронизации (PCLK) 24 МГц. Буфер типа FIFO имеет память на 3 Мбит. Генератор тестовых шаблонов формирует шаблон цветовых полос – с 8 полосами, с постепенным уменьшением к серому цвету (fade-to-gray).

Читайте также  Замена проводки в квартире своими руками

Схема проекта

Схема подключения модуля камеры OV7670 к плате Arduino Uno представлена на следующем рисунке.

Внешний вид получившейся у нас конструкции проекта показан на следующем рисунке.

Объяснение программы для Arduino

Полный текст программы приведен в конце в статьи, здесь же мы рассмотрим его наиболее важные фрагменты.

Для работы с камерой OV7670 нам понадобится встроенная в Arduino IDE библиотека. Никаких внешних библиотек, которые необходимо скачивать, мы в этом проекте использовать не будем, только встроенные библиотеки.

После подключения в программе необходимых библиотек нам необходимо сконфигурировать регистры для работы с камерой OV7670.

Функция Setup() в нашем проекте будет включать все необходимые установки, необходимые для захвата изображений. Первой функцией, которую мы применим, будет arduinoUnoInut() – она используется для инициализации платы Arduino Uno. Она отключает все глобальные прерывания и устанавливает настройки для интерфейсов связи, такие как синхронизацию для ШИМ (широтно-импульсная модуляция), выбор контактов прерывания, настройки предделителя, добавление бита четности и стоповых битов.

Сверхдешёвая камера с управлением — своими руками


В качестве преамбулы скажу, что поскольку, подобная статья уже была, я по-началу и не собирался писать о камере на хабр.
Камера была сделана, просто ради интереса, тренировки навыков и отработки технологии удалённого управления физическими объектами.
Немного позже использовал эту систему как наглядный пример, сопровождающий обзор, на другом ресурсе (а фактически, в качестве чита что-бы подтянуть голоса). Это был настоящий бета-тест, который выявил кучу недоработок. За это огромное спасибо всем неравнодушным, помогавшим кто советом, а кто и куском кода.

При этом, посетители, которые игрались с камерой, помимо того, что не проходило и часу чтобы не помянули хабр, так ещё и начали активно интересоваться устройством всего этого дела, техническими деталями, программной реализацией и конечно же стоимостью.

Вот это всё и сподвигло меня на статью. А чтобы не повторюшничать, я и решил заостриться на стоимости, т.к. у автора предыдущего топика на эту тему, насколько я помню, итоговая стоимость вылилась во что-то в районе 5000р.

О том какова стоимость моей поделки: читаем ниже.

Итак, «как корабль назовешь, так он и поплывет», раз написал заголовок про дешевизну — буду соответствовать прозой, так что, детали — потом, а сперва о стоимости.

Пройдём по ценам*

* все цены даны со скидками. О скидках — отдельно, пожже.

Необходимый набор:

  • Arduino Uno (или nano) — 15.29$
  • Сервопривод (рулевая машинка) SG90 2х2.37$ = 4.74$
  • Вебкамера 3.01$

Итого: 23.04$ (примерно 750р, на данный момент)

Дополнительный набор (ленивости + плюшки):

  • Экран от Nokia 5110 — 250р (в комплекте с самой Нокией и блоком питания, куплено пару лет назад, будем считать, что именно для этой цели, реально можно найти уже вдвое дешевле, или вообще на халяву)
  • MegaShield v4 к Arduino — 5.86$
  • Проводки-коннекторы — 2.86$ (40 штук за эту цену, реально использовано 7)
  • Сверхяркий сверхсиний сверхтодиод для подсветки экрана — 5р/шт (лучше 4шт., у меня сделано неправильно)

Итого: примерно 550р

Всего: 1300р

О реализации

Всё делалось с нуля. Повторять то, что уже было — я не стал, во-первых из соображений тренировки, а во-вторых Ethernet-модуля у меня на тот момент не было, я решил что это всё слишком сложно (там был завязан MySQL) и это решение мне однозначно не подойдёт.

О задачах
Задачи я себе обозначил следующие:

  • Видеть картинку/видео
  • Иметь возможность управлять камерой
  • Иметь возможность управлять размером и качеством видео или картинки, причём не «уже на стороне клиента», а «ещё на стороне сервера, по команде клиента». Такая необходимость возникла из-за того что мне не везде доступен «большой и широкий интырнет»
  • Обеспечивать приемлемую «реалтаймовость»
  • Иметь задел на будущее — управление нагрузкой 220В и т.д. Собственно ради этого всё и затевалось, т.к. готовые решения либо жутко дороги, либо такой возможности не предоставляют.

О проблемах
В ходе реализации возникли вопросы вот такого плана:

  • Видео либо грузит процессор в случает показа на несколько пользователей, либо даёт задержку 5-10, т.е. не обеспечивает «реалтаймовость», из-за чего нельзя сразу определить адекватность и вообще работоспособность управления
  • Использование сервиса трансляций, хотя и сильно разгружает сервер в случае большого онлайна, не обеспечивает необходимую надёжность, и, опять же, даёт задержку
  • Специальный сервер для трансляции видеопотока требует определённых навыков, которых у меня пока что нет
  • Использование отображения путём смены картинок не обеспечивает высокий fps, а также постоянно обращается к жёсткому диску, что, при большом количестве пользователей, может вызывать лаги картинки не из-за загрузки процессора, а именно из-за обращения к диску

О решениях

  • Решено использовать в качестве отображения — картинки
  • Для исключения жёсткого диска из процесса выдачи картинок установлен RamDisk, на который дважды в секунду «ложится» изображение с вебкамеры
  • Для выдачи картинки решено использовать php и gdlib
  • Обновление картинки инициируется клиентом посредством javascript и ajax, и происходит без обновления самой странички

Довольно лирики!

Как выглядит

Выглядит всё более чем скромно

Работает примерно так:

Ардуина, если кто не видел

Мегашилд с проводками

«Сэндвич» в профиль

«Сэндвич» анфас

LCDшка

Она же вид сзади (пины и кондёр)

В сборе

В сборе 2

Колхоз — система проводков и верёвочек (крепление камеры)



Куда же без него

Как устроено аппаратно

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

Как работает программно

На стороне клиента чистый веб-интерфейс, без всяких плагинов и примочек. Только html, css, и javascript (+ajax).

На стороне сервера

  • Сам сервер — Apache
  • Обработчик скриптов — php
  • Приём картинок с камеры — любая самая простая доступная, бесплатная или самопальная программа для сохранения картинок с вебкамеры
  • Хранение картинки — RamDisk, утилита для создания дискового раздела в оперативной памяти (русскоязычная версия RAMDisk «Enterprise» бесплатна для локализованных систем)
  • Чтобы не прописывать в php прямых локальных путей, папка с картинкой смонтирована в www папку с помощью juction (бесплатная утилита Марка Руссиновича)
  • Передача управления из интернета к Arduino реализована с помощью программы-прокси, следующим образом: php скрипт создаёт UDP сокет и отправляет датаграмму на определённый порт, далее программа-прокси слушает этот этот порт и принимает приходящие на него сообщения и отправляет их на COM-порт Arduino (можно даже без обработки). Выбор UDP вызван исключительно для упрощения системы, UDP не требует никаких подтверждений и проверок о доставке-отправке ни со стороны клиента, ни со стороны сервера.

На стороне Arduino

  • Сама (почему «сама»? потому что «плата») Arduino
  • Скетч внутри неё — стандартные примеры из штатного набора arduino-0022 servo и serial + найденная на просторах интернета библиотека для дисплея, доработанная до приемлемого вида (в плане кириллицы и латиницы одновременно)
  • На данный момент плюсом стоит мегашилд, чисто из-за удобства и культурного вида — в этом варианте я не спаял ни одного проводка (за исключением платы к дисплею)

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

Будьте внимательны к мелочам

Хочу отметить проблемы с программной частью которые случались из-за собственной невнимательности/неосведомлённости/ненаблюдательности:

  • Первое с чем я серьёзно мучался: Arduino принимает из отправленной на её виртуальный COM-порт строки отдельно первый байт и отдельно всё остальное. Какие изощрения я только не пробовал — и с массивами и с кучей проверок… Хоть ты убейся. Решение проблемы? Пришло неожиданно и внезапно, в моментк огда я об этом и не думал: Sleep 2 после чтения каждого байта. ВСЁ!
  • Вторая проблема — серьёзная нагрузка на сервер, казалось бы, из ничего, возникла потому, что обновление картинки было сделано по таймеру, не дожидаясь собственно факта загрузки картинки (или ошибки загрузки). Таком образом отсылалась куча «лишних» запросов.
  • Третье: FireFox оказался самым правильным и капризным браузером, и заставил меня учиться писать валидный код. Так например, событие OnClick по элементу Option работать не должно. А оно работет, везде кроме огнелиса.
  • Четвёртая, совершенно не явная и редко всплывающая: периодически картинка «ломалась». Как выяснилось, это происходило в момент когда файл был занят при записи. Т.е. проверка file_exists() проходила, а файл оставался залоченным. Не помогла и проверка is_writable(). Пришлось организовывать цикл по наличию ошибки и внутри него отрабатывать чтение файла «до победного конца».

Оставшиеся недоработки

Есть и такие.

  • Во-первых, это описанные в каментах «левые» символы иногда появляющиеся в конце сообщения на экране. На самом деле это команды управления. Уши этого бага растут из того что если активно спамить или жать кнопки, буфер ком-порта не успевает полностью прочитаться Ардуиной и последующие сообщения валятся в конец буфера. Решение есть, но пока не сделано.
  • Во-вторых, это периодическое падение UDP-сокета в программе прокси при большом онлайне. В чём причина — не знаю. Проявляется не сразу. Умирает и не «откисает». Помогает закрытие сокета и бинд по-новой. Возможно, виноват кривой видовский winsock.ocx. Переписывать это дело на API в бейсике, как-то лень. Пока одним из «топорных» решений вижу сброс и ребинд сокета по таймеру, каждые, скажем, полчаса.
Читайте также  Правила проводки электричества в частном доме

О скидках

Общеизвестно, что в Китае — дешевле. Главное знать места, где именно дешевле, и как добыть дополнительную скидку.
Тут смысла писать нет — слишком большой объём текста с картинками, к тому же известный большинству.
Поэтому дабы не провоцировать ярых противников борьбы со спамом и прочим «реферальством», отмечу необходимый минимум — это скидка 15% на BiC, складывающаяся из одноразового купона на 10% и скидки за первую покупку 5% при вводе рекомендателя + хинт, как использовать эту систему неоднократно.
Все заинтересовавшиеся, могут ознакомиться с полной информацией по ссылке на страничке с, собственно, самой камерой.

Ссылки

Камера, работающий экземпляр, для тех кто ещё не видел и не наигрался
Топик, в котором ссылку на камеру слили на хабр раньше времени
RAMDisk
juction
Исходники (упрощённые, во избежание) клиентской части, серверной (php) и программы web-arduino-прокси (VB 6.0)

Apache, php, либо какие-то комбинированые сборки и т.д. — на свой вкус.

OpenMV — «Ардуино» для машинного зрения

  • Цена: 40.09$ + доставка
  • Перейти в магазин

Какой ардуинщик не хотел подключить камеру к ардуино и получать изображение также легко и просто, как мигать светодиодом? Вот и я из тех, кто хотел, но увы все нет так просто. Однако не ардуино единым ограничивается DIY и есть множество куда более мощных микроконтроллеров способных справиться с этой задачей. В очередной раз изучая новинки с сфере DIY, я наткнулся на интересный проект — OpenMV. Вот официальная страница проекта — openmv.io.
OpenMV Cam это небольшая плата с низким энергопотреблением, содержащая видеокамеру и микроконтроллер, предназначенная для бюджетной реализации машинного зрения. OpenMV работает под управлением MicroPython, который позволяет программировать OpenMV с использованием Python (точнее, Python 3). Это облегчает работу за счет применения языка высокого уровня с большим количеством уже готовых библиотек компьютерного зрения. Также с помощью Python можно управлять портами ввода-вывода OpenMV.

Характеристики OpenMV
Процессор STM32F765VI ARM Cortex M7 с рабочей частотой 216 МГц;
512 Кбайт оперативной памяти;
2 МБ флеш-памяти;
Все порты ввода/вывода с напряжением логического уровня 3,3В толерантны к 5В;

Процессор имеет следующие интерфейсы ввода/вывода:
Интерфейс USB с полной скоростью (12 Мбит) для подключения к компьютеру. При подключении OpenMV отображается в системе как виртуальный COM-порт и USB-накопитель.
Разъем μSD Card, обеспечивающий скорость чтения/записи в 100 Мбит/с, что дает возможность OpenMV записывать видео и легко переносить объекты машинного зрения с карты μSD.
Шина SPI, которая может работать на скорости до 54 Мбит, позволяя передавать изображение на LCD, по WiFi на другой микроконтроллер или передавать композитное видео по радиоканалу 5,8 ГГц.
Шина I2C, шина CAN и асинхронная последовательная шина (TX / RX) для взаимодействия с другими микроконтроллерами и датчиками.
12-разрядный АЦП и 12-разрядный ЦАП.
Три порта вывода ввода/вывода для управления серводвигателями.
Прерывания и ШИМ доступны на всех портах ввода/вывода (на плате имеется 10 контактов ввода/вывода).
RGB LED и два мощных ИК-светодиода с длиной волны излучения 850 нм.
Матрица OV7725 способна выдавать 8-битные изображения в оттенках серого разрешением 640×480 или 16-битные изображения RGB565 разрешением 640×480, FPS при разрешении выше 320×240 составляет 60 кадров в секунду и 120 кадров в секунду, при разрешении ниже 320×240. Большинство простых алгоритмов будут работать с частотой выше 30 FPS.
Камера OpenMV поставляется с 2.8-миллиметровым объективом на стандартном креплении M12. Можно использовать более специализированные объективы.

Возможности OpenMV:
Разделение кадров для обнаружения движение в сцене.
Отслеживание цвета — до 16 цветов за один раз в изображении.
Отслеживание маркеров — обнаружение групп цветов вместо независимых цветов.
Обнаружение лиц с помощью Haar Cascades.
Трекинг глаз.
Оптический поток.
Обнаружение/декодирование QR-кодов.
Декодирование линейных штрих-кодов.
Отслеживание AprilTag.
Обнаружение линий, кругов, прямоугольников.
Обнаружение шаблонов изображений.
Захват изображения — разрешение до 640×480 в оттенках серого/RGB565 формат изображений — BMP/JPG/PPM/PGM.
Запись видео — разрешение до 640×480 в оттенках серого/RGB565, формат видео — MJPEG или GIF (или RAW-видео).
OpenMV поддерживает предварительно обученные нейронные сети, позволяющие реализовать распознавание лиц, текста и пр.

На официальном сайте OpenMV продается по цене 65$, на Aliexpress много предложений по цене от 60$ и выше, нет никакой уверенности, что это оригинальные платы.
Интересное предложение по цене около 40$ удалось найти на Banggood, после этого уже не было никакой возможности внутренней жабе противостоять желанию попробовать OpenMV в деле. Также пришлось смириться с тем, что цена в 40$ является акционной и никакие другие скидки не действуют.
OpenMV поставляется в простом антистатическом пакете. В комплекте сама камера OpemMV, шилд для прототипирования с набором гребенок с возможностью сквозного подключения, а также добротный USB-MicroUSB кабель.

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

Версия платы M7 от 15.10.2016г. Размер OpenMV — 36×45 мм.

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

При первом подключении платы к OpenMV IDE, она предлагает обновить встроенную прошивку до актуальной версии, занимает процесс обновления не более пары минут.
Одним из не очень приятных моментов является то, что OpenMV IDE просит зарегистрировать вашу плату OpenMV, регистрация естественно не бесплатная. Сообщение о необходимости регистрации появляется трижды при каждом подключении платы, после их закрытия функциональность никак не ограничивается.
OpenMV IDE содержит множество примеров. Детектирование линий, кругов, лиц работает удовлетворительно.
Пример отслеживания глаз почему-то не заработал. Я впервые столкнулся с языком Python и для меня не стало проблемой разобраться в примерах и редактировать их на свое усмотрение.

Пример сохраненного изображения с камеры (в оригинальном разрешении).

Примеры обнаружения линий и кругов (в оригинальном разрешении)


Неожиданным моментом стало сильное искажение цветов в режиме изображения RGB565, и высокая чувствительность камеры к ИК-излучению. Я предположил, что на камере не установлен ИК-фильтр, хотя на странице товара об этом ничего не сказано и другие обзоры данного товара этого не подтверждают. С одной стороны это даже является плюсом, так как благодаря наличию на плате ИК-светодиодов есть возможность использования OpenMV в темноте, с другой стороны минус, так как примеры по отслеживанию цвета естественно не работают. Я также задумался дополнительно приобрести или вытащить откуда-нибудь объектив с ИК-фильтром.

Пример детектирования лица работает с разрешением 240*160 и FPS порядка 22, при этом следует учесть, что параллельно выводится буфер кадра и это замедляет обработку. При блокировке буфера кадра, FPS возрастает более чем в 2 раза, это справедливо для всех алгоритмов.

OpenMV поддерживает широкий набор периферии: дисплей, wi-fi модуль, ИК-матрицы, AV-шилд, сервоприводы и прочее. Однако цены на дополнительные модули на официальном сайте на мой взгляд весьма не гуманны, а на других площадках ничего найти не удалось.
Так Wi-Fi-шилд основан на ATWINC1500 и стоит 30$ на официальном сайте, поэтому возникает закономерное желание использовать более дешевые ESP8266 и ESP32. На Aliexpress в продаже есть wi-fi шилд на базе ESP8266, но по цене он не уступает оригинальному, схему же и прошивку продавец не дает. Я планирую купить отдельно ATWINC1500, благо он есть в продаже по цене около 12$ и сделать Wi-Fi-шилд самостоятельно.
Официальный LCD-шилд основан ан 1,8 TFT с разрешением 160*128 на базе контроллера ST7785, у меня есть в наличии есть лишь дисплей 2,2″ 320*240 на контроллере ILI9343, поддержка которого реализована пользователями OpenMV. К сожалению заставить работать данный дисплей с OpenMV мне не удалось.
У меня в наличии имеется ИК-матрица AMG8833 с разрешением 8*8, поддержка которой заявлена в OpenMV. На прото-шилде был собрана простая подключения AMG8833 к OpenMV по шине I2C. К сожалению, при сборке схемы я не учел необходимость соосного расположения камеры и ИК-матрицы.


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

Я еще только изучаю возможности OpenMV и языка Python, в планах разработка собственных плат расширения. Я хочу реализовать на OpenMV следующие проекты:
1. Самонаводящаяся водяная/лазерная пушка.
2. Счетчик машин (с измерением скорости при использовании допплеровского радара).
3. GPRS-камера с использованием GPRS-модема.
4. Тепловизионная камера для удаленного наблюдения.

Резюмируя можно отметить главные достоинства OpenMV:
1. Низкий порог вхождения.
2. Обширная документация и большое количество примеров.
3. Широкий набор периферийных устройств.
4. Открытая архитектура.

Одним из главных недостатков, на мой взгляд, является высокая цена на саму OpenMV и на платы расширения, однако открытость ПО и железа в некоторой степени компенсирует этот недостаток. Также на рынке появились достойные конкуренты OpenMV — Esp32-Cam, Sipeed Maix и прочие, которые однозначно заслуживают внимания.