Попался мне под руку модуль ESP32-CAM, включающий в себя, собственно, ESP32, а также камеру OV2640. Модуль является довольно-таки популярным решением, так что не обойдем стороной нюансы и вопросы, связанные с его использованием. А в этой статье организуем быстрый старт с ESP32-CAM. И, конечно, старт с этой платой нельзя считать полноценным без того, чтобы задействовать основные функции - а именно Wi-Fi подключение и получение видео-потока с камеры.
Начнем с более подробного рассмотрения:
На плате присутствуют:
- Беспроводной модуль ESP32-S с интегрированным Wi-Fi и Bluetooth контроллерами.
- Камера OV2640 - идет отдельно, но на плате предусмотрен разъем для ее подключения.
- Разъем для карт памяти micro-SD.
- Светодиод, который, если придерживаться логических соображений, видимо призван играть роль вспышки.
И, поскольку ESP32 не просто реализует связь по беспроводным интерфейсам, но и является полноценным контроллером сам по себе, то на плате его сигналы выведены на штыревые разъемы для дальнейшего использования. ESP32 имеет:
- 32-разрядный процессор, с тактовой частотой 160 или 240 МГц.
- Wi-Fi: 802.11 b / g / N
- Bluetooth: v4.2 BR/EDR and BLE
- Большое количество периферийных модулей, в том числе:
- SPI x 4
- ADC
- DAC x 2
- UART x 3
- CAN
- I2C x 2
- 520 КБ SRAM
И это еще далеко не полный список. Прошивается ESP32 по UART, поэтому я взял для этих целей USB-UART переходник на базе PL2303 (не USB-RS232(!), у этого переходника соответствующие требуемым уровни - 3.3 В):
Для подключения используются выводы:
- GPIO1 - U0TXD - подключается к Rx UART.
- GPIO3 - U0RXD - подключается к Tx UART.
Кроме того, для программирования модуля необходимо подтянуть вывод GPIO0 к земле. Соответственно, по окончанию прошивки подтяжку надо убрать. И вот так в итоге выглядит полное подключение:
Причем при подключении питания через вход 3.3В наблюдалось большое количество разнообразных проблем - прошивалось через раз, работать модуль отказывался в принципе и т. д. И эти проблемы разом устранились при подаче 5В питания через соответствующий вход (как на схеме выше).
Но при этом напряжение логических уровней на входах - строго 3.3 В! Сигналы 5 В могут повредить контроллер.
На этом с физическим подключением заканчиваем.
Итак, для быстрого запуска ESP32-CAM используем существующие примеры и библиотеки для Arduino IDE. И, поскольку я лично Arduino IDE никогда не пользовался, да и не собирался, то переходим к Шагу 0.
Шаг 0.
Установка Arduino IDE. С этим все просто - скачиваем с официального сайта, устанавливаем и запускаем.
Шаг 1.
Теперь в свежеустановленную IDE необходимо интегрировать поддержку нашего модуля ESP32. Идем в настройки (File - Preferences) и в нижней части окна настроек в Additional Boards Manager URLs добавляем строку:
https://dl.espressif.com/dl/package_esp32_index.json
В итоге получаем следующее:
Небольшое дополнение - если у вас в этой строке уже сохранена какая-либо ссылка (или ссылки), то можно без проблем добавить еще одну, разделять их следует просто запятой:
https://dl.espressif.com/dl/package_esp32_index.json, https://link2.com/dl/file2.json, https://link3.com/dl/file3.json
На этом закрываем окно настроек и переходим к Шагу 2.
Шаг 2.
Переходим в Boards Manager: Tools - Board - Boards Manager:
В открывшемся окне в поиске вводим "esp32", получаем один вариант и нажимаем на Install:
Ожидаем завершения операции и переходим к следующему этапу. Только предварительно в Tools - Board - ESP32 Arduino выбираем используемую плату. Разработчики IDE периодически перетасовывают и изменяют список доступных плат, итоговая задача тем не менее проста - нужно найти в списке свою и выбрать ее.
Шаг 3.
Открываем в Arduino IDE пример для работы с камерой. Для этого следуем в File - Examples - ESP32 - Camera - CameraWebServer:
Получаем готовый проект с инициализацией в функции setup() и основным циклом программы в функции loop().
Шаг 4.
Теперь необходимо немного изменить код для того, чтобы плата и камера успешно заработали. Первым делом выбираем модель камеры. Осуществляется это комментированием ненужного и раскомментированием нужного:
// Select camera model //#define CAMERA_MODEL_WROVER_KIT //#define CAMERA_MODEL_ESP_EYE //#define CAMERA_MODEL_M5STACK_PSRAM //#define CAMERA_MODEL_M5STACK_WIDE #define CAMERA_MODEL_AI_THINKER
Второе изменение заключается в установке имени сети и пароля для подключения по Wi-Fi. К примеру:
const char* ssid = "home"; const char* password = "pass1234";
На этом с кодом заканчиваем и переходим к прошивке.
Шаг 5.
Подключение мы уже осуществили, так что на этом этапе чисто программные моменты. В меню Tools нам нужно задать актуальные параметры для программирования платы, в частности, номер COM-порта (плату мы уже выбрали на Шаге 2). Вот список настроек для моей платы:
Шаг 6.
Прошиваем плату, для этого нажимаем кнопку upload, не забыв предварительно подтянуть пин GPIO0 к земле:
Завершающая часть успешного лога прошивки выглядит примерно так:
Compressed 3072 bytes to 119... Wrote 3072 bytes (119 compressed) at 0x00008000 in 0.0 seconds (effective 1068.5 kbit/s)... Hash of data verified. Leaving... Hard resetting via RTS pin...
Шаг 7.
Отключаем подтяжку GPIO0 и запускаем Serial Monitor (Tools - Serial monitor):
Теперь можем перезапустить плату кнопкой Reset и на экране появятся строки, сигнализирующие об успешном подключении к сети Wi-Fi:
WiFi connected Starting web server on port: '80' Starting stream server on port: '81' Camera Ready! Use 'http://192.168.0.104' to connect
Шаг 8.
Собственно, остается только перейти в браузере по указанному ip-адресу, чтобы наглядно увидеть результат работы программы. Далее находим внизу кнопку Start Stream и получаем изображение с OV2640:
Можно потестировать имеющиеся настройки камеры, в частности интересны режимы распознавания лица. Кстати я видел много комментариев на разных площадках, что начиная с определенной версии эта функция работать перестала. Но на практике я с проблемами не столкнулся - все работает более чем корректно.
Включаем Face Detection и Face Recognition и далее кнопкой Enroll Face можно зарегистрировать человека. И впоследствии камера определит, находится ли в кадре зарегистрированное лицо или некое другое. В общем, все это можно попробовать, а наша сегодняшняя задача на этом выполнена, до скорых встреч 🤝