ESP32-S3-CAM N16R8: какой должна была быть ESP32-CAM

Классическая ESP32-CAM от AI-Thinker сделала камеру с Wi‑Fi доступной почти каждому — и заодно научила целое поколение самодельщиков терпению. USB-порта на ней нет: для каждой прошивки нужен внешний адаптер USB–UART и перемычка на GPIO0. Из 16 выводов свободны считаные единицы, а светодиод вспышки моргает всякий раз, когда программа пишет на карту памяти.

Плата из этой статьи — та же идея, доведённая до ума. На ней ESP32-S3 с 16 МБ Flash и 8 МБ PSRAM, камера OV5640 на 5 Мп, слот microSD, два разъёма USB‑C и все 36 GPIO модуля, выведенные на гребёнки. Подвох один: когда работают камера и карта памяти, по-настоящему свободных выводов остаётся шесть. Дальше — подробная карта платы: что к чему подключено, какой разъём за что отвечает, какие контакты можно занимать и как настроить Arduino IDE, чтобы камера не превратилась в квест.

Распиновка ESP32-S3 WROOM CAM. Левая гребёнка сверху вниз: 3V3, EN, GPIO4, 5, 6, 7, 15, 16, 17, 18, 8, 3, 46, 9, 10, 11, 12, 13, 14, 5V. Правая: GPIO43 (TX), 44 (RX), 1, 2, 42, 41, 40, 39, 38, 37, 36, 35, 0, 45, 48, 47, 21, 20, 19, GND. Цветные плашки показывают камеру, microSD, PSRAM, USB, UART, JTAG, ADC и сенсорные входы.
ESP32-S3 WROOM CAM: обе гребёнки и функции каждого вывода. Нажмите, чтобы открыть в полном размере.

О какой именно плате идёт речь

В магазинах эту плату называют по-разному: ESP32-S3-CAM, ESP32-S3 WROOM CAM, ESP32-S3 CAM Development Board. На самой плате написано скромно — ESP32-S3 WROOM, а на металлическом экране модуля — ESP32-S3-N16R8. Эта маркировка и есть главная характеристика: N16 означает 16 МБ Flash, R8 — 8 МБ PSRAM. Сам модуль — ESP32-S3-WROOM-1 с антенной на печатной плате.

Разводка повторяет плату Freenove ESP32-S3-WROOM CAM: то же место для камеры, те же выводы, две кнопки и два USB‑C. Freenove комплектует свою плату камерой OV2640 на 2 Мп, а на экземпляре из этой статьи стоит OV5640 на 5 Мп — это видно по надписи на шлейфе. Такие платы выпускают разные фабрики, и от партии к партии могут отличаться модуль камеры и мост USB–UART. Прежде чем искать драйвер или чужой пример, стоит посмотреть на маркировку своего экземпляра.

Технические характеристики

УзелХарактеристикаПрактическое значение
МодульESP32-S3-WROOM-1-N16R8, антенна на печатной платеГотовый модуль Espressif размером 18 × 25,5 × 3,1 мм; все его 36 GPIO выведены на гребёнки
Процессор2 ядра Xtensa LX7, до 240 МГц, FPUХватает на JPEG-поток, Wi‑Fi и логику приложения одновременно; есть инструкции для ускорения нейросетей и обработки сигналов
Память SoC512 КБ SRAM, 384 КБ ROMДля кадров камеры внутренней памяти мало — их место в PSRAM
Flash16 МБ, Quad SPIХватает на крупное приложение, OTA и файловую систему
PSRAM8 МБ, Octal SPI (OPI)Кадровые буферы камеры; в Arduino IDE нужен режим OPI PSRAM
Wi‑Fi2,4 ГГц, 802.11 b/g/n, до 150 Мбит/сПотоковое видео MJPEG, отправка снимков, обновление по воздуху
BluetoothBluetooth 5 (LE), mesh, скорости до 2 Мбит/с и режим Long RangeТолько BLE: классического Bluetooth с SPP и A2DP у ESP32-S3 нет
КамераOV5640, 5 Мп (2592 × 1944), 8-битная шина DVP, настройка по SCCBСенсор сам сжимает кадр в JPEG; шина занимает 14 GPIO
Разъём камерыFPC, 24 контактаМодуль камеры сменный: подходят модули того же стандарта
Карта памятиmicroSD, SDMMC в однобитном режимеСнимки и таймлапсы пишутся прямо на плату; слот занимает GPIO38–40
USBДва USB‑C: мост USB–UART на UART0 и нативный USB самого ESP32-S3Прошивка и логи — через правый разъём, USB-устройства и отладка — через левый
GPIO36 выводов на двух гребёнках по 20 контактовБез оговорок свободны шесть, ещё несколько — с условиями
Индикация и кнопкиСветодиоды ON, TX, RX, IO2 (GPIO2) и RGB WS2812 (GPIO48); кнопки EN и BOOT (GPIO0)Есть чем мигать и что нажимать без внешних деталей
Питание5 В через USB‑C или вывод 5V; на выводе 3V3 — 3,3 В со стабилизатора платыМодулю нужен источник не слабее 0,5 А
Логические уровни3,3 В; GPIO не выдерживают 5 ВСигнал 5 В подключают только через согласование уровней
Рабочая температура−40…+65 °C (модули с Octal PSRAM)Ниже, чем у модулей без PSRAM с их 85 °C; в закрытом корпусе это важно
Среды разработкиArduino IDE, PlatformIO, ESP-IDF; MicroPython — со сборкой, в которой есть драйвер камерыДля быстрого старта удобнее Arduino, для серьёзного проекта — ESP-IDF

