ESP32-S3-CAM N16R8: la placa de cámara que debió ser la ESP32-CAM

La ESP32-CAM clásica de AI-Thinker puso una cámara con Wi‑Fi al alcance de casi cualquiera y, de paso, enseñó a toda una generación de makers a tener paciencia. No tiene puerto USB: cada grabación del firmware exige un adaptador USB–UART externo y un jumper en GPIO0. De sus 16 pines, los libres se cuentan con los dedos de una mano, y el LED del flash parpadea cada vez que el programa escribe en la tarjeta de memoria.

La placa de este artículo es la misma idea, pero bien acabada. Lleva un ESP32-S3 con 16 MB de Flash y 8 MB de PSRAM, una cámara OV5640 de 5 MP, una ranura microSD, dos conectores USB‑C y los 36 GPIO del módulo sacados a las tiras de pines. Solo hay una pega: con la cámara y la tarjeta de memoria en marcha, los pines realmente libres se quedan en seis. A continuación tienes un mapa detallado de la placa: qué va conectado a qué, de qué se encarga cada conector, qué pines puedes ocupar y cómo configurar Arduino IDE para que la cámara no se convierta en una odisea.

Patillaje de la ESP32-S3 WROOM CAM. Tira izquierda, de arriba abajo: 3V3, EN, GPIO4, 5, 6, 7, 15, 16, 17, 18, 8, 3, 46, 9, 10, 11, 12, 13, 14, 5V. Tira derecha: GPIO43 (TX), 44 (RX), 1, 2, 42, 41, 40, 39, 38, 37, 36, 35, 0, 45, 48, 47, 21, 20, 19, GND. Las etiquetas de colores señalan la cámara, la microSD, la PSRAM, el USB, el UART, el JTAG, el ADC y las entradas táctiles.
ESP32-S3 WROOM CAM: las dos tiras de pines y la función de cada pin. Pulsa para ver la versión a tamaño completo.

De qué placa se habla exactamente

En las tiendas esta placa aparece con nombres distintos: ESP32-S3-CAM, ESP32-S3 WROOM CAM, ESP32-S3 CAM Development Board. En la propia placa pone, con modestia, ESP32-S3 WROOM, y en el blindaje metálico del módulo, ESP32-S3-N16R8. Ese marcado es justo la característica clave: N16 significa 16 MB de Flash y R8, 8 MB de PSRAM. El módulo en sí es un ESP32-S3-WROOM-1 con antena impresa en la PCB.

El trazado copia el de la Freenove ESP32-S3-WROOM CAM: el mismo sitio para la cámara, los mismos pines, dos botones y dos USB‑C. Freenove suministra su placa con una cámara OV2640 de 2 MP, pero la unidad de este artículo lleva una OV5640 de 5 MP, como indica la inscripción del cable plano. Estas placas salen de fábricas distintas, y de un lote a otro pueden cambiar el módulo de cámara y el puente USB–UART. Antes de buscar un controlador o un ejemplo ajeno, conviene mirar el marcado de tu propia unidad.

Características técnicas

