Как подключить веб камеру к ардуино

Подключаем камеру OV7670 к Arduino и выводим картинку на дисплей

Данная камера ov7670 является самым доступным модулем для получения изображения совместно с Arduino.

Модуль камеры имеет следующие характеристики:

  • различные разрешение VGA (640 х 480); — QVGA (320 х 240); — CIF (352 х 240); — QCIF (176 × 144);
  • скорость передачи до 30 fps,
  • несколько способов кодирование изображения RAW RGB, RGB 565/555, YUV/YCbCr 4:2:2

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

Подключение OV7670 к Arduino

Начнем с сборки схемы и написания программы управления. Итак для сборки и отладки тестового макета нам потребуется :

Внешний вид макета

После того как Все компоненты собраны, приступаем к сборке схемы.

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

Программа для трансляции видео с камеры на tft дисплее

Для работы с камерой и дисплеем совместно с Arduino нам понадобится, библиотеки: LiveOV7670Library и Adafruit_GFX_Library. Скачиваем их и устанавливаем в Arduino IDE. Теперь все готово для загрузки программы в Arduino.

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

После проверки работоспособности, можно перейти в скетче на вкладу setup.h

и изменив значение EXAMPLE 1 на EXAMPLE 3, камера будет транслировать изображение напрямую на экран монитора, при условии, что arduino подключена к компьютеру и запущена программа Arduino IDE.

При значение EXAMPLE 1 камера совместно с библиотекой LiveOV7670Library, передает картинку напрямую на дисплей подключенный по SPI интерфейсу.

Заключение

Данный пример работы камеры можно использовать как камеру видео наблюдения добавив к arduino LAN или же как зрение к роботу. Так же возможно использовать в виде WEB-камеры для компьютера.

Источник

Платформа с web-камерой на ESP32

Идея собрать мобильную платформу с web-камерой на борту появилась практически спонтанно. Мне хотелось иметь в арсенале скромной домашней автоматизации что-то вроде IP-камеры. И тут вопрос не столь в цене или качестве, сколь в своеобразном творческом эксперименте. Материалом для вдохновения были различные статьи DIY и проекты вроде этого.

Собранная конструкция выглядит так:

Комплектующие

В качестве базы выступает мобильная двухпалубная робо-платформа Car Chassis 2WD Mini Kit

Размеры платформы: 135 мм х 135 мм х 80 мм

Приводом являются два стандартных мотор-колеса с редуктором и двигателем постоянного тока с растровыми дисками для датчиков скорости:

  • номинальный ток: 250 мА макс. при напряжении 3,6 В
  • крутящий момент 800 г/см (при напряжении 6В)
  • напряжение питания: 6 — 8 В
  • скорость вращения без нагрузки: 170 об/мин (при напряжении 3,6 В)
  • передаточное число редуктора: 1: 48
  • оси выходят с двух сторон
  • диаметр осей: 5 мм
  • размеры: 64x20x20 мм
  • вес: 26 г

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

  • Напряжение питания: 2 — 10 В
  • Рабочий ток на один канал: 1.5 А (пиковый ток 2.5 А, не более 10 секунд)
  • Входной сигнал логика: 5 В
  • Габариты: 24,7 х 21 х 0,5 мм

Для горизонтального и вертикального перемещения IP-камеры выбраны популярные серводвижки SG90 2кг.

На сайте производителя представлена следующая спецификация:

  • Weight: 9g
  • Dimension: 23×12.2x29mm
  • Stall torque: 1.8kg/cm(4.8v)
  • Gear type: POM gear set
  • Operating speed: 0.1sec/60degree(4.8v)
  • Operating voltage: 4.8v
  • Temperature range: 0℃_ 55℃
  • Dead band width: 1us
  • Power Supply: Through External Adapter
  • servo wire length: 25 cm
  • Servo Plug: JR (Fits JR and Futaba)

Для web-камеры был выбран держатель FPV Bracket Kit.

Описание держателя в интернет-магазине: “FPV позволит ориентировать FPV-камеру в 3-х плоскостях. Простое подключение и управление позволит быстро собрать и подключить платформу к контроллеру или полетному контроллеру. Используется вместе с сервоприводами EMAX 9g ES08A Mini Servo или сервами SG90 (с некоторыми доработками).”
“С некоторыми доработками” — следует учитывать, набор пришлось дорабатывать напильником в прямом смысле слова. Но для DIY за $3 вполне ничего. Некоторые жаловались, что даже доработка не помогла и сервы не подошли по размерам, в моем же случае все нормально. Используется два движка SG90 для горизонтального и вертикального перемещения камеры. Вариант спроектировать и распечатать на 3D-принтере тоже рассматривался, но остановился пока на этом держателе.