Немного арифметики. Кадр 5 Мп в формате RGB565 занимает 2592 × 1944 × 2 = 10 077 696 байт, то есть около 9,6 МиБ. Это больше, чем все 8 МБ PSRAM, поэтому полное разрешение доступно только в JPEG, который сенсор сжимает сам. Кадр UXGA 1600 × 1200 в том же RGB565 весит около 3,7 МиБ и уже помещается. На практике камеру почти всегда держат в JPEG: так и памяти нужно меньше, и по Wi‑Fi передавать проще.

Два USB‑C: какой разъём за что отвечает

На лицевой стороне разъёмы не подписаны: надписи USB-UART и USB-OTG стоят на обороте. Отсюда классическая зеркальная ловушка — если перевернуть плату лицом вверх, левая надпись окажется под правым разъёмом. Если смотреть на плату со стороны камеры, антенной вверх, картина такая:

РазъёмЧто за нимДля чего брать
Левый, USB-OTGНативный USB самого ESP32-S3: GPIO19 — D−, GPIO20 — D+. Встроенный USB-Serial-JTAG или USB OTGОтладка без внешнего адаптера, собственные USB-устройства: клавиатура, мышь, MIDI, накопитель, веб-камера
Правый, USB-UARTМост USB–UART, подключённый к UART0: GPIO43 — TX, GPIO44 — RXПрошивка и Serial Monitor — самый предсказуемый путь

Какой порт получит вывод Serial, решает настройка USB CDC On Boot в Arduino IDE. В положении Disabled Serial — это UART0, и сообщения уходят в правый разъём. В положении Enabled Serial переезжает на нативный USB, то есть в левый. Если монитор порта молчит, первым делом стоит проверить именно этот пункт и то, в какой разъём вставлен кабель. Сообщения загрузчика ROM по умолчанию выводятся в оба порта.

У левого разъёма есть и менее очевидное достоинство. Встроенный в ESP32-S3 контроллер USB-Serial-JTAG позволяет отлаживать программу с точками останова без внешнего адаптера и без единого дополнительного вывода. Это особенно ценно здесь, потому что штатные выводы внешнего JTAG (GPIO39–42) на этой плате частично заняты картой памяти.

Гребёнки: разбор каждого вывода

Ориентация в таблицах — компонентами вверх, антенна сверху, разъёмы USB снизу. У номеров на шелкографии есть значки: подчёркнутые выводы заняты камерой, тильдой отмечены выводы microSD, звёздочкой — PSRAM. Легенда к ним напечатана на обороте.

Левая гребёнка, сверху вниз

