Справочник платы

ESP32-CAM: распиновка, прошивка и подключение к Arduino

ESP32-CAM — плата на ESP32 с камерой, слотом для карты microSD и вспышкой, размером 27 × 40,5 мм. Своего USB у неё нет, поэтому первый вопрос — чем её прошить. Здесь — распиновка 16 выводов и какие из них на самом деле свободны, три способа прошивки, в том числе через Arduino Uno, что выбрать в меню и как получить видео в браузере. Тексты ошибок приведены дословно: по ним удобно искать свою беду на странице.

Что это за плата

Что такое ESP32-CAM

Плату ESP32-CAM придумала китайская компания AI-Thinker, а копируют её многие фабрики. На ней модуль ESP32-S с чипом ESP32 внутри, микросхема дополнительной памяти PSRAM, слот microSD, белый светодиод-вспышка и разъём для камеры. Камера идёт в комплекте на шлейфе: обычно OV2640 на 2 мегапикселя, но всё чаще — OV5640 на 5 мегапикселей. Программируется плата на языке Arduino: setup(), loop() и digitalWrite() работают так же, как на Uno. Расплата за размер — почти все выводы чипа уже заняты камерой и памятью.

Характеристики ESP32-CAM

МодульESP32-S от AI-Thinker, внутри чип ESP32: два ядра до 240 МГц
Оперативная память520 КБ в чипе и PSRAM — дополнительная память для кадров: программа видит 4 МБ
Флеш-память4 МБ
КамераOV2640 на 2 Мп; часто продают с OV5640 на 5 Мп или OV3660 на 3 Мп
СвязьWi-Fi 802.11 b/g/n 2,4 ГГц, Bluetooth 4.2 (классический и BLE)
USBнет: прошивка через выводы U0R и U0T
Карта памятислот microSD, AI-Thinker обещает карты до 4 ГБ
Светодиодыбелая вспышка на выводе 4 (горит при HIGH), красный на выводе 33 (горит при LOW)
Кнопкиодна — RST, сброс, на обратной стороне платы. Кнопки BOOT нет
Питание5 В на вывод 5V или стабилизированные 3,3 В на вывод 3V3
Ток по паспорту180 мА при 5 В без вспышки, около 310 мА со вспышкой
Антеннапечатная на модуле и разъём IPEX для внешней — работает одна из двух
Логика3,3 В; на вход — не больше 3,6 В
Размер и вес27 × 40,5 × 4,5 мм, 10 г

Чип на платах встречается разных ревизий. Снаружи их не отличить — металлический экран модуля одинаковый, а какой стоит у вас, покажет скетч из раздела про первую прошивку: ESP32-D0WDQ6 или ESP32-D0WD, на новых партиях — с окончанием -V3. PSRAM — это не часть чипа, а отдельная микросхема на плате. Бывает на 4 МБ и на 8 МБ, но ESP32 напрямую обращается не больше чем к 4 МБ внешней памяти, поэтому программа в обоих случаях увидит около 4 МБ.

Логика у платы 3,3-вольтовая: на вход нельзя подавать больше 3,6 В. Сигнал от пятивольтовой Arduino подключают через делитель из двух резисторов или преобразователь уровней.

Документы, если нужны подробности:

Антенна: встроенная или внешняя

Рядом с маленьким круглым разъёмом IPEX стоит перемычка — резистор на 0 Ом на трёх площадках. Она выбирает, куда идёт сигнал: на печатную антенну модуля или на разъём. Обе сразу не работают. Если купили внешнюю антенну, а сигнал не стал лучше, перемычку нужно перепаять в другое положение. Без внешней антенны держите плату подальше от металла и не закрывайте край модуля с зигзагом антенны.

OV2640, OV3660 или OV5640: какая камера у вас

Камеру определяет драйвер сам, по ответу датчика. В скетче ничего менять не нужно: для платы AI-Thinker с любой из трёх камер выбирается одна и та же модель, CAMERA_MODEL_AI_THINKER. Название датчика печатают скетчи «Снимок по ссылке» и «Снимки по расписанию» ниже — строка «Камера: OV2640» в мониторе порта.

КамераРазрешениеJPEGЧто учесть
OV26402 Мп, до 1600 × 1200естьШтатная камера: под неё сделаны и плата, и пример
OV36603 Мп, до 2048 × 1536естьДрайвер её узнаёт, а пример сам переворачивает картинку и поправляет яркость
OV56405 Мп, до 2560 × 1920естьАвтофокус в пакете для Arduino выключен. Кадр больше 1600 × 1200 может не поместиться в буфер примера. При долгом видео может заметно нагреваться
GC21452 Мп, до 1600 × 1200нетПример с ней не запустится: ему нужен JPEG

OV2640 или OV5640: что выбрать

Пять мегапикселей нужны для снимков с деталями. Для видео в браузере ставят 640 × 480 или 800 × 600: больший кадр дольше сжимать и передавать по Wi-Fi, и поток становится рывками. Такое разрешение есть у всех трёх камер. Если OV5640 продают с автофокусом, имейте в виду: в пакете ESP32 для Arduino автофокус выключен, и где окажется резкость, зависит от самого модуля. И ещё: при долгом видео OV5640 может заметно нагреваться, поэтому в тесный корпус без отверстий её лучше не прятать.

В магазине iarduino ESP32-CAM продаётся как раз с камерой OV5640: 1138 ₽, артикул 1309. Плата устроена так же, как AI-Thinker, и всё на этой странице к ней относится. Подпись нижнего правого вывода — GND или GND/R — посмотрите на своей плате: встречаются обе, а чем они отличаются, показывает переключатель на схеме ниже.

Распиновка ESP32-CAM

Плата нарисована стороной с камерой к вам, слотом карты вверх. Обе гребёнки по 8 контактов, подписи — как на самой плате. Переключатель сверху показывает разницу партий: на части новых плат нижний правый контакт подписан не GND, а GND/R. Наведите на категорию в легенде, чтобы подсветить её выводы, и нажмите на неё, чтобы прочитать пояснение.

Распиновка ESP32-CAM — схема выводовслот microSDкамераразъём шлейфавспышкамодуль ESP32-Sи антенна — на оборотеESP32-CAM5VGNDIO12IO13IO15IO14IO2IO4 · вспышка3V3IO16 · PSRAMIO0 · XCLKGNDVCC · выходU0R · RXU0T · TXGND

Классическая плата AI-Thinker. Своего USB нет: прошивают её через выводы U0R и U0T. Вывода сброса на гребёнке нет — только кнопка RST на самой плате, на обороте. Поэтому подставка MB не может перезапустить такую ESP32-CAM, и режим прошивки включают руками: держат IO0 и нажимают RST на самой плате.