ElementoCaracterísticaQué significa en la práctica
MóduloESP32-S3-WROOM-1-N16R8, antena impresa en la PCBMódulo de Espressif listo para usar, de 18 × 25,5 × 3,1 mm; sus 36 GPIO salen todos a las tiras de pines
Procesador2 núcleos Xtensa LX7, hasta 240 MHz, FPUDa para la transmisión JPEG, el Wi‑Fi y la lógica de la aplicación a la vez; tiene instrucciones para acelerar redes neuronales y procesamiento de señales
Memoria del SoC512 KB de SRAM, 384 KB de ROMLa memoria interna no basta para los fotogramas de la cámara: su sitio está en la PSRAM
Flash16 MB, Quad SPIHay sitio para una aplicación grande, OTA y un sistema de archivos
PSRAM8 MB, Octal SPI (OPI)Búferes de fotograma de la cámara; en Arduino IDE hace falta el modo OPI PSRAM
Wi‑Fi2,4 GHz, 802.11 b/g/n, hasta 150 Mbit/sTransmisión MJPEG, envío de fotos, actualizaciones por el aire
BluetoothBluetooth 5 (LE), mesh, velocidades de hasta 2 Mbit/s y modo Long RangeSolo BLE: el ESP32-S3 no tiene Bluetooth clásico, así que no hay SPP ni A2DP
CámaraOV5640, 5 MP (2592 × 1944), bus DVP de 8 bits, configuración por SCCBEl propio sensor comprime el fotograma a JPEG; el bus ocupa 14 GPIO
Conector de la cámaraFPC, 24 contactosEl módulo de cámara es intercambiable: sirven módulos del mismo estándar
Tarjeta de memoriamicroSD, SDMMC en modo de un bitLas fotos y los timelapses se guardan en la propia placa; la ranura ocupa GPIO38–40
USBDos USB‑C: puente USB–UART en UART0 y el USB nativo del propio ESP32-S3La grabación y los logs, por el conector derecho; los dispositivos USB y la depuración, por el izquierdo
GPIO36 pines en dos tiras de 20 contactosSeis están libres sin reservas; algunos más, con condiciones
Indicadores y botonesLED ON, TX, RX, IO2 (GPIO2) y RGB WS2812 (GPIO48); botones EN y BOOT (GPIO0)Hay LED que hacer parpadear y botones que pulsar sin componentes externos
Alimentación5 V por USB‑C o por el pin 5V; en el pin 3V3, 3,3 V del regulador de la placaEl módulo necesita una fuente de al menos 0,5 A
Niveles lógicos3,3 V; los GPIO no toleran 5 VUna señal de 5 V solo se conecta con adaptación de niveles
Temperatura de trabajo−40…+65 °C (módulos con Octal PSRAM)Menos que los 85 °C de los módulos sin PSRAM; importa dentro de una caja cerrada
Entornos de desarrolloArduino IDE, PlatformIO, ESP-IDF; MicroPython, con una compilación que incluya el controlador de la cámaraArduino es más cómodo para empezar rápido; ESP-IDF, para un proyecto serio

Un poco de aritmética. Un fotograma de 5 MP en formato RGB565 ocupa 2592 × 1944 × 2 = 10 077 696 bytes, es decir, unos 9,6 MiB. Eso supera los 8 MB enteros de PSRAM, así que la resolución completa solo está disponible en JPEG, que el propio sensor se encarga de comprimir. Un fotograma UXGA de 1600 × 1200 en el mismo RGB565 pesa unos 3,7 MiB y ese sí cabe. En la práctica, la cámara casi siempre se usa en JPEG: necesita menos memoria y es más fácil de enviar por Wi‑Fi.

Dos USB‑C: de qué se encarga cada conector

En el anverso los conectores no están rotulados: las etiquetas USB-UART y USB-OTG están en el reverso. De ahí sale la clásica trampa del espejo: al dar la vuelta a la placa para ponerla boca arriba, la etiqueta de la izquierda queda bajo el conector derecho. Mirando la placa desde el lado de la cámara, con la antena arriba, el reparto es este:

ConectorQué hay detrásPara qué usarlo
Izquierdo, USB-OTGEl USB nativo del propio ESP32-S3: GPIO19 es D−, GPIO20 es D+. USB-Serial-JTAG integrado o USB OTGDepuración sin adaptador externo y dispositivos USB propios: teclado, ratón, MIDI, almacenamiento, cámara web
Derecho, USB-UARTPuente USB–UART conectado a UART0: GPIO43 es TX, GPIO44 es RXGrabación y Serial Monitor: la vía más previsible