ВыводЧто на нёмМожно ли занять
3V33,3 В со стабилизатора платыНе GPIO
ENСброс, кнопка EN; активный уровень — низкийНет
GPIO4Камера: SIOD, данные SCCBТолько без камеры
GPIO5Камера: SIOC, такт SCCBТолько без камеры
GPIO6Камера: VSYNCТолько без камеры
GPIO7Камера: HREFТолько без камеры
GPIO15Камера: XCLKТолько без камеры
GPIO16Камера: D7 (Y9)Только без камеры
GPIO17Камера: D6 (Y8)Только без камеры
GPIO18Камера: D5 (Y7)Только без камеры
GPIO8Камера: D2 (Y4)Только без камеры
GPIO3Страпинг-пин; ADC1, Touch3С осторожностью
GPIO46Страпинг-пин режима загрузкиС осторожностью
GPIO9Камера: D1 (Y3)Только без камеры
GPIO10Камера: D3 (Y5)Только без камеры
GPIO11Камера: D0 (Y2)Только без камеры
GPIO12Камера: D4 (Y6)Только без камеры
GPIO13Камера: PCLKТолько без камеры
GPIO14Свободен; ADC2, Touch14Да
5VШина 5 ВНе GPIO

Правая гребёнка, сверху вниз

ВыводЧто на нёмМожно ли занять
TX (GPIO43)UART0 TX, к мосту USB–UARTТолько без правого разъёма
RX (GPIO44)UART0 RX, от моста USB–UARTТолько без правого разъёма
GPIO1Свободен; ADC1, Touch1Да — лучший аналоговый вход
GPIO2Светодиод IO2; ADC1, Touch2С учётом светодиода
GPIO42Свободен; MTMS внешнего JTAGДа
GPIO41Свободен; MTDI внешнего JTAGДа
GPIO40microSD: D0; MTDO внешнего JTAGТолько без карты
GPIO39microSD: CLK; MTCK внешнего JTAGТолько без карты
GPIO38microSD: CMDТолько без карты
GPIO37Octal PSRAM внутри модуляНикогда
GPIO36Octal PSRAM внутри модуляНикогда
GPIO35Octal PSRAM внутри модуляНикогда
GPIO0Кнопка BOOT, страпинг-пинС осторожностью
GPIO45Страпинг-пин: напряжение питания памятиЛучше не трогать
GPIO48RGB-светодиод, совместимый с WS2812С учётом светодиода
GPIO47СвободенДа
GPIO21СвободенДа
GPIO20Нативный USB: D+ (левый разъём)Только без нативного USB
GPIO19Нативный USB: D− (левый разъём)Только без нативного USB
GNDЗемляНе GPIO

Выводы 35–37 выведены на гребёнку, но пользоваться ими нельзя: в модулях с Octal PSRAM они внутри подключены к памяти, и любой внешний сигнал на них мешает её работе.

36 GPIO — и сколько из них ваших

Если свести всё вместе, картина получается отрезвляющая:

Кем занятоGPIOПравило
Камера4–13, 15–18Заняты, пока камера включена
microSD38–40Заняты, пока смонтирована карта
Octal PSRAM35–37Не использовать никогда
Нативный USB19, 20Свободны, только если не нужен левый разъём
UART0 и мост USB–UART43, 44Свободны, только если не нужен правый разъём
Светодиоды на плате2, 48Можно, если светодиод не мешает
Страпинг-пины0, 3, 45, 46Только когда понятны уровни при сбросе
Ничем не заняты1, 14, 21, 41, 42, 47Первый выбор для своей схемы

Итого при работающих камере и карте памяти без оговорок свободны шесть выводов: GPIO1, 14, 21, 41, 42 и 47. Для I²C-датчика, пары кнопок и реле этого достаточно, для развесистой периферии — уже нет. Ещё пару выводов можно отвоевать, отказавшись от одного из USB-путей: если плата работает только через правый разъём, освобождаются GPIO19 и GPIO20. Если только через левый — можно попробовать GPIO43 и GPIO44, помня, что они по-прежнему соединены с мостом USB–UART.

С аналоговыми входами тоньше. У ESP32-S3 ADC1 — это GPIO1–10, ADC2 — GPIO11–20. Камера забирает почти все выводы ADC1, поэтому при работающей камере единственный чистый аналоговый вход — GPIO1. GPIO2 и GPIO3 тоже относятся к ADC1, но на первом висит светодиод, а второй — страпинг-пин. GPIO14 принадлежит ADC2, а ADC2 делит ресурсы с Wi‑Fi: пока работает радио, чтение может задерживаться или завершаться ошибкой. Для датчиков в проекте с Wi‑Fi выбирайте ADC1. Сенсорные входы Touch1–Touch14 живут на GPIO1–14, но без оговорок из них свободны только GPIO1 и GPIO14.