Камера занимает выводы 0, 5, 18, 19, 21, 22, 23, 25, 26, 27, 32, 34, 35, 36 и 39, PSRAM — 16 и 17, флеш-память — 6–11. Красный светодиод висит на 33, и наружу этот вывод не выведен. Вот почему на гребёнку попали только 16 контактов, и половина из них — питание, земля и порт для прошивки. Для сравнения: у классической ESP32 DevKit на гребёнки выведено 30–38 контактов.

VCC — не вход, а выход: на нём 3,3 В, реже 5 В, смотря как запаяна перемычка на плате. Кнопка RST и красный светодиод — на обратной стороне платы, со стороны модуля с антенной.

Какие выводы свободны

Всё зависит от карты памяти. Её линии и есть почти все свободные выводы:

Что работаетСвободные выводы
Камера, карты нет2, 4, 12, 13, 14, 15 — с оговорками про пины запуска
Камера и карта в 1-битном режиме4 и 12. Вывод 13 к ним не относится: карта следит за ним, и если опустить его в LOW, она перестанет отвечать
Камера и карта в обычном, 4-битном режимени одного, кроме U0R и U0T
ВыводЧем занят на платеМожно ли занять
IO13, IO14Карта microSDДа, если карта не нужна. Самые спокойные выводы платы
IO15Карта; пин запускаДа, если карта не нужна. LOW при включении безобиден: загрузчик просто не напечатает свои строки
IO2Карта; пин запускаОсторожно: при включении не подтягивайте к плюсу, иначе плата не войдёт в режим прошивки
IO12Карта; задаёт напряжение флеш-памятиОсторожно: HIGH при включении — и плата не запустится и не прошьётся
IO4Вспышка; картаТолько как выход, и вспышка будет вспыхивать вместе с сигналом. Как вход не годится: транзистор вспышки прижимает линию примерно к 0,7 В, и кнопка с подтяжкой всегда читается как LOW
IO16Микросхема PSRAMНет
IO0Тактовый сигнал камеры; режим прошивкиНет: после старта вывод занят камерой
U0R, U0TПрошивка и монитор портаТолько если обойтись без Serial

Выводы 0, 2, 12 и 15: почему плата не запускается

Это пины запуска: их уровень чип читает в момент включения и сброса, а потом они работают как обычные. Самый коварный — 12. Он выбирает напряжение флеш-памяти: если при включении на нём HIGH, флеш получает 1,8 В вместо 3,3, и плата не запускается и не прошивается. Подтянуть его вверх может что угодно — модуль с резистором, шина I²C, светодиод к плюсу. Поэтому ничего такого к выводу 12 не подключайте. А если плата вчера работала, а сегодня «умерла», первым делом отключите всё от вывода 12.

Вывод 0 решает, что делать после сброса: LOW — ждать прошивку, HIGH — запускать программу. На плате он подтянут к плюсу, а после старта на нём работает тактовый сигнал камеры. Вывод 2 при входе в режим прошивки тоже должен быть в LOW, поэтому при включении его не тянут к плюсу. Вывод 15 безобиден: LOW на нём при включении только отключает служебные строки загрузчика.

Wire, SPI, Serial1 и Serial2 по умолчанию попадают на камеру

Пункт «AI Thinker ESP32-CAM» взял номера выводов у обычной ESP32 DevKit. Поэтому Wire.begin() без номеров займёт 21 и 22, SPI.begin() — 18, 19, 23 и 5, Serial1.begin(9600) — 26 и 27, по которым камера получает команды, а Serial2.begin(9600) — 25, линию камеры, и 4, вспышку. Камера после этого перестанет работать.

Указывайте выводы явно: например, датчик I²C без карты памяти — Wire.begin(14, 15), SDA на 14 и SCL на 15. Модуль датчика питайте от вывода 3V3: многие модули подтягивают линии I²C к своему питанию, и от вывода 5V на 14 и 15 пришли бы 5 В. Камера пользуется своей шиной I²C, с Wire они не мешают друг другу.

Аналоговые входы и Wi-Fi

Все свободные выводы ESP32-CAM относятся ко второму блоку аналоговых входов (ADC2). Его же использует Wi-Fi, и пока Wi-Fi включён, analogRead() на этих выводах молча возвращает 0 — без ошибки и без предупреждения. Аналоговый датчик рядом с камерой, которая передаёт видео, напрямую не прочитать. Обойти это можно внешним АЦП на шине I²C (например, ADS1115) или датчиком с цифровым выходом.

Питание ESP32-CAM: почему 5 В, а не 3,3

На плате стоит стабилизатор AMS1117: из напряжения на выводе 5V он делает 3,3 В для чипа, памяти и камеры. Ему нужен запас — на входе на 1,1–1,3 В больше, чем на выходе. Отсюда главное правило: 5 В подают на вывод 5V, а 3,3 В — только на вывод 3V3. Выберите вариант:

5 Висточник5V3V3VCCAMS1117теряет 1,1–1,3 Вперемычка, обычно на 3,3 ВШина 3V3 платы3,3 ВESP32PSRAM и флеш-памятькамера (свои 2,8 и 1,2 В)5 В на вывод 5VЧто произойдётСтабилизатор AMS1117 на плате делает из 5 В нужные 3,3 Вдля чипа, памяти и камерыЧто нужноИсточник держит хотя бы 0,5 А: со вспышкой плата берётоколо 310 мА, а Wi-Fi даёт короткие пики сверху. Провод —короткий и не тонкийТак и задумано: лучший вариант
Вывод 5V идёт на стабилизатор AMS1117, а вывод 3V3 — это его выход и общая шина 3,3 В платы. Напряжение, поданное на 3V3, идёт на чип без стабилизатора и без защиты.

Источник нужен на 0,5 А и больше. Частые причины перезагрузок — порт ноутбука, длинный тонкий кабель и разветвитель USB без своего блока питания: плата начинает перезапускаться, когда включает Wi-Fi или вспышку. Помогает электролитический конденсатор на 100–470 мкФ и 10 В прямо между выводами 5V и GND. При 5 В на входе стабилизатор платы заметно греется: в тепло уходит около 0,3 Вт, а со вспышкой — около 0,5 Вт.

От аккумулятора. Один литиевый аккумулятор даёт 3,0–4,2 В. На вывод 5V этого мало: после стабилизатора останется от 3,1 В у заряженного аккумулятора и меньше 2 В у севшего, а чипу нужно не меньше 3,0 В. На вывод 3V3 — много: заряженный аккумулятор даст 4,2 В при пределе 3,6. Нужен повышающий преобразователь до 5 В на вывод 5V. Подробнее про стабилизаторы — в статье про питание.

Как прошить ESP32-CAM: три способа

У платы нет ни USB, ни кнопки BOOT. Программу она получает через выводы U0R и U0T — порт UART0, а в режим прошивки входит, если в момент сброса вывод IO0 соединён с землёй. Нужен переходник с USB на этот порт. Подойдёт любой из трёх вариантов:

Подставка MB5VGNDTXRXкнопка IO0ESP32-CAM5VGNDU0RU0TIO0GNDсоединены через гребёнкуПодставка ESP32-CAM-MBКак соединитьВставить ESP32-CAM в подставку камерой вверх, вывод 5V — вгнездо 5V подставки (если гнёзда не подписаны, сверьтесь сфото продавца), и подключить подставку к компьютерукабелем USB. Провода не нужныРежим прошивкиПлату с выводом GND/R подставка может перевести в негосама. На плате V1.6 — руками: держите кнопку IO0 наподставке, нажмите и отпустите RST на самой ESP32-CAM,отпустите IO0Подводные камниПорт ноутбука может не потянуть Wi-Fi и камеру. При«Brownout detector was triggered» возьмите другой порт илиразветвитель USB с блоком питанияСамый простой способ: ни проводов, ни перемычек
Своего USB у ESP32-CAM нет: программу она получает через выводы U0R и U0T, а в режим прошивки входит, если при сбросе вывод IO0 соединён с землёй. Все три способа делают одно и то же, разница — сколько нужно делать руками.

Через плату ESP32-CAM-MB

MB — маленькая подставка с разъёмом USB, преобразователем USB-UART CH340 и двумя кнопками: IO0 и RST. ESP32-CAM вставляется в неё сверху, и получается плата с USB, как обычная DevKit. Драйвер CH340 Windows 10 и 11 обычно ставят сами; если порт не появился — поставьте драйвер, а если и с ним платы нет в списке — что ещё проверить.

Сама переводить плату в режим прошивки подставка может, только если у ESP32-CAM сброс выведен на гребёнку, — это платы, где нижний правый вывод подписан GND/R и перемычка рядом выводит на него сброс. На классической ESP32-CAM V1.6 там земля: кнопка RST подставки и её автоматический сброс попадают на вывод земли и ничего не сбрасывают. С такой платой режим прошивки включают руками:

  1. Нажмите и держите кнопку IO0 на подставке.
  2. Нажмите и отпустите кнопку RST на самой ESP32-CAM — она на обратной стороне платы.
  3. Отпустите IO0 и запускайте загрузку.
  4. После загрузки ещё раз нажмите RST на ESP32-CAM — программа запустится.

Если до кнопки RST трудно дотянуться, сделайте то же переподключением: держите IO0 и вставьте кабель USB — плата включится сразу в режиме прошивки. А если новая подставка не прошивает ни в какую, осмотрите её снизу: бывали подставки с перемычками, запаянными между контактами гребёнки, и с ними плата не отвечает.

Через переходник USB-UART

Подойдёт любой переходник на CH340, CP2102 или FT232 с логикой 3,3 В. TX переходника — к U0R платы, RX — к U0T, то есть крест-накрест. 5V — к 5V. GND — к выводу GND рядом с 5V: нижний правый вывод на части плат подписан GND/R, и землю туда не ведут. Перемычкой соедините IO0 с GND, нажмите RST на плате — и можно загружать. После загрузки снимите перемычку и снова нажмите RST. Так же, пятью проводами, прошивают Arduino Pro Mini, а про сам порт UART и делитель для пятивольтовых сигналов — в статье про UART.

Через Arduino Uno

У Arduino Uno R3 и её клонов с CH340 есть свой преобразователь USB-UART на выводах 0 и 1, и им можно воспользоваться. У Uno R4 отдельного преобразователя на этих выводах нет — с ней так не получится. Чтобы основной контроллер Uno не мешал, её вывод RESET соединяют с GND. Дальше провода идут прямо: вывод 0 «RX» Uno — к U0R, вывод 1 «TX» — к U0T. Подписи RX и TX на Uno сделаны для её собственного контроллера, а мы подключаемся мимо него. 5V — к 5V, GND — к выводу GND рядом с 5V, IO0 — к GND.

Перемычку IO0–GND ставьте до того, как подключите Uno к компьютеру: тогда ESP32-CAM сразу включится в режиме прошивки. Если плата уже была включена, нажмите на ней RST. После загрузки снимите перемычку и снова нажмите RST — программа запустится.

Есть два риска. Сигнал с Uno пятивольтовый: на вход U0R приходит 5 В через резистор 1 кОм, а ESP32 по паспорту допускает 3,6 В. Многие так прошивают, но гарантий никто не даёт: надёжнее делитель или подставка MB. Второе — скорость. Пункт «AI Thinker ESP32-CAM» грузит программу на 460800 бод, а у оригинальной Uno преобразователь — отдельный чип ATmega16U2 — выдаёт эту скорость с ошибкой 8,5 %. Если загрузка обрывается после строки Changing baud rate to 460800, выберите плату «ESP32 Dev Module» и скорость 115200 — что ещё выставить, сказано в разделе про меню.

Подключение ESP32-CAM к Ардуино: три разных вопроса

Под словами «подключить ESP32-CAM к Ардуино» понимают три разные задачи.

  • Прошить ESP32-CAM через Uno — схема выше, в разделе про три способа.
  • Работать с Uno в одном проекте. Платы связывают по UART. На ESP32-CAM при пустом слоте карты для этого годятся, например, выводы 13 (приём) и 14 (передача): Serial1.begin(9600, SERIAL_8N1, 13, 14). Номера указывайте обязательно: без них Serial1 займёт 26 и 27, а это линии камеры. Земли плат соединяют проводом. Сигнал от Uno к выводу 13 — через делитель с 5 В до 3,3 В, а сигнал с вывода 14 Uno понимает и так. На Uno — программный порт SoftwareSerial на двух свободных выводах. Так передают команды и короткие данные, но не видео: для кадров скорость слишком мала. Вывод 12 для приёма не берите: в покое линия UART держит HIGH, а HIGH на 12 при включении не даст плате запуститься — даже через делитель. Как связать две платы и собрать делитель — в статье про UART.
  • Подключить к Arduino IDE. Это про пакет ESP32 и выбор платы в меню — следующий раздел.

Какую плату выбрать в Arduino IDE для ESP32-CAM

Сначала поставьте пакет ESP32 — как это сделать. Затем в списке плат выберите «AI Thinker ESP32-CAM» и порт. В этом пункте нужное уже выставлено:

ПараметрAI Thinker ESP32-CAMESP32 Dev Module по умолчанию
PSRAMвключена всегда, пункта нетDisabled — поставьте Enabled
Partition SchemeHuge APP (3MB No OTA/1MB SPIFFS)Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS)
Upload Speed460800, пункта нет921600, можно выбрать 115200
Flash Size4MB, пункта нет4MB
LED_BUILTINнетнет

«ESP32 Dev Module» нужен, когда хочется другой скорости загрузки — например, при прошивке через Uno. Тогда выставьте PSRAM «Enabled», Partition Scheme «Huge APP (3MB No OTA/1MB SPIFFS)» и Upload Speed «115200». У «ESP32 Wrover Module» PSRAM уже включена, но разметку тоже нужно поменять на Huge APP. В Trema IDE эти пункты открываются кнопкой «Параметры платы» на верхней панели.