Qué puerto recibe la salida de Serial lo decide el ajuste USB CDC On Boot de Arduino IDE. Con Disabled, Serial es UART0 y los mensajes salen por el conector derecho. Con Enabled, Serial se muda al USB nativo, es decir, al izquierdo. Si el monitor serie no muestra nada, lo primero es revisar justo este ajuste y en qué conector está enchufado el cable. Los mensajes del gestor de arranque de la ROM salen por defecto por los dos puertos.

El conector izquierdo tiene además una ventaja menos evidente. El controlador USB-Serial-JTAG integrado en el ESP32-S3 permite depurar el programa con puntos de interrupción sin adaptador externo y sin gastar ni un solo pin más. Aquí eso es especialmente valioso, porque en esta placa los pines por defecto del JTAG externo (GPIO39–42) están ocupados en parte por la tarjeta de memoria.

Tiras de pines: repaso de cada pin

En las tablas, la placa está con los componentes hacia arriba, la antena en la parte superior y los conectores USB en la inferior. Los números de la serigrafía llevan símbolos: los pines subrayados están ocupados por la cámara, la tilde marca los pines de la microSD y el asterisco, los de la PSRAM. La leyenda está impresa en el reverso.

Tira izquierda, de arriba abajo

PinQué lleva¿Se puede usar?
3V33,3 V del regulador de la placaNo es un GPIO
ENReinicio, botón EN; activo a nivel bajoNo
GPIO4Cámara: SIOD, datos SCCBSolo sin cámara
GPIO5Cámara: SIOC, reloj SCCBSolo sin cámara
GPIO6Cámara: VSYNCSolo sin cámara
GPIO7Cámara: HREFSolo sin cámara
GPIO15Cámara: XCLKSolo sin cámara
GPIO16Cámara: D7 (Y9)Solo sin cámara
GPIO17Cámara: D6 (Y8)Solo sin cámara
GPIO18Cámara: D5 (Y7)Solo sin cámara
GPIO8Cámara: D2 (Y4)Solo sin cámara
GPIO3Pin de strapping; ADC1, Touch3Con cuidado
GPIO46Pin de strapping del modo de arranqueCon cuidado
GPIO9Cámara: D1 (Y3)Solo sin cámara
GPIO10Cámara: D3 (Y5)Solo sin cámara
GPIO11Cámara: D0 (Y2)Solo sin cámara
GPIO12Cámara: D4 (Y6)Solo sin cámara
GPIO13Cámara: PCLKSolo sin cámara
GPIO14Libre; ADC2, Touch14Sí
5VRaíl de 5 VNo es un GPIO

Tira derecha, de arriba abajo

PinQué lleva¿Se puede usar?
TX (GPIO43)UART0 TX, hacia el puente USB–UARTSolo sin el conector derecho
RX (GPIO44)UART0 RX, desde el puente USB–UARTSolo sin el conector derecho
GPIO1Libre; ADC1, Touch1Sí, la mejor entrada analógica
GPIO2LED IO2; ADC1, Touch2Ojo con el LED
GPIO42Libre; MTMS del JTAG externoSí
GPIO41Libre; MTDI del JTAG externoSí
GPIO40microSD: D0; MTDO del JTAG externoSolo sin tarjeta
GPIO39microSD: CLK; MTCK del JTAG externoSolo sin tarjeta
GPIO38microSD: CMDSolo sin tarjeta
GPIO37Octal PSRAM dentro del móduloNunca
GPIO36Octal PSRAM dentro del móduloNunca
GPIO35Octal PSRAM dentro del móduloNunca
GPIO0Botón BOOT, pin de strappingCon cuidado
GPIO45Pin de strapping: tensión de alimentación de la memoriaMejor no tocarlo
GPIO48LED RGB compatible con WS2812Ojo con el LED
GPIO47LibreSí
GPIO21LibreSí
GPIO20USB nativo: D+ (conector izquierdo)Solo sin USB nativo
GPIO19USB nativo: D− (conector izquierdo)Solo sin USB nativo
GNDMasaNo es un GPIO