И четыре правила про страпинг-пины, которые экономят вечер:

  1. GPIO0 — это кнопка BOOT. Если при сбросе на нём низкий уровень, чип входит в режим загрузки вместо запуска программы. Внешняя схема не должна прижимать GPIO0 к земле во время старта.
  2. GPIO46 по умолчанию подтянут к земле и выбирает режим загрузки вместе с GPIO0. Сочетание «низкий уровень на GPIO0, высокий на GPIO46» при сбросе недопустимо.
  3. GPIO45 задаёт напряжение питания памяти: низкий уровень при сбросе — 3,3 В, высокий — 1,8 В. Flash и PSRAM этого модуля рассчитаны на 3,3 В, поэтому высокий уровень на GPIO45 во время сброса недопустим. По умолчанию вывод подтянут к земле — так его и стоит оставить.
  4. GPIO3 выбирает источник сигналов JTAG, но только если в eFuse прожжён соответствующий бит; на модуле с заводскими настройками его уровень игнорируется. Espressif всё равно числит его среди страпинг-пинов, поэтому под первую же кнопку его лучше не брать.

Камера: OV5640 и правильная карта пинов

Камера подключена по параллельной шине DVP: восемь линий данных, три линии синхронизации, тактовая частота XCLK и пара линий SCCB для настройки сенсора — всего 14 GPIO. Выводы PWDN и RESET на плате не разведены, в конфигурации для них указывают -1.

Главная ловушка — чужая карта пинов. Самые популярные примеры в интернете написаны для AI-Thinker ESP32-CAM, а её номера GPIO на ESP32-S3 указывают, среди прочего, на выводы 26–32, которые у S3 отданы внутренней памяти, и на номера 22–25, которых у S3 нет вовсе. Зато разводка этой платы один в один совпадает с Espressif ESP32-S3-EYE, для которой в Arduino уже всё описано.

В примере CameraWebServer (File → Examples → ESP32 → Camera) модель выбирается в файле board_config.h. По умолчанию там включена CAMERA_MODEL_ESP_EYE — это другая плата, на старом ESP32. Её строку нужно закомментировать и раскомментировать CAMERA_MODEL_ESP32S3_EYE. Пины этой модели в camera_pins.h выглядят так — ровно как на нашей плате:

#define PWDN_GPIO_NUM  -1
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM  15
#define SIOD_GPIO_NUM  4
#define SIOC_GPIO_NUM  5

#define Y2_GPIO_NUM 11
#define Y3_GPIO_NUM 9
#define Y4_GPIO_NUM 8
#define Y5_GPIO_NUM 10
#define Y6_GPIO_NUM 12
#define Y7_GPIO_NUM 18
#define Y8_GPIO_NUM 17
#define Y9_GPIO_NUM 16

#define VSYNC_GPIO_NUM 6
#define HREF_GPIO_NUM  7
#define PCLK_GPIO_NUM  13

Для этой модели пример сам переворачивает картинку по вертикали вызовом set_vflip. Если кадр окажется вверх ногами, достаточно переключить V-Flip в веб-интерфейсе; там же повышается разрешение — поток стартует в QVGA. А вот отсутствие PSRAM пример переживает молча: если psramFound() вернул false, размер кадра ограничивается SVGA, а буфер переезжает во внутреннюю память. Камера при этом работает, но далеко не в полную силу.

Если поток остаётся чёрным

С OV5640 на этой плате есть известная неприятность. Владельцы таких плат сообщали: пример инициализирует камеру без ошибок, OV2640 на той же плате работает, а OV5640 отдаёт чёрный кадр. Судя по их отчётам, помогает смена тактовой частоты XCLK — вместо стандартных 20 МГц ставят 24 МГц или 12 МГц. В setup() меняется одна строка, xclk_freq_hz; остальные поля показывают, с чем её обычно сочетают:

camera_config_t config;
// ... pins as in camera_pins.h ...
config.xclk_freq_hz = 24000000;   // 20 MHz gave black frames on some OV5640 boards; 12 MHz is the other reported fix
config.pixel_format = PIXFORMAT_JPEG;
config.frame_size   = FRAMESIZE_UXGA;
config.jpeg_quality = 10;
config.fb_location  = CAMERA_FB_IN_PSRAM;
config.fb_count     = 2;
config.grab_mode    = CAMERA_GRAB_LATEST;