Первая прошивка: красный светодиод и проверка памяти

Привычный «Маячок» (Blink) на ESP32-CAM не соберётся: у этой платы в пакете не задан LED_BUILTIN, и сборка остановится с ошибкой:

error: 'LED_BUILTIN' was not declared in this scope

Красный светодиод на плате подключён к выводу 33 и горит наоборот — при LOW. Вспышка на выводе 4 горит при HIGH. Первая программа мигает красным и раз в две секунды печатает, что за чип стоит на плате и сколько у него памяти:

// Первая прошивка ESP32-CAM: мигает красный светодиод на плате, а в
// монитор порта (115200) раз в 2 секунды печатается, что за чип и сколько
// у него памяти. Камера тут не участвует — проверяем саму плату.
const int LED_RED = 33;   // красный светодиод: горит при LOW, а не при HIGH

void setup() {
  Serial.begin(115200);
  pinMode(LED_RED, OUTPUT);
}

void loop() {
  digitalWrite(LED_RED, LOW);    // зажечь
  delay(200);
  digitalWrite(LED_RED, HIGH);   // погасить

  uint16_t rev = ESP.getChipRevision();   // 101 значит v1.1, 300 — v3.0
  Serial.print("Чип: ");
  Serial.print(ESP.getChipModel());
  Serial.print(", ревизия v");
  Serial.print(rev / 100);
  Serial.print(".");
  Serial.println(rev % 100);
  Serial.print("Флеш-память, байт: ");
  Serial.println(ESP.getFlashChipSize());
  Serial.print("PSRAM, байт: ");
  Serial.println(ESP.getPsramSize());     // около 4 МБ; 0 — памяти нет
  Serial.println();
  delay(1800);
}
  1. Подключите плату любым из трёх способов и выберите «AI Thinker ESP32-CAM» и порт.
  2. Переведите плату в режим прошивки: IO0 на землю — кнопкой на подставке или перемычкой — и RST на самой плате. Нажмите «Загрузить».
  3. Отпустите IO0 или снимите перемычку, нажмите RST и откройте монитор порта на скорости 115200.

В мониторе появятся модель чипа и его ревизия, флеш-память 4 194 304 байта и PSRAM — около 4 МБ. Если загрузка прошла, а светодиод не мигает и монитор молчит, — плату не перезапустили: нажмите RST на самой плате. Появилась строка waiting for download — IO0 всё ещё на земле: снимите перемычку и нажмите RST ещё раз.

PSRAM: 4 или 8 МБ и что значит ноль

PSRAM на ESP32-CAM — отдельная микросхема на 4 или 8 МБ. Чип ESP32 напрямую видит не больше 4 МБ внешней памяти, поэтому скетч в обоих случаях покажет около 4 МБ — это не брак. Ноль в строке PSRAM значит, что память не найдена: микросхема не отвечает или что-то подключено к выводу 16. Без PSRAM пример CameraWebServer запустится, но ограничит кадр 800 × 600, а скетчам на этой странице, которые держат кадры в PSRAM, памяти не хватит.

Вспышку можно включить так же, командой digitalWrite(4, HIGH). Но резистора, который ограничивает её ток, на плате нет: светодиод очень яркий и сильно греется. Держите её включённой только на время снимка.

Камера в браузере: пример CameraWebServer

Главный пример для этой платы уже есть в пакете ESP32. Он показывает видео с камеры на странице в браузере, делает снимки и даёт настроить яркость, контраст и разрешение.

  1. Выберите плату «AI Thinker ESP32-CAM» и откройте пример: в Arduino IDE — Файл → Примеры → ESP32 → Camera → CameraWebServer, в Trema IDE — раздел «Примеры», группа ESP32. Пока выбрана другая плата, этих примеров в списке нет.
  2. Перейдите на вкладку board_config.h. По умолчанию там выбрана чужая плата, ESP-EYE: у неё камера подключена к другим выводам, и на ESP32-CAM ничего не заработает. Поставьте // перед строкой с ESP_EYE и уберите // перед строкой с AI_THINKER. Должно получиться так:
    //#define CAMERA_MODEL_WROVER_KIT // Has PSRAM
    //#define CAMERA_MODEL_ESP_EYE  // Has PSRAM        ← здесь // добавили
    ...
    #define CAMERA_MODEL_AI_THINKER // Has PSRAM       ← здесь // убрали
  3. На главной вкладке скетча (в Arduino IDE это CameraWebServer.ino, в Trema IDE она названа по имени проекта) впишите имя своей сети Wi-Fi и пароль вместо звёздочек в строках const char *ssid и const char *password. Сеть нужна на 2,4 ГГц.
  4. Выберите порт, переведите плату в режим прошивки и загрузите.
  5. Откройте монитор порта на 115200 и нажмите RST. Через несколько секунд появится строка Camera Ready! Use 'http://192.168.1.57' to connect — с адресом вашей платы.
  6. Откройте этот адрес в браузере компьютера или телефона в той же сети и нажмите Start Stream. Get Still — один снимок.

При старте пример сам ставит кадр 320 × 240, чтобы видео шло бойко, а крупнее выбирают в меню Resolution слева. Для OV3660 и OV5640 он открывает свою страницу настроек с их разрешениями. Если PSRAM не найдена, пример молча ограничивает кадр 800 × 600: крупнее в меню выбрать можно, но снимок придёт обрезанным. Распознавания лиц в примере пакета 3.x больше нет — кнопки Enroll Face из старых инструкций не ищите.

Как открыть камеру с телефона

Телефон должен быть подключён к той же сети Wi-Fi, что и плата. Откройте в его браузере адрес из монитора порта и нажмите Start Stream. Через мобильный интернет не получится: адрес вида 192.168.… виден только внутри домашней сети.

Почему видео видно только в одной вкладке

Поток идёт отдельно от страницы, на порту 81 (/stream), и обслуживает одного зрителя. Пока видео открыто на компьютере, на телефоне будет пусто. Закройте лишние вкладки — и поток появится там, где нужно.

ESP32-CAM не подключается к Wi-Fi

Если в мониторе только точки после WiFi connecting и адреса нет, плата не может подключиться: проверьте имя сети и пароль (регистр букв важен), диапазон 2,4 ГГц и расстояние до роутера. Остальные причины — в статье про Wi-Fi.

Скорость видео в кадрах в секунду пример печатает, только если в параметрах платы выставить Core Debug Level — подробность служебных сообщений — «Info». Тогда в мониторе пойдут строки MJPG: … fps: MJPG — так пример называет поток из кадров JPEG. Как плата раздаёт страницы, подробно — в статье про веб-сервер.

Снимок по ссылке с телефона

CameraWebServer большой и сложный. Если нужен просто кадр по запросу — для своего проекта, для умного дома или чтобы глянуть с телефона, — хватит короткого скетча. Плата печатает свой адрес, вы открываете его в браузере и видите свежий снимок. Адрес с ?flash=1 на конце делает снимок со вспышкой.