Los pines 35–37 salen a la tira, pero no se pueden usar: en los módulos con Octal PSRAM están conectados por dentro a la memoria, y cualquier señal externa en ellos interfiere en su funcionamiento.

36 GPIO, ¿y cuántos son tuyos?

Si se junta todo, el panorama es un jarro de agua fría:

Ocupado porGPIORegla
Cámara4–13, 15–18Ocupados mientras la cámara esté encendida
microSD38–40Ocupados mientras la tarjeta esté montada
Octal PSRAM35–37No usarlos nunca
USB nativo19, 20Libres solo si no necesitas el conector izquierdo
UART0 y puente USB–UART43, 44Libres solo si no necesitas el conector derecho
LED de la placa2, 48Se pueden usar si el LED no estorba
Pines de strapping0, 3, 45, 46Solo si tienes claros sus niveles al reiniciar
Nada1, 14, 21, 41, 42, 47Primera opción para tu propio circuito

En resumen, con la cámara y la tarjeta de memoria en marcha, quedan libres sin reservas seis pines: GPIO1, 14, 21, 41, 42 y 47. Para un sensor I²C, un par de botones y un relé es suficiente; para una maraña de periféricos, ya no. Se puede rescatar un par de pines más renunciando a una de las vías USB: si la placa trabaja solo por el conector derecho, quedan libres GPIO19 y GPIO20. Si solo usa el izquierdo, puedes probar con GPIO43 y GPIO44, sin olvidar que siguen conectados al puente USB–UART.

Con las entradas analógicas hay más matices. En el ESP32-S3, el ADC1 corresponde a GPIO1–10 y el ADC2, a GPIO11–20. La cámara se queda con casi todos los pines del ADC1, así que con la cámara en marcha la única entrada analógica limpia es GPIO1. GPIO2 y GPIO3 también pertenecen al ADC1, pero del primero cuelga un LED y el segundo es un pin de strapping. GPIO14 pertenece al ADC2, y el ADC2 comparte recursos con el Wi‑Fi: mientras la radio está activa, la lectura puede retrasarse o terminar en error. Para sensores en un proyecto con Wi‑Fi, elige el ADC1. Las entradas táctiles Touch1–Touch14 están en GPIO1–14, pero de ellas solo GPIO1 y GPIO14 quedan libres sin reservas.

Y cuatro reglas sobre los pines de strapping que te ahorran una tarde perdida:

  1. GPIO0 es el botón BOOT. Si está a nivel bajo durante el reinicio, el chip entra en modo de descarga en lugar de ejecutar el programa. El circuito externo no debe llevar GPIO0 a masa durante el arranque.
  2. GPIO46 tiene por defecto una resistencia de pull-down y, junto con GPIO0, selecciona el modo de arranque. La combinación «nivel bajo en GPIO0, alto en GPIO46» durante el reinicio no es válida.
  3. GPIO45 fija la tensión de alimentación de la memoria: nivel bajo durante el reinicio significa 3,3 V, y alto, 1,8 V. La Flash y la PSRAM de este módulo están diseñadas para 3,3 V, así que un nivel alto en GPIO45 durante el reinicio es inadmisible. Por defecto el pin tiene pull-down, y así conviene dejarlo.
  4. GPIO3 selecciona el origen de las señales JTAG, pero solo si se ha quemado el bit correspondiente del eFuse; en un módulo con la configuración de fábrica, su nivel se ignora. Aun así, Espressif lo cuenta entre los pines de strapping, así que mejor no reservarlo para el primer botón que se te ocurra.

La cámara: la OV5640 y el mapa de pines correcto

La cámara va conectada por un bus paralelo DVP: ocho líneas de datos, tres de sincronización, el reloj XCLK y un par de líneas SCCB para configurar el sensor, 14 GPIO en total. Los pines PWDN y RESET no están conectados en la placa, así que en la configuración se les asigna -1.