Если не помогло, стоит проверить, до конца ли шлейф вставлен в разъём и защёлкнут ли фиксатор, а также не перегревается ли плата: в тех же обсуждениях советуют не держать её с работающей камерой в закрытом корпусе без вентиляции. Полное разрешение сенсора — FRAMESIZE_5MP, 2592 × 1944 — доступно только в JPEG.

Настройки Arduino IDE

Отдельный пакет плате не нужен: подходит стандартный профиль ESP32S3 Dev Module из arduino-esp32. Главное — правильно указать память, от этого зависит, увидит ли программа PSRAM.

ПараметрЗначениеПочему
BoardESP32S3 Dev ModuleУниверсальный профиль для ESP32-S3
Flash Size16MB (128Mb)Реальный объём Flash модуля N16R8
Flash ModeQIO 80MHzFlash здесь подключена по Quad SPI; режим OPI 80MHz предназначен для модулей с Octal Flash
PSRAMOPI PSRAMPSRAM подключена по Octal SPI; с QSPI PSRAM или Disabled программа её не найдёт
Partition Scheme16M Flash (3MB APP/9.9MB FATFS)CameraWebServer требует не меньше 3 МБ под приложение, остальное уходит под файлы
USB CDC On BootDisabled — работа через правый разъём, Enabled — через левыйОпределяет, в какой порт идёт Serial
USB ModeHardware CDC and JTAGВстроенный USB-Serial-JTAG; режим USB-OTG (TinyUSB) нужен для собственных USB-устройств
Upload ModeUART0 / Hardware CDCПрошивка через любой из двух разъёмов

Если прошивка перестала загружаться — например, программа перенастроила нативный USB или ушла в циклические перезагрузки, — плату переводят в загрузчик вручную: зажать BOOT, коротко нажать EN, отпустить BOOT и повторить загрузку. Для правого разъёма компьютеру может понадобиться драйвер моста USB–UART. У оригинальной платы Freenove это CH343, у клонов встречаются и другие микросхемы, поэтому ориентироваться стоит на то, что показывает диспетчер устройств. Левый разъём современные системы распознают как последовательный порт без отдельного драйвера.

microSD, светодиоды и кнопки

Слот microSD подключён по SDMMC в однобитном режиме: CMD — GPIO38, CLK — GPIO39, D0 — GPIO40. Это медленнее четырёхбитного режима, зато экономит три вывода. Две из трёх линий совпадают со штатными выводами внешнего JTAG (MTCK и MTDO), поэтому карта и внешний отладчик мешают друг другу — с картой удобнее отлаживаться через левый USB-разъём.

Светодиодов пять. ON показывает питание, TX и RX мигают при обмене через мост USB–UART, IO2 — пользовательский светодиод на GPIO2, а 48 — адресный RGB-светодиод, совместимый с WS2812, на GPIO48. В профиле ESP32S3 Dev Module макросы LED_BUILTIN и RGB_BUILTIN указывают именно на него, поэтому стандартный Blink зажжёт RGB-светодиод белым. Цвет задаёт функция rgbLedWrite(), а прежняя neopixelWrite() объявлена устаревшей.

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

#include "SD_MMC.h"

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

  // One-bit SDMMC: CLK, CMD, D0
  SD_MMC.setPins(39, 38, 40);

  if (SD_MMC.begin("/sdcard", true)) {
    Serial.printf("microSD: %llu MB\n", SD_MMC.cardSize() / (1024 * 1024));
    rgbLedWrite(RGB_BUILTIN, 0, 32, 0);   // green: card mounted
  } else {
    Serial.println("microSD: mount failed");
    rgbLedWrite(RGB_BUILTIN, 32, 0, 0);   // red: no card
  }
}

void loop() {}

Питание и нагрев

Плату питают через любой USB‑C или через вывод 5V. Вывод 3V3 — это выход стабилизатора платы, от него можно питать маломощные датчики на 3,3 В. GPIO работают только с уровнем 3,3 В: 5-вольтовый сигнал на входе может повредить модуль, а абсолютный максимум его питания — 3,6 В.

Камера, передача по Wi‑Fi и запись на карту дают пики тока. Даташит модуля требует от источника питания не меньше 0,5 А, и слабый USB-порт или тонкий длинный кабель легко проваливают это требование. Симптомы узнаваемы: плата перезагружается в момент старта потока, а в логе появляется сообщение детектора пониженного напряжения — brownout. Лечится это коротким качественным кабелем и нормальным блоком питания на 5 В.