IP-камера на базе ESP32 CAM

Согласно описанию: “The I2S subsystem in the ESP32 also provides a high speed bus connected directly to RAM for Direct Memory Access. Putting it simply, you can configure the ESP32 I2S subsystem to send or receive parallel data under hardware control.”
То есть можно настроить интерфейс I2S ESP32 для отправки или получения параллельных данных под аппаратным управлением, что и реализовано для подключения камеры. Разработкой данной платы занимается компания Seeed Studio, здесь представлена цена $9.90, но в наших радиомагазинах продают за $8, видимо не только Seeed Studio их может производить.

  • The smallest 802.11b/g/n Wi-Fi BT SoC Module
  • Low power 32-bit CPU,can also serve the application processor
  • Up to 160MHz clock speed,Summary computing power up to 600 DMIPS
  • Built-in 520 KB SRAM, external 4MPSRAM
  • Supports UART/SPI/I2C/PWM/ADC/DAC
  • Support OV2640 and OV7670 cameras,Built-in Flash lamp.
  • Support image WiFI upload
  • Support TF card
  • Supports multiple sleep modes.
  • Embedded Lwip and FreeRTOS
  • Supports STA/AP/STA+AP operation mode
  • Support Smart Config/AirKiss technology
  • Support for serial port local and remote firmware upgrades (FOTA)

Источник питания

Управление платформы от автономного питания длительное время без подзарядки не предусматривалось. Поэтому в качестве источника был выбран модуль питания 2А на 18650 с USB-выходом с одним слотом.

Характеристики:

  • Тип аккумулятора: 18650 Li-Ion (без защиты)
  • Напряжение зарядного устройства: от 5В до 8В
  • Выходные напряжения:
  • 3В — непосредственно с аккумулятора через защитное устройство
  • 5В — через повышающий преобразователь.
  • Максимальный выходной ток:
  • Выход 3В — 1А
  • Выход 5В — 2А
  • Максимальный ток зарядки: 1А
  • Тип входного разъёма: micro-USB
  • Тип выходного разъёма: USB-A
  • Потребителей 5В — от перегрузки и короткого замыкания
  • Габаритные размеры:
  • Печатная плата: 29,5 х 99,5 х 19 мм
  • Всего устройства: 30 х 116 х 20 мм

В качестве основного контроллера выбран ESP-WROOM-32