La trampa principal es un mapa de pines ajeno. Los ejemplos más populares de internet están escritos para la AI-Thinker ESP32-CAM, y en un ESP32-S3 sus números de GPIO apuntan, entre otros, a los pines 26–32, que en el S3 están reservados a la memoria interna, y a los números 22–25, que el S3 ni siquiera tiene. En cambio, el trazado de esta placa coincide punto por punto con la ESP32-S3-EYE de Espressif, que Arduino ya tiene descrita al completo.

En el ejemplo CameraWebServer (File → Examples → ESP32 → Camera), el modelo se elige en el archivo board_config.h. Por defecto ahí está activado CAMERA_MODEL_ESP_EYE, que es otra placa, basada en el ESP32 clásico. Hay que comentar su línea y descomentar CAMERA_MODEL_ESP32S3_EYE. En camera_pins.h, los pines de ese modelo quedan así, exactamente como en nuestra placa:

#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

Con este modelo, el ejemplo ya voltea la imagen en vertical por su cuenta con una llamada a set_vflip. Si el fotograma sale boca abajo, basta con cambiar V-Flip en la interfaz web; ahí mismo se sube la resolución, porque la transmisión arranca en QVGA. En cambio, el ejemplo tolera sin avisar que falte la PSRAM: si psramFound() devuelve false, el tamaño del fotograma se limita a SVGA y el búfer se muda a la memoria interna. La cámara funciona igualmente, pero muy lejos de su máximo.

Si la transmisión se queda en negro

La OV5640 da un problema conocido en esta placa. Propietarios de estas placas han contado que el ejemplo inicializa la cámara sin errores, que una OV2640 funciona en esa misma placa y que la OV5640, en cambio, entrega un fotograma negro. Según sus informes, lo que ayuda es cambiar la frecuencia del reloj XCLK: en lugar de los 20 MHz estándar, ponen 24 MHz o 12 MHz. En setup() cambia una sola línea, xclk_freq_hz; los demás campos muestran con qué se suele combinar:

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;

Si eso no ayuda, conviene comprobar que el cable plano esté metido hasta el fondo en el conector y con el cierre bajado, y que la placa no se esté sobrecalentando: en esos mismos hilos aconsejan no tenerla con la cámara en marcha dentro de una caja cerrada y sin ventilación. La resolución completa del sensor, FRAMESIZE_5MP (2592 × 1944), solo está disponible en JPEG.

Ajustes de Arduino IDE

La placa no necesita un paquete propio: sirve el perfil estándar ESP32S3 Dev Module de arduino-esp32. Lo principal es indicar bien la memoria, porque de eso depende que el programa vea la PSRAM.

AjusteValorPor qué
BoardESP32S3 Dev ModulePerfil genérico para ESP32-S3
Flash Size16MB (128Mb)Tamaño real de la Flash del módulo N16R8
Flash ModeQIO 80MHzAquí la Flash va por Quad SPI; el modo OPI 80MHz es para módulos con Octal Flash
PSRAMOPI PSRAMLa PSRAM va por Octal SPI; con QSPI PSRAM o Disabled el programa no la encontrará
Partition Scheme16M Flash (3MB APP/9.9MB FATFS)CameraWebServer necesita al menos 3 MB para la aplicación; el resto queda para archivos
USB CDC On BootDisabled para trabajar por el conector derecho, Enabled por el izquierdoDecide a qué puerto va Serial
USB ModeHardware CDC and JTAGUSB-Serial-JTAG integrado; el modo USB-OTG (TinyUSB) hace falta para dispositivos USB propios
Upload ModeUART0 / Hardware CDCGrabación por cualquiera de los dos conectores