// Снимок по ссылке: плата подключается к Wi-Fi и печатает в монитор
// порта свой адрес. Откройте его в браузере телефона — увидите свежий
// кадр, обновите страницу — получите новый. Плата: AI Thinker ESP32-CAM.
#include <WiFi.h>
#include <WebServer.h>
#include "esp_camera.h"

// Сеть должна быть в диапазоне 2,4 ГГц: пятигигагерцевую плата не увидит.
const char WIFI_SSID[] = "имя вашей сети";
const char WIFI_PASS[] = "пароль от сети";

const int FLASH_PIN = 4;   // белый светодиод-вспышка: горит при HIGH

WebServer server(80);

// Выводы камеры на плате AI-Thinker ESP32-CAM. Так она разведена,
// менять их не нужно. У других плат с камерой выводы свои.
bool startCamera(framesize_t size, int quality) {
  camera_config_t config = {};
  config.pin_pwdn = 32;                    // включает питание камеры
  config.pin_reset = -1;
  config.pin_xclk = 0;                     // тактовый сигнал камеры
  config.pin_sccb_sda = 26;
  config.pin_sccb_scl = 27;
  config.pin_d7 = 35;
  config.pin_d6 = 34;
  config.pin_d5 = 39;
  config.pin_d4 = 36;
  config.pin_d3 = 21;
  config.pin_d2 = 19;
  config.pin_d1 = 18;
  config.pin_d0 = 5;
  config.pin_vsync = 25;
  config.pin_href = 23;
  config.pin_pclk = 22;
  config.xclk_freq_hz = 20000000;
  config.ledc_timer = LEDC_TIMER_0;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.pixel_format = PIXFORMAT_JPEG;
  config.frame_size = size;
  config.jpeg_quality = quality;           // 0–63: чем меньше, тем лучше
  config.fb_count = 2;                     // два кадра в PSRAM
  config.fb_location = CAMERA_FB_IN_PSRAM;
  config.grab_mode = CAMERA_GRAB_LATEST;   // всегда самый свежий кадр

  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    // 0x106 — камера не ответила или не умеет JPEG; FFFFFFFF — не хватило
    // памяти под кадр.
    Serial.print("Камера не запустилась, ошибка 0x");
    Serial.println(err, HEX);
    return false;
  }

  // Какой датчик стоит на шлейфе: OV2640, OV3660, OV5640...
  sensor_t *sensor = esp_camera_sensor_get();
  camera_sensor_info_t *info = esp_camera_sensor_get_info(&sensor->id);
  Serial.print("Камера: ");
  Serial.println(info ? info->name : "неизвестная");
  return true;
}

void sendPhoto() {
  // Адрес с ?flash=1 на конце — снимок со вспышкой.
  bool flash = server.arg("flash") == "1";
  if (flash) {
    digitalWrite(FLASH_PIN, HIGH);
    delay(150);                    // камера должна успеть увидеть свет
  }
  camera_fb_t *fb = esp_camera_fb_get();
  digitalWrite(FLASH_PIN, LOW);    // вспышка без резистора греется: гасим сразу
  if (!fb) {
    server.send(500, "text/plain; charset=utf-8", "Камера не дала кадр");
    return;
  }
  server.send_P(200, "image/jpeg", (const char *)fb->buf, fb->len);
  esp_camera_fb_return(fb);
}

void setup() {
  Serial.begin(115200);
  Serial.println();
  pinMode(FLASH_PIN, OUTPUT);
  digitalWrite(FLASH_PIN, LOW);

  if (!startCamera(FRAMESIZE_SVGA, 12)) {   // 800×600
    while (true) delay(1000);               // без камеры дальше смысла нет
  }

  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  Serial.print("Подключаюсь к Wi-Fi");
  unsigned long start = millis();
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    if (millis() - start > 20000) {
      Serial.println();
      Serial.println("Не подключается: проверьте имя сети и пароль");
      start = millis();            // и пробуем дальше
    }
  }
  Serial.println();

  server.on("/", sendPhoto);
  server.begin();
  Serial.print("Готово. Откройте в браузере адрес ");
  Serial.println(WiFi.localIP());
}

void loop() {
  server.handleClient();
}

В начале монитор порта покажет, какая камера стоит на шлейфе, — например, Камера: OV5640. Если вместо этого появилась строка с ошибкой, ищите её код в таблице ниже.

ESP32-CAM не прошивается: «Failed to connect to ESP32» и другие ошибки

Когда загрузка не удалась, в журнале появляется длинная строка вроде этой:

A fatal error occurred: Failed to connect to ESP32: Wrong boot mode detected (0x13)! The chip needs to be in download mode.

Главное в ней — то, что после второго двоеточия. Вот что это значит именно для ESP32-CAM:

Что пишет загрузкаЧто это значит и что делать
Wrong boot mode detected (0x13)! The chip needs to be in download mode.Плата перезапустилась, но как обычно, а не в режиме прошивки: в момент сброса IO0 не был на земле. Держите IO0 на земле — кнопкой на подставке или перемычкой, — нажмите RST на самой плате и запускайте загрузку снова
No serial data received.С платы не пришло ни байта. Чаще всего плата просто не в режиме прошивки и молча выполняет свою программу: загрузчик не может сбросить её сам, если на гребёнке нет вывода сброса. Держите IO0 на земле и нажмите RST на самой плате. Не помогло — проверьте, не перепутаны ли TX и RX, есть ли общая земля и питание, тот ли порт выбран, не попал ли провод земли на вывод GND/R, а с Uno — что её RESET соединён с GND
Invalid head of packet (0x…)Плата работает со своей программой и шлёт её строки вместо ответа загрузчику — например, точки из CameraWebServer. Переведите её в режим прошивки: IO0 на землю и RST на самой плате
Download mode successfully detected, but getting no sync reply: The serial TX path seems to be down.Плата в режиме прошивки и сама отвечает, но не слышит команд компьютера. Проверьте провод от TX переходника до U0R платы (у Uno — от вывода 0 «RX» до U0R) и общую землю
Timed out waiting for packet headerТак писали прежние версии загрузчика, и чаще всего по той же причине, что и 0x13: плата не в режиме прошивки
waiting for downloadВ мониторе порта после загрузки: программа загрузилась, но IO0 так и остался на земле, и плата снова ждёт прошивку. Снимите перемычку и нажмите RST

Остальные причины — не тот порт, занятый порт, кабель без линий данных — общие для всех плат и разобраны в статье про ошибки загрузки, а общие беды прошивки ESP32 — в разборе «ESP32 не прошивается».

Монитор порта молчит