Ранее я описывал характеристики ESP32 более детально. Здесь приведу базовые характеристики модуля:

  • 32-битный двуядерный микропроцессор Xtensa LX6 до 240 МГц
  • Флеш-память: 4 МБ
  • Беспроводная связь Wi-Fi 802.11b/g/n до 150 Мб/c, Bluetooth 4.2 BR/EDR/BLE
  • Поддержка STA/AP/STA+AP режимов, встроенный стек TCP/IP
  • GPIO 32 (UART, SPI, I2C, I2S интерфейсы, ШИМ, SD контроллеры, емкостные сенсорные, АЦП, ЦАП и не только
  • Питание: через microUSB разъем (CP2102 преобразователь) или выводы
  • Шаг выводов: 2.54 мм (можно вставить в макетную плату)
  • Размер платы: 5.2 х 2.8 см

В качестве датчиков скорости применены два оптических энкодеров “Noname” для подсчета импульсов вращения растровых дисков мотор-колеса.

Характеристики:

  • Напряжение питания: 3,3В — 5В
  • Ширина паза датчика: 6 мм;
  • Тип выхода: аналоговый и цифровой
  • Индикатор: cостояние выхода

Для измерения расстояния применен популярный ультразвуковой дальномер HC-SR04.

Характеристики:

  • Напряжение питания: 5 В
  • Потребление в режиме тишины: 2 мА
  • Потребление при работе: 15 мА
  • Диапазон расстояний: 2–400 см
  • Эффективный угол наблюдения: 15
  • Рабочий угол наблюдения: 30°

Программные реализации

Первым шагом стало знакомство и прошивка модуля ESP32 CAM.
Описание работы с модулем представлены на Харбе, здесь, здесь, а также на других ресурсах.
В основном статьи описывают простой процесс прошивки с помощью Arduino IDE. В большинстве случает этого достаточно и меня по-началу такой вариант тоже устраивал.

В радиомагазинах модули ESP32-CAM продаются с камерой OV2640, поэтому в скетче необходимо сделать небольшое изменение:

А также указать SSID и пароль к точке доступа Wi-Fi.

Одним из условий работы web-камеры в моем случае является возможность передавать видеопоток через прокси-сервер Keenetic. Я использую домашний роутер Keenetik Viva. Сервис KeenDNS предоставляет доменное имя домашнему web-ресурсу. Но к моему удивлению первая попытка завершилась неудачей. При попытке удаленного доступа через интернет я получил ошибку «Header fields are too long for server to interpret». С подобной проблемой я столкнулся не первый. Решением вопроса является изменение конфигурации CONFIG_HTTPD_MAX_REQ_HDR_LEN, например:

В случае с Arduino IDE ESP32 модули уже скомпилированы и представлены в виде статических библиотек, которые располагаются в Windows по пути — %userprofile%\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\tools\sdk\
Просто изменение параметра в заголовке ничего не даст.
То есть для изменения конфигурации нам необходимо перекомпилировать библиотеки ESP-IDF.
Решением стало клонирование проекта github.com/espressif/esp-who. В каталоге с примерами находим проект camera_web_server, делаем изменение параметра максимальной длины заголовка, ну а также не забываем указать настройки подключения к Wi-Fi.

Для того, чтобы проект скомпилировался, пришлось установить еще один чек-бокс — Support array ‘rtc_gpio_desc’ for ESP32.

После успешной компиляции и загрузки проекта переходим по соответствующему IP адресу в браузере и попадаем на страницу с интерфейсом нашей web-камеры.

Интерфейс похож на Arduino-примеры, но добавлен некоторый функционал.

Я внес небольшие изменения в исходный файл app_httpd.c для управления сигналом вывода GPIO_NUM_2 с web-интерфейса. Хотя в описании модуля говорится об использовании пинов для нужд SD-карты, но я ее не использую, поэтому могу задействовать данные пины.

Для дистанционного управления я наверстал незамысловатую панель на Node-Red, которая крутится на Raspberry pi.

Изображение видеопотока удалось встроить в ноду template:

Тут важен один момент: необходимо встраивать именно http, в случае https будут проблемы с Content-Security-Policy. Если же и в этом случае будут возникать проблемы, то можно попробовать добавить заголовки:

Для управления пином GPIO_NUM_2 модуля ESP32-CAM после внесения изменений в прошивку следует выполнять следующий http GET запрос:

На интерфейсе панели — это переключатель wakeup, в рабочем потоке все выглядит так

где функция request:

Настройки ноды http request:

Остальные параметры и статусы передаются по MQTT.

Подключение к Wi-Fi и MQTT

Я приведу примеры, используя Arduino фреймворк, так с ним я также экспериментировал. Но в итоге рабочее приложение у меня на ESP-IDF.

Подключение заголовка #include

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

Подключение к MQTT для Arduino-фреймворка выполняется с помощью библиотеки github.com/knolleary/pubsubclient.git.

Для использования библиотеки необходимо подключить заголовок #include

Вначале мы проверяем, что подключены к Wi-Fi, затем подключаемся к брокеру client.setServer(mqtt_server, 1883);

И устанавливаем коллбек функцию client.setCallback(callback);

В случае успешного подключения подписываемся на топики:

Были замечены случаи “отваливания” MQTT соединения, поэтому была добавлена проверка в периодическую задачу опроса.

Пример подключения к Wi-FI и MQTT c помощью ESP-IDF был описан в предыдущей статье.

В случае использования ESP-IDF сбоев при подключении к Wi-Fi и MQTT не наблюдалось. Один нюанс при обработке данных из MQTT топика в функции esp_err_t mqtt_event_handler(esp_mqtt_event_handle_t event): при типе события MQTT_EVENT_DATA следует учитывать параметры event->topic_len и event->data_len и брать имя топика и данные именно соответствующей длины, в противном случае мы получим мусор. Для этого мы можем создать буферные массивы или выделить память динамически (затем освободить ее), и скопировать данные, например так:

Отправка данных в топик производится с помощью функции esp_mqtt_client_publish

Обработка данных ультразвукового датчика HC-SR04

HC-SR04 – доступный и популярный датчик для проектирования устройств с микроконтроллерами. Как обычно — в сети куча материала на эту тему: здесь и здесь. Описание также можно посмотреть здесь, а краткий даташит — здесь.
Если коротко, то для начала измерения расстояния необходимо подать высокий сигнал длительностью 10 μs на пин Trig. Это инициирует передачу сенсором 8 циклов ультразвукового импульса с частотой 40 кГц и ожидания отраженного ультразвукового импульса. Когда датчик обнаруживает ультразвуковой сигнал от приемника, он устанавливает для вывода Echo высокий уровень и задержку на период (ширину), пропорциональный расстоянию. Чтобы вычислить расстояние необходимо вычислить формулу:

distance = duration * 340 м/с = duration * 0.034 м/мкс, где

340 м/с — скорость распространения звука в воздухе.

В Arduino-фреймворке функция pulseIn позволяет узнать длительность импульса в μs
Для ESP-IDF есть проект ESP-IDF Components library, в котором также есть компонент ultrasonic для HC-SR04.

В комментариях присутствует объяснение к алгоритму. Измерение длительности импульса происходит в цикле while пока уровень сигнала высокий на Echo пине (после // got echo, measuring) после чего расстояние измеряется:

Коэффициент для получения расстояния в сантиметрах ROUNDTRIP = 58.

В Arduino-фреймворке это выглядит еще проще:

Была попытка использования библиотеки ultrasonic ESP-IDF для Arduino проекта ESP32, но работает это дело до первого сбоя датчика. Почему так — точно выяснить не удалось. Сбой датчика — это периодический просчет в импульсах и выдача ложных показаний, в вычисленных цифрах он выглядит как расстояние более 20000 см. На форумах пишут, что это из-за некачественного датчика (китайская копия).

Измерение скорости с помощью оптических датчиков

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

Как обычно на эту тему уже есть статьи: digitrode.ru, mirrobo.ru, и arduino-kit.ru.

В Arduino-фреймворке мы вычисляем скорость следующим образом.
Определяем переменную (структуру) счетчика, например:

Затем в функции setup мы должны зарегистрировать входной пин и прерывание на него:

Далее вычисляется количество оборотов в минуту:

В ESP-IDF для этих целей можно использовать аппаратный счетчик PCNT, который был описан в предыдущей статье.

ШИМ управление

Про управление сервоприводами на Arduino можно почитать на developer.alexanderklimov, wiki.amperka.ru.
Как сказано в источнике выше: “Сервопривод — это механизм с электромотором, который может поворачиваться в заданный угол и удерживать текущее положение.” Практически мы имеем дело с широтно-импульсной модуляцией, где от ширины импульса сигнала зависит угол поворота привода.

Для ESP32 на Arduino-фреймворке можно использовать библиотеку ESP32Servo.

Для этого мы подключаем заголовок:

Указываем выходной пин:

После этого можем записывать необходимое значение величины поворота:

ШИМ управление для других типов устройств на Arduino-фреймворке производится с помощью библиотеки esp32-hal-ledc.h.
Микроконтроллеры ESP32 не поддерживают стандартную функцию Arduino analogWrite() для ШИМ. Вместо их предусмотрены функции:
ledcSetup(channel, freq, resolution_bits) — указываются канал, частота и разрешение;
ledcAttachPin(GPIO, channel) — указываются порт и канал;
ledcWrite(channel, dutycycle) — указываются канал и коэффициент заполнения ШИМ-сигнала.
Примеры можно увидеть по ссылке.
Как видно из названия, изначально функции проектировались для управления светодиодными модулями, но их также используют и для других целей.

В ESP-IDF фреймворке управление серво-приводом осуществляется так же, как и управление коллекторным с использованием модуля MCPWM, как описано в предыдущей статье. Пример MCPWM servo motor control можно посмотреть здесь.

То есть нам необходимо инициализировать модуль с помощью функции mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_0, &pwm_config);
А затем задавать значение угла
mcpwm_set_duty_in_us(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_OPR_A, angle);

C примерами использования модуля MCPWM для разных типов привода можно ознакомиться на github.
Пример управления коллекторным двигателем также был представлен в предыдущей статье.

Хочется отметить, что подобная платформа представляет собой дифференциально-управляемую неголономную систему. Двигатели имеют разброс в характеристиках, поэтому приходится задавать программное смещение для одного их них для обеспечения равномерной скорости. Ознакомиться с теорией можно на сайте robotosha.ru. Для оптимального управления мотор-редукторами применен PID-алгоритм с обратной связью в виде оптических датчиков. Описание алгоритма представлено здесь и здесь.
Описание уравнений движения, а также алгоритмов управления выходит за рамки данной статьи. Дифференциальная кинематика еще не реализована в коде.

Sleep Modes

Согласно документации, а также описанию в статье , ESP32 может переключаться между различными режимами питания:

  • Active mode
  • Modem Sleep mode
  • Light Sleep mode
  • Deep Sleep mode
  • Hibernation mode

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

Я задействовал режим Deep Sleep mode в случае отсутствия высокого сигнала на пине GPIO_NUM_13:

В случае отсутствия внешнего воздействия я подтянул вход 10к резистором к 3.3 В, хотя можно и программно. А в задаче периодического опроса проверяю состояние сигнала входа:

На этом буду завершать описание. Выше был показан практический пример использования модулей ESP32 с различной периферией. Также затронуты некоторые вопросы программной реализации и сравнение подходов ESP-IDF и Arduino.

Источник

Adblock
detector