Второе ограничение менее очевидно — температура. Модули с Octal PSRAM, включая N16R8, рассчитаны на окружающую температуру до 65 °C, тогда как варианты без PSRAM — до 85 °C. Espressif оговаривает, что с включённой коррекцией ошибок PSRAM (ECC) предел поднимается до 85 °C ценой 1/16 объёма памяти. Камера и радио постоянно греют плату, поэтому в закрытом корпусе на солнце этот запас кончается быстро — вентиляционные отверстия лучше предусмотреть заранее.

Что на ней собрать: три показательных сценария

1. Камера для 3D-принтера

Посмотреть издалека, как идёт печать, и заодно собрать таймлапс — самый естественный сценарий для такой платы. Проект Prusa-Firmware-ESP32-Cam, прошивка для подключения камеры к сервису Prusa Connect, отдельно описывает плату Freenove ESP32-S3-WROOM. Проверены там модули OV2640, так что совместимость с OV5640 придётся выяснять самостоятельно, но раскладка платы та же.

2. Таймлапс-регистратор со своей картой

Слот microSD превращает плату в автономный регистратор: проснуться по таймеру, сделать JPEG-снимок, записать его на карту и снова уснуть. Так снимают рост растений, стройку за окном или долгий процесс в мастерской. Для питания от аккумулятора плата, правда, не оптимизирована: светодиод ON горит постоянно, а вывод PWDN камеры не разведён, так что аппаратно обесточить сенсор нельзя — остаётся только программный режим ожидания через SCCB. Ток во сне будет заметно выше, чем у голого модуля; для таймлапса с питанием от сети это неважно, для батарейного — существенно.

3. USB-вебкамера и зрение на самом устройстве

Нативный USB позволяет ESP32-S3 представиться компьютеру веб-камерой. В esp-iot-solution от Espressif есть пример usb_webcam: плата становится UVC-устройством и отдаёт MJPEG, а в списке режимов примера есть 1280 × 720 при 15 кадрах в секунду. Собирается он по умолчанию для ESP32-S3-EYE, то есть для той же карты пинов, что у этой платы. Второе направление — обработка кадра прямо на устройстве: фреймворк ESP-WHO от Espressif ориентирован на ESP32-S3 и умеет, например, находить лица без всякого облака.

Сильные и слабые стороны

ПлюсыМинусы
Два USB‑C: прошивка без адаптера и нативный USBРазъёмы подписаны только на обороте, их легко перепутать
16 МБ Flash и 8 МБ Octal PSRAMМодули с Octal PSRAM рассчитаны только до 65 °C
Сменная камера на 5 МпС OV5640 бывает чёрный кадр, приходится подбирать частоту XCLK
Слот microSD прямо на платеКарта занимает три вывода и конфликтует с внешним JTAG
Все 36 GPIO модуля на гребёнках, занятые помечены на шелкографииБез оговорок свободны только шесть выводов
Карта пинов совпадает с ESP32-S3-EYE, готовые примеры подходят с минимальной правкойДля батарейных устройств не оптимизирована: PWDN не разведён, светодиод питания горит всегда
Пользовательский и RGB-светодиоды на платеПартии различаются камерой и мостом USB–UART

Итог

ESP32-S3-CAM N16R8 — это ESP32-CAM, у которой вылечили почти все детские болезни: нормальный USB, много памяти, сменная камера на 5 Мп и честная маркировка занятых выводов прямо на плате. Для камеры в мастерской, таймлапса, наблюдения за 3D-принтером или экспериментов с машинным зрением это очень удобная основа.

Цена удобства — плотная упаковка. Камера и карта памяти съедают почти все выводы, PSRAM нужно включить правильно, а OV5640 может потребовать подбора частоты. Перед первой прошивкой полезно пройтись по короткому списку:

  1. Профиль ESP32S3 Dev Module: Flash 16 МБ, QIO 80MHz, PSRAM — OPI PSRAM.
  2. Карта пинов — CAMERA_MODEL_ESP32S3_EYE, а не AI-Thinker.
  3. Кадровые буферы — в PSRAM, формат — JPEG.
  4. microSD — однобитный SDMMC на GPIO38, 39 и 40.
  5. Кабель — в тот разъём, который соответствует настройке USB CDC On Boot.
  6. Новые выводы — сначала из списка GPIO1, 14, 21, 41, 42 и 47.
  7. GPIO0, 3, 45 и 46 — без внешних цепей, которые меняют их уровень при сбросе.

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