Плата прошилась, а в мониторе порта пусто. Проверьте по порядку:

  • Скорость монитора — 115200, как в скетчах на этой странице.
  • Плату перезапустили после загрузки. На плате без вывода сброса на гребёнке загрузчик не может сделать это сам — нажмите RST на самой ESP32-CAM.
  • IO0 больше не на земле. Если в мониторе только строка waiting for download, плата всё ещё ждёт прошивку: снимите перемычку и нажмите RST.
  • Скетч печатает не только при старте. CameraWebServer, например, пишет адрес один раз, сразу после включения: откройте монитор и только потом нажмите RST.

Camera init failed with error 0x106 и другие ошибки камеры

Ошибки камеры печатает уже программа после запуска, в мониторе порта на скорости 115200:

Строка в мониторе портаЧто это значит и что делать
Camera init failed with error 0x106Камера не ответила или ответила не та. Перед этой строкой обычно стоят «Detected camera not supported.» и «Camera probe failed with error 0x106(ESP_ERR_NOT_SUPPORTED)». Чаще всего в board_config.h осталась модель ESP_EYE. Ещё — шлейф вставлен не до конца или не закрыта защёлка разъёма
JPEG format is not supported on this sensorКамера ответила, но не умеет сжимать кадр в JPEG, — например, GC2145. Код ошибки тот же, 0x106. Нужна OV2640, OV3660 или OV5640
Camera init failed with error 0xffffffffНе хватило памяти под кадр, рядом — «frame buffer malloc failed». Скетчи на этой странице печатают тот же код заглавными: 0xFFFFFFFF. Проверьте скетчем из раздела про первую прошивку, что PSRAM не равна нулю
Camera init failed with error 0x20001Этот код и 0x105 — из старых статей: так отвечали прежние версии пакета. В пакете 3.x вместо них 0x106

Шлейф камеры вставляют в разъём ровно и до упора, а потом закрывают защёлку. Если 0x106 появилась на плате, которая раньше работала, первым делом переставьте шлейф.

Brownout detector was triggered: плата перезагружается

Если сразу после прошивки или при включении Wi-Fi монитор порта пишет Brownout detector was triggered и плата перезагружается по кругу, — проседает питание. Детектор просадки перезапускает чип, когда напряжение после стабилизатора падает ниже примерно 2,43 В. Wi-Fi и камера потребляют рывками, и слабый источник в этот момент не вытягивает.

Что помогает: другой порт компьютера или блок питания на 5 В и 0,5 А, короткий толстый кабель, конденсатор на 100–470 мкФ между 5V и GND. И никаких 3,3 В на вывод 5V — разбор выше, в разделе про питание.

В старых скетчах встречается строка WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); — она отключает детектор. Плата перестанет перезагружаться с сообщением, но продолжит сбоить молча: зависать, терять Wi-Fi, портить снимки. Лечат питание, а не детектор.

Карта microSD: снимки по расписанию

Слот карты занимает выводы 2, 4, 12, 13, 14 и 15. Библиотека SD_MMC по умолчанию работает в 4-битном режиме — быстрее, но с двумя неудобствами: заняты все шесть выводов, а вспышка, которая сидит на той же линии, что и DATA1 карты, мигает при каждой записи. В 1-битном режиме, SD_MMC.begin("/sdcard", true), карта работает примерно на треть медленнее, зато освобождает выводы 4 и 12, а вспышка перестаёт мигать. Без лишней команды она может едва заметно светиться: держите вывод 4 в LOW, как в скетче ниже.

Карту форматируют в FAT32. AI-Thinker обещает карты до 4 ГБ; если большая карта не определяется, попробуйте карту поменьше. Как вообще писать файлы на карту — в статье про запись на карту памяти. Скетч каждые 30 секунд делает снимок 1600 × 1200 и сохраняет его файлом photo_1.jpg, photo_2.jpg и дальше, не затирая старые:

// Снимки по расписанию: каждые 30 секунд плата делает фото 1600×1200
// и сохраняет его на карту microSD: photo_1.jpg, photo_2.jpg и дальше.
// Плата: AI Thinker ESP32-CAM. Карта — в FAT32, вставлять до включения.
#include "esp_camera.h"
#include "SD_MMC.h"

const unsigned long INTERVAL_MS = 30000;   // пауза между снимками
const int FLASH_PIN = 4;   // вспышка: держим в LOW, иначе она едва заметно светится

int photoNumber = 1;

// Выводы камеры на плате AI-Thinker ESP32-CAM. Так она разведена,
// менять их не нужно. У других плат с камерой выводы свои.
bool startCamera(framesize_t size, int quality) {
  camera_config_t config = {};
  config.pin_pwdn = 32;                    // включает питание камеры
  config.pin_reset = -1;
  config.pin_xclk = 0;                     // тактовый сигнал камеры
  config.pin_sccb_sda = 26;
  config.pin_sccb_scl = 27;
  config.pin_d7 = 35;
  config.pin_d6 = 34;
  config.pin_d5 = 39;
  config.pin_d4 = 36;
  config.pin_d3 = 21;
  config.pin_d2 = 19;
  config.pin_d1 = 18;
  config.pin_d0 = 5;
  config.pin_vsync = 25;
  config.pin_href = 23;
  config.pin_pclk = 22;
  config.xclk_freq_hz = 20000000;
  config.ledc_timer = LEDC_TIMER_0;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.pixel_format = PIXFORMAT_JPEG;
  config.frame_size = size;
  config.jpeg_quality = quality;           // 0–63: чем меньше, тем лучше
  config.fb_count = 2;                     // два кадра в PSRAM
  config.fb_location = CAMERA_FB_IN_PSRAM;
  config.grab_mode = CAMERA_GRAB_LATEST;   // всегда самый свежий кадр

  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    // 0x106 — камера не ответила или не умеет JPEG; FFFFFFFF — не хватило
    // памяти под кадр.
    Serial.print("Камера не запустилась, ошибка 0x");
    Serial.println(err, HEX);
    return false;
  }

  // Какой датчик стоит на шлейфе: OV2640, OV3660, OV5640...
  sensor_t *sensor = esp_camera_sensor_get();
  camera_sensor_info_t *info = esp_camera_sensor_get_info(&sensor->id);
  Serial.print("Камера: ");
  Serial.println(info ? info->name : "неизвестная");
  return true;
}

void setup() {
  Serial.begin(115200);
  Serial.println();

  if (!startCamera(FRAMESIZE_UXGA, 10)) {   // 1600×1200
    while (true) delay(1000);
  }

  // 1-битный режим: данные идут по выводу 2, ещё нужны 14 и 15. Вывод 13
  // не трогайте — карта следит за ним. Вывод 4 остаётся вспышке, и она не
  // мигает при каждой записи.
  if (!SD_MMC.begin("/sdcard", true)) {
    Serial.println("Карта не найдена: вставьте её и перезапустите плату");
    while (true) delay(1000);
  }
  pinMode(FLASH_PIN, OUTPUT);
  digitalWrite(FLASH_PIN, LOW);

  // Старые снимки не затираем: ищем первый свободный номер.
  while (SD_MMC.exists("/photo_" + String(photoNumber) + ".jpg")) {
    photoNumber++;
  }

  delay(5000);   // первые секунды камера подстраивает яркость и цвет
}