Si ya no consigues subir el firmware (por ejemplo, porque el programa ha reconfigurado el USB nativo o ha entrado en un bucle de reinicios), la placa se pasa a mano al gestor de arranque: mantener pulsado BOOT, pulsar brevemente EN, soltar BOOT y repetir la carga. Para el conector derecho, el ordenador puede necesitar el controlador del puente USB–UART. En la placa original de Freenove es un CH343, pero en los clones aparecen también otros chips, así que conviene guiarse por lo que muestra el Administrador de dispositivos. Los sistemas actuales reconocen el conector izquierdo como puerto serie sin necesidad de un controlador aparte.

microSD, LED y botones

La ranura microSD va conectada por SDMMC en modo de un bit: CMD en GPIO38, CLK en GPIO39 y D0 en GPIO40. Es más lento que el modo de cuatro bits, pero ahorra tres pines. Dos de las tres líneas coinciden con los pines por defecto del JTAG externo (MTCK y MTDO), así que la tarjeta y un depurador externo se estorban entre sí; con tarjeta, es más cómodo depurar por el conector USB izquierdo.

Hay cinco LED. ON indica que hay alimentación, TX y RX parpadean con el tráfico por el puente USB–UART, IO2 es un LED de usuario en GPIO2 y 48 es un LED RGB direccionable compatible con WS2812 en GPIO48. En el perfil ESP32S3 Dev Module, las macros LED_BUILTIN y RGB_BUILTIN apuntan precisamente a este último, así que el Blink de siempre encenderá el LED RGB en blanco. El color se fija con la función rgbLedWrite(); la antigua neopixelWrite() está declarada obsoleta.

El botón EN reinicia el módulo; BOOT está conectado a GPIO0 y sirve para entrar a mano en el gestor de arranque. Una vez arrancado el programa, BOOT se puede leer como un botón normal. Como autoprueba rápida de la placa, basta con montar la tarjeta e indicar el resultado con un color:

#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() {}

Alimentación y calentamiento

La placa se alimenta por cualquiera de los dos USB‑C o por el pin 5V. El pin 3V3 es la salida del regulador de la placa y puede alimentar sensores de bajo consumo a 3,3 V. Los GPIO solo trabajan con niveles de 3,3 V: una señal de 5 V en una entrada puede dañar el módulo, cuya tensión de alimentación máxima absoluta es de 3,6 V.

La cámara, la transmisión por Wi‑Fi y la escritura en la tarjeta provocan picos de corriente. La hoja de datos del módulo exige una fuente de alimentación de al menos 0,5 A, y un puerto USB flojo o un cable largo y fino se quedan cortos con facilidad. Los síntomas son reconocibles: la placa se reinicia justo al arrancar la transmisión y en el log aparece un mensaje del detector de baja tensión (brownout). Se soluciona con un cable corto y de calidad y una fuente de alimentación de 5 V como es debido.

La segunda limitación es menos evidente: la temperatura. Los módulos con Octal PSRAM, incluido el N16R8, están especificados para una temperatura ambiente de hasta 65 °C, mientras que las variantes sin PSRAM llegan a 85 °C. Espressif precisa que, con la corrección de errores de la PSRAM (ECC) activada, el límite sube a 85 °C a costa de 1/16 de la memoria. La cámara y la radio calientan la placa sin parar, así que dentro de una caja cerrada y al sol ese margen se agota enseguida: mejor prever orificios de ventilación desde el principio.

Qué construir con ella: tres casos ilustrativos

1. Una cámara para la impresora 3D

Ver desde lejos cómo va la impresión y, de paso, montar un timelapse es el uso más natural de una placa así. El proyecto Prusa-Firmware-ESP32-Cam, un firmware para conectar una cámara al servicio Prusa Connect, dedica un apartado propio a la placa Freenove ESP32-S3-WROOM. Allí se han probado módulos OV2640, así que la compatibilidad con la OV5640 tendrás que comprobarla por tu cuenta, pero la disposición de la placa es la misma.

2. Un registrador de timelapse con su propia tarjeta

