ИК-управление камерой с помощью Ардуино. Arduino камера


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

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

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

Вот это всё и сподвигло меня на статью. А чтобы не повторюшничать, я и решил заостриться на стоимости, т.к. у автора предыдущего топика на эту тему, насколько я помню, итоговая стоимость вылилась во что-то в районе 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% при вводе рекомендателя + хинт, как использовать эту систему неоднократно. Все заинтересовавшиеся, могут ознакомиться с полной информацией по ссылке на страничке с, собственно, самой камерой.
Ссылки
Камера, работающий экземпляр, для тех кто ещё не видел и не наигралсяТопик, в котором ссылку на камеру слили на хабр раньше времениRAMDiskjuctionИсходники (упрощённые, во избежание) клиентской части, серверной (php) и программы web-arduino-прокси (VB 6.0)

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

habr.com

ИК-управление камерой с помощью Ардуино

Особенности:

— ИК-сигнал поворачивает камеру влево и вправо.— Можно использовать для привязки камеры к какому-то объекту, или для селфи снимков.— Работает на 5V, например, Power Bank.— Может использоваться с большинством ИК-пультов для ТВ.— Дизайн и код просты насколько возможно, но с сохранением максимальной эффективности.

Что ожидать от этого видео

— Я пройду по использованным в видео компонентам, соберу проект и загружу код в Ардуино.— В конце статьи я немного расскажу о сенсорах и покажу, как править код.

Список оборудования:

  • Ардуино  (Магазин на Aliexpress, Banggood).
  • Серво мотор
  • Держатель камеры
  • 2 ИК-приемника
  • 1 трубочка
  • Термоусадка
  • Провода
  • Паяльная плата
  • Соединительные пины

Разрежьте паяльную плату, чтобы она подходила по размеру. Я использовал размер 15 х 20 отверстий.

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

 

Возьмите питьевую трубочку и отрежьте от неё 2 куска, примерно 10 мм и 30 мм.

Наденьте отрезанные куски трубочки на сенсоры, сверху наденьте термоусадку и нагрейте ее со стороны ножек ИК-ресиверов.

Разрежьте «носок» пополам вдоль и вырежьте треугольник на конце.

Подсоедините один провод к «+» ИК-ресиверов, другой провод к «—» ИК-ресиверов. Еще один провод соедините с «Out» ИК-ресиверов.

Склейте 2 носка спинами друг к другу.

Плата

Приклейте серво мотор к плате и припаяйте 3 провода в любом месте на плате.Желтый провод будет передавать сигнал, он будет соединен с пином 11.Средний провод — это «+«, он будет соединен с пином 5V.Коричневый провод — Земля, он должен быть соединен с Землей.

Плюсы ИК-приемников соединяются с пином 5V.Минусы соединяются с Землей.2 сигнальных провода соединяются с пинами A3 и A5.

Прикрепите держатель камеры к мотору.

Приклейте сенсор к держателю камеры. Убедитесь, что он приклеен под углом 90°.

Теперь загружаем код в Ардуино.

Код для Ардуино

Принцип работы сенсора

Следящий сенсор состоит из 2 ИК-приемников, отделенных друг от друга. Когда они оба получают ИК-сигнал, это означает, что они направлены на источник сигнала. Если только один из них получает ИК-сигнал, это означает, что мотору надо развернуться налево или направо так, чтобы оба ИК-приемника одновременно получали ИК-сигнал.

ИК-сигнал может быть очень сильным и / или отражаться от других объектов. Чтобы уменьшить этот эффект мы использовали черный материал и сделали фигурный вырез, так что ИК-приемники могут получать сигнал только с определенного направления.

Изменения в коде

 

Подберите переменную stepDeg чтобы увеличить или уменьшить градус поворота для каждого шага.

Переменную smoothness лучше оставить равную 10. Чем меньше значение, тем быстрее мотор поворачивает, но тем менее стабильным он становится.

diy-life.ru

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

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

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

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

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

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

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

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

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

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

Поворотная веб-камера на ArduinoПоворотная веб-камера на ArduinoПоворотная веб-камера на ArduinoЗатем автор приступил к монтажу веб-камеры. Была использована камера фирмы Logitech, которая используется в офисе компании, где работает автор. Поэтому из-за того, что камера не принадлежит автору, он не стал ее разбирать и удалять противовес, хотя это бы упростило конструкцию будущего устройства.Поворотная веб-камера на ArduinoПоворотная веб-камера на ArduinoДля того, чтобы хоть как то компенсировать вес камеры и распределить его по центру конструкции, автор использовал 2 толстых прокладки. Они позволяют сместить вес камеры с вала сервопривода на основной каркас, а так же позволяют избежать давления вала на саму камеру.Поворотная веб-камера на ArduinoКамера закреплена на специальной круглой платформе, которая базируется на вале идущем от сервопривода. Таким образом посредством крестовой передачи реализуется управление камерой.

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

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

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

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

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

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

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

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

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

Источник Становитесь автором сайта, публикуйте собственные статьи, описания самоделок с оплатой за текст. Подробнее здесь.

usamodelkina.ru