void loop() {
  camera_fb_t *fb = esp_camera_fb_get();
  if (!fb) {
    Serial.println("Камера не дала кадр");
    delay(1000);
    return;
  }

  String path = "/photo_" + String(photoNumber) + ".jpg";
  File file = SD_MMC.open(path, FILE_WRITE);
  if (file) {
    size_t written = file.write(fb->buf, fb->len);
    file.close();
    if (written == fb->len) {
      Serial.print("Сохранён ");
      Serial.print(path);
      Serial.print(", байт: ");
      Serial.println(fb->len);
      photoNumber++;
    } else {
      Serial.println("Карта заполнена или запись оборвалась");
    }
  } else {
    Serial.println("Не удалось записать файл на карту");
  }
  esp_camera_fb_return(fb);

  delay(INTERVAL_MS);
}

Первые секунды после включения камера подстраивает яркость и баланс белого, и снимки получаются тёмными или зеленоватыми. Поэтому скетч ждёт 5 секунд перед первым кадром. Для записи видео на карту есть готовый проект ESP32-CAM_MJPEG2SD — это уже не короткий скетч, а большая прошивка со своей инструкцией.

Место под программу и прошивка по воздуху

Разметка — то, как поделена флеш-память: сколько места под программу, сколько под файлы. У пункта «AI Thinker ESP32-CAM» по умолчанию стоит разметка «Huge APP (3MB No OTA/1MB SPIFFS)»: 3 МБ под программу из 4 МБ флеш-памяти. CameraWebServer занимает 1 060 481 байт — треть. В папке примера ещё лежит свой файл partitions.csv: он важнее пункта меню и даёт программе 3,75 МБ. Строка о размере программы после сборки всё равно называет предел из меню, 3 145 728 байт, хотя места на деле 3,75 МБ. Это не ошибка.

Прошивка по воздуху (OTA) с Huge APP невозможна: нужен второй раздел под новую программу. Выберите «Minimal SPIFFS (1.9MB APP with OTA/128KB SPIFFS)» — CameraWebServer занимает там 53 %. Файл partitions.csv в этом случае удалите из своей копии примера: в нём второго раздела нет. Как устроена прошивка по воздуху — в статье про OTA.

Одна ловушка именно этого пункта меню. У разметок «Regular 4MB with spiffs (1.2MB APP/1.5MB SPIFFS)», «Regular 4MB with ffat (1.2MB APP/1.5MB FATFS)» и «Minimal (1.3MB APP/700KB SPIFFS)» сборка сравнивает размер программы всё с теми же 3 МБ, хотя места там 1,2–1,3 МБ. Программа побольше соберётся без единого предупреждения, а запускаться не будет: в мониторе порта появится строка Image length … doesn't fit in partition length 1310720. С этими разметками следите за размером сами. У «ESP32 Dev Module» такой беды нет: при его разметке по умолчанию CameraWebServer занимает 79 %, а программа больше 1,2 МБ остановит сборку с сообщением Sketch too big (в русской Arduino IDE — «Скетч слишком большой»).

Проекты на ESP32-CAM: что собирают

  • Видеонаблюдение в браузере — пример CameraWebServer как есть, в корпусе и с нормальным блоком питания.
  • Снимок по запросу или по датчику движения — как скетч «Снимок по ссылке» выше, плюс датчик движения на свободном выводе. Отправку снимка в Telegram делают готовыми библиотеками.
  • Фотоловушку и съёмку по расписанию — скетч с картой microSD выше.
  • Машинку с камерой — поток с камеры плюс драйвер моторов на свободных выводах при пустом слоте карты. Выводов хватает впритык, и про пины запуска помнить обязательно.
  • Простое машинное зрение — поиск цвета или линии в кадре. Сложные нейросети на этом чипе медленны.
  • Умный дом. Для Home Assistant ESP32-CAM часто прошивают ESPHome — это отдельная прошивка, её ставят не из Arduino IDE. Свой скетч с Home Assistant связывают через MQTT. Счётчики воды по фото тоже читает готовая прошивка, AI-on-the-edge-device.

Проекты попроще, на обычной Arduino, — в подборке проектов.

Чему не верить в старых инструкциях про ESP32-CAM

Многие инструкции про ESP32-CAM написаны под старые версии пакета ESP32. С тех пор многое поменялось:

  • «В примере CameraWebServer есть распознавание лиц» — в пакете 3.x его убрали: остались поток, снимок и настройки камеры
  • «Ошибка камеры — 0x20001 или 0x105» — это коды прежних версий, сейчас 0x106
  • «Если не работает, выберите плату Node32s» — в этом пункте нет ни PSRAM, ни исправления для первых чипов ESP32, а разметки с 3 МБ под программу нет
  • «Отключите детектор просадки одной строкой в начале скетча» — плата продолжит сбоить, только без предупреждения
  • «Вывод 5V выдержит и 9–12 В» — стабилизатору платы придётся превращать в тепло 1–1,6 Вт, он перегреется
  • «Скачайте библиотеку esp_camera.h отдельно» — она уже есть в пакете ESP32, качать её не нужно
  • «#include "dl_lib.h"» в старых скетчах — такого файла в новых пакетах нет, сборка остановится
  • «GPIO16 — свободный вход RX» — по этому выводу чип обращается к микросхеме PSRAM, занимать его нельзя
  • «На выводе VCC всегда 3,3 В» — зависит от перемычки на плате
  • «Uno подключайте крест-накрест» — когда RESET Uno на земле, провода идут прямо: RX к RX, TX к TX
  • «Автофокус OV5640 работает» — в пакете для Arduino он выключен

ESP32-CAM или плата на ESP32-S3 с камерой

ESP32-CAM — самый дешёвый способ получить камеру с Wi-Fi, но у дешевизны есть цена: нет USB, почти нет свободных выводов, программа видит только 4 МБ PSRAM. Платы с камерой на ESP32-S3 — например, XIAO ESP32S3 Sense — прошиваются по USB как обычные платы, у них 8 МБ PSRAM и свободные выводы остаются, но стоят они дороже. Если камера не нужна, а нужна маленькая плата с Wi-Fi — ESP32-C3 Super Mini; если нужно много выводов — классическая ESP32 DevKit.

Чем программировать

ESP32-CAM в Trema IDE

Trema IDE — русская среда, совместимая с Arduino IDE: те же скетчи .ino, тот же пакет ESP32 и тот же пункт «AI Thinker ESP32-CAM». Пакет ставится из менеджера плат с российского зеркала, без ручных ссылок и VPN. Пример CameraWebServer лежит в разделе «Примеры» и открывается целиком, со всеми вкладками, параметры платы открываются кнопкой на верхней панели, а ошибки сборки объясняются по-русски, с переходом к нужной строке.

  • Пакет ESP32 ставится с российского зеркала
  • Пункт «AI Thinker ESP32-CAM» тот же, что в Arduino IDE
  • Пример CameraWebServer открывается целиком, со всеми вкладками
  • Скетчи .ino открываются без переделки
  • Ошибки сборки — с объяснением по-русски и переходом к строке