La ranura microSD convierte la placa en un registrador autónomo: despertar con un temporizador, tomar una foto JPEG, guardarla en la tarjeta y volver a dormir. Así se filma cómo crecen las plantas, la obra que se ve por la ventana o un proceso largo en el taller. Eso sí, la placa no está optimizada para funcionar con batería: el LED ON está siempre encendido y el pin PWDN de la cámara no está conectado, así que no se puede cortar la alimentación del sensor por hardware; solo queda su modo de espera por software a través de SCCB. El consumo en reposo será bastante mayor que el de un módulo desnudo: para un timelapse enchufado a la red da igual, pero con baterías pesa mucho.

3. Cámara web USB y visión en el propio dispositivo

El USB nativo permite al ESP32-S3 presentarse ante el ordenador como una cámara web. En esp-iot-solution, de Espressif, hay un ejemplo, usb_webcam, en el que la placa se convierte en un dispositivo UVC que entrega MJPEG, y en la lista de modos del ejemplo figura 1280 × 720 a 15 fotogramas por segundo. Por defecto se compila para la ESP32-S3-EYE, es decir, para el mismo mapa de pines que tiene esta placa. La otra vía es procesar el fotograma en el propio dispositivo: el framework ESP-WHO de Espressif está pensado para el ESP32-S3 y sabe, por ejemplo, detectar caras sin depender de la nube.

Puntos fuertes y débiles

A favorEn contra
Dos USB‑C: grabación sin adaptador y USB nativoLos conectores solo están rotulados en el reverso y es fácil confundirlos
16 MB de Flash y 8 MB de Octal PSRAMLos módulos con Octal PSRAM solo están especificados hasta 65 °C
Cámara intercambiable de 5 MPCon la OV5640 a veces sale un fotograma negro y toca buscar la frecuencia de XCLK adecuada
Ranura microSD en la propia placaLa tarjeta ocupa tres pines y choca con el JTAG externo
Los 36 GPIO del módulo en las tiras, con los ocupados marcados en la serigrafíaSolo seis pines están libres sin reservas
El mapa de pines coincide con el de la ESP32-S3-EYE, así que los ejemplos ya hechos sirven con un cambio mínimoNo está optimizada para equipos a batería: PWDN no está conectado y el LED de alimentación siempre está encendido
LED de usuario y LED RGB en la placaLos lotes varían en la cámara y en el puente USB–UART

Conclusión

La ESP32-S3-CAM N16R8 es una ESP32-CAM a la que se le han curado casi todos los problemas de juventud: USB como es debido, mucha memoria, una cámara intercambiable de 5 MP y un marcado honesto de los pines ocupados en la propia placa. Para una cámara de taller, un timelapse, vigilar una impresora 3D o experimentar con visión artificial, es una base muy cómoda.

El precio de esa comodidad es que todo va muy apretado. La cámara y la tarjeta de memoria se comen casi todos los pines, la PSRAM hay que activarla correctamente y la OV5640 puede obligar a ajustar la frecuencia. Antes de la primera grabación, conviene repasar una lista corta:

  1. Perfil ESP32S3 Dev Module: Flash de 16 MB, QIO 80MHz, PSRAM en OPI PSRAM.
  2. Mapa de pines: CAMERA_MODEL_ESP32S3_EYE, no el de AI-Thinker.
  3. Búferes de fotograma en la PSRAM y formato JPEG.
  4. microSD: SDMMC de un bit en GPIO38, 39 y 40.
  5. El cable, en el conector que corresponde al ajuste USB CDC On Boot.
  6. Pines nuevos: primero, los de la lista GPIO1, 14, 21, 41, 42 y 47.
  7. GPIO0, 3, 45 y 46, sin circuitos externos que cambien su nivel durante el reinicio.

Todo lo anterior, en un solo archivo: una referencia de los pines y de los límites de hardware de la placa. Viene bien tenerla junto al sketch o pasársela a un agente programador para que no se invente el patillaje.