Вопросы

Частые вопросы про ESP32-CAM

Не нашли ответа? Спросите нас

Как прошить ESP32-CAM?

USB у платы нет. Нужна плата-подставка ESP32-CAM-MB, переходник USB-UART или Arduino Uno. Режим прошивки включается, если в момент сброса вывод IO0 соединён с землёй: на подставке держат кнопку IO0, без неё ставят перемычку IO0–GND, и в обоих случаях нажимают RST на самой ESP32-CAM. После загрузки перемычку снимают и снова нажимают RST — программа запускается.

Какую плату выбрать в Arduino IDE для ESP32-CAM?

«AI Thinker ESP32-CAM». В этом пункте PSRAM уже включена и стоит разметка Huge APP на 3 МБ под программу. Если выбрать «ESP32 Dev Module», выставьте PSRAM «Enabled» и Partition Scheme «Huge APP (3MB No OTA/1MB SPIFFS)». Node32s не подходит: в нём нет пункта PSRAM и разметки Huge APP.

Как подключить ESP32-CAM к Ардуино и прошить через Uno?

Подойдёт Uno R3 или клон с CH340, с Uno R4 так не получится. Вывод RESET Uno соединяют с GND, чтобы её собственный контроллер молчал. Дальше U0R платы — к выводу 0 «RX» Uno, U0T — к выводу 1 «TX»: здесь провода идут прямо, а не крест-накрест. IO0 — к GND, 5V — к 5V, земля общая. Перед загрузкой нажмите RST на ESP32-CAM, а после неё снимите перемычку с IO0 и нажмите RST ещё раз. Пункт «AI Thinker ESP32-CAM» грузит на 460800, а у оригинальной Uno на этой скорости ошибка 8,5 %: выберите «ESP32 Dev Module» со скоростью 115200, PSRAM Enabled и разметкой Huge APP. Сигналы Uno пятивольтовые, а ESP32 допускает не больше 3,6 В, поэтому надёжнее подставка MB или переходник на 3,3 В.

ESP32-CAM не прошивается: «Failed to connect to ESP32». Что делать?

Смотрите, что написано после двоеточия. «Wrong boot mode detected (0x13)» — плата запустилась как обычно: в момент сброса IO0 не был на земле. «No serial data received» — с платы ничего не пришло, и чаще всего она тоже не в режиме прошивки. В обоих случаях держите IO0 на земле и нажмите RST на самой ESP32-CAM: если плата V1.6 стоит в подставке MB, кнопка RST подставки её не сбрасывает. Не помогло — проверьте, не перепутаны ли TX и RX, общую землю и порт.

Что значит Camera init failed with error 0x106?

Камера не ответила или ответила не та. Чаще всего в файле board_config.h примера осталась модель ESP_EYE, а нужна CAMERA_MODEL_AI_THINKER. Ещё причины: шлейф вставлен не до конца или не закрыта защёлка, камера без JPEG, например GC2145. Коды 0x20001 и 0x105 из старых статей относятся к прежним версиям пакета.

Что делать, если ESP32-CAM пишет «Brownout detector was triggered»?

Проседает питание, когда плата включает Wi-Fi или камеру. Подайте 5 В на вывод 5V от блока на 0,5 А и больше, возьмите короткий кабель, поставьте конденсатор на 100–470 мкФ между 5V и GND. Отключать детектор не стоит: плата продолжит сбоить, только без предупреждения.

Можно ли питать ESP32-CAM от 3,3 В?

На вывод 5V — нет: стабилизатор платы теряет 1,1–1,3 В, и на выходе останется около 2,2 В, ниже порога детектора просадки. На вывод 3V3 — можно, если это стабилизированные 3,0–3,6 В от источника на 0,5 А и больше. Надёжнее всего 5 В на вывод 5V.

Какие выводы ESP32-CAM свободны?

Без карты памяти — 2, 4, 12, 13, 14 и 15, плюс U0R и U0T, если не нужен Serial. С картой в 1-битном режиме остаются 4 и 12; 13 занимать нельзя — карта перестанет отвечать, если он опустится в LOW. С картой в обычном, 4-битном режиме свободных нет. Вывод 12 при включении не должен быть в HIGH, а аналоговые входы на этих выводах не работают вместе с Wi-Fi.

Где светодиод на ESP32-CAM и почему Blink не собирается?

Красный светодиод — на выводе 33 и горит при LOW. Вспышка — на выводе 4 и горит при HIGH. LED_BUILTIN для этой платы в пакете не задан, поэтому стандартный Blink останавливается с ошибкой «'LED_BUILTIN' was not declared in this scope».

Сколько PSRAM на ESP32-CAM: 4 или 8 МБ?

На плате стоит отдельная микросхема на 4 или 8 МБ. Чип ESP32 напрямую обращается не больше чем к 4 МБ внешней памяти, поэтому программа в обоих случаях покажет около 4 МБ.

Чем отличаются камеры OV2640, OV3660 и OV5640 для ESP32-CAM?

Разрешением: 2, 3 и 5 мегапикселей, и все три выдают JPEG. Датчик драйвер определяет сам, в скетче остаётся модель CAMERA_MODEL_AI_THINKER. Для видео в браузере ставят 640 × 480 или 800 × 600, и тут разница в мегапикселях не важна. Автофокус OV5640 в пакете для Arduino выключен.

Есть ли распознавание лиц в примере CameraWebServer для ESP32-CAM?

В пакете ESP32 3.x — нет: остались видео, снимок и настройки камеры. Инструкции с кнопкой Enroll Face написаны под старые версии пакета.

Как открыть камеру ESP32-CAM с телефона?

Телефон должен быть в той же сети Wi-Fi, что и плата. Откройте в браузере адрес, который пример напечатал в мониторе порта, и нажмите Start Stream. Видео показывается одному зрителю: если оно открыто на компьютере, на телефоне будет пусто.

Какую карту microSD вставить в ESP32-CAM и почему мигает вспышка?

Карту форматируют в FAT32. AI-Thinker обещает карты до 4 ГБ — если большая не определяется, возьмите поменьше. Вспышка подключена к той же линии, что и DATA1 карты, поэтому в обычном 4-битном режиме мигает при записи. В 1-битном режиме, SD_MMC.begin("/sdcard", true), мигать перестанет.

Камера с Wi-Fi — за один вечер

Скачайте Trema IDE, поставьте пакет ESP32 с российского зеркала, выберите «AI Thinker ESP32-CAM», поправьте две строки в board_config.h, впишите свою сеть Wi-Fi — и видео с камеры откроется в браузере. Дома — бесплатно навсегда.