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.

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
| Elemento | Característica | Qué significa en la práctica |
|---|---|---|
| Módulo | ESP32-S3-WROOM-1-N16R8, antena impresa en la PCB | Módulo de Espressif listo para usar, de 18 × 25,5 × 3,1 mm; sus 36 GPIO salen todos a las tiras de pines |
| Procesador | 2 núcleos Xtensa LX7, hasta 240 MHz, FPU | Da 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 SoC | 512 KB de SRAM, 384 KB de ROM | La memoria interna no basta para los fotogramas de la cámara: su sitio está en la PSRAM |
| Flash | 16 MB, Quad SPI | Hay sitio para una aplicación grande, OTA y un sistema de archivos |
| PSRAM | 8 MB, Octal SPI (OPI) | Búferes de fotograma de la cámara; en Arduino IDE hace falta el modo OPI PSRAM |
| Wi‑Fi | 2,4 GHz, 802.11 b/g/n, hasta 150 Mbit/s | Transmisión MJPEG, envío de fotos, actualizaciones por el aire |
| Bluetooth | Bluetooth 5 (LE), mesh, velocidades de hasta 2 Mbit/s y modo Long Range | Solo BLE: el ESP32-S3 no tiene Bluetooth clásico, así que no hay SPP ni A2DP |
| Cámara | OV5640, 5 MP (2592 × 1944), bus DVP de 8 bits, configuración por SCCB | El propio sensor comprime el fotograma a JPEG; el bus ocupa 14 GPIO |
| Conector de la cámara | FPC, 24 contactos | El módulo de cámara es intercambiable: sirven módulos del mismo estándar |
| Tarjeta de memoria | microSD, SDMMC en modo de un bit | Las fotos y los timelapses se guardan en la propia placa; la ranura ocupa GPIO38–40 |
| USB | Dos USB‑C: puente USB–UART en UART0 y el USB nativo del propio ESP32-S3 | La grabación y los logs, por el conector derecho; los dispositivos USB y la depuración, por el izquierdo |
| GPIO | 36 pines en dos tiras de 20 contactos | Seis están libres sin reservas; algunos más, con condiciones |
| Indicadores y botones | LED 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ón | 5 V por USB‑C o por el pin 5V; en el pin 3V3, 3,3 V del regulador de la placa | El módulo necesita una fuente de al menos 0,5 A |
| Niveles lógicos | 3,3 V; los GPIO no toleran 5 V | Una 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 desarrollo | Arduino IDE, PlatformIO, ESP-IDF; MicroPython, con una compilación que incluya el controlador de la cámara | Arduino 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:
| Conector | Qué hay detrás | Para qué usarlo |
|---|---|---|
| Izquierdo, USB-OTG | El USB nativo del propio ESP32-S3: GPIO19 es D−, GPIO20 es D+. USB-Serial-JTAG integrado o USB OTG | Depuración sin adaptador externo y dispositivos USB propios: teclado, ratón, MIDI, almacenamiento, cámara web |
| Derecho, USB-UART | Puente USB–UART conectado a UART0: GPIO43 es TX, GPIO44 es RX | Grabació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
| Pin | Qué lleva | ¿Se puede usar? |
|---|---|---|
| 3V3 | 3,3 V del regulador de la placa | No es un GPIO |
| EN | Reinicio, botón EN; activo a nivel bajo | No |
| GPIO4 | Cámara: SIOD, datos SCCB | Solo sin cámara |
| GPIO5 | Cámara: SIOC, reloj SCCB | Solo sin cámara |
| GPIO6 | Cámara: VSYNC | Solo sin cámara |
| GPIO7 | Cámara: HREF | Solo sin cámara |
| GPIO15 | Cámara: XCLK | Solo sin cámara |
| GPIO16 | Cámara: D7 (Y9) | Solo sin cámara |
| GPIO17 | Cámara: D6 (Y8) | Solo sin cámara |
| GPIO18 | Cámara: D5 (Y7) | Solo sin cámara |
| GPIO8 | Cámara: D2 (Y4) | Solo sin cámara |
| GPIO3 | Pin de strapping; ADC1, Touch3 | Con cuidado |
| GPIO46 | Pin de strapping del modo de arranque | Con cuidado |
| GPIO9 | Cámara: D1 (Y3) | Solo sin cámara |
| GPIO10 | Cámara: D3 (Y5) | Solo sin cámara |
| GPIO11 | Cámara: D0 (Y2) | Solo sin cámara |
| GPIO12 | Cámara: D4 (Y6) | Solo sin cámara |
| GPIO13 | Cámara: PCLK | Solo sin cámara |
| GPIO14 | Libre; ADC2, Touch14 | Sí |
| 5V | Raíl de 5 V | No es un GPIO |
Tira derecha, de arriba abajo
| Pin | Qué lleva | ¿Se puede usar? |
|---|---|---|
| TX (GPIO43) | UART0 TX, hacia el puente USB–UART | Solo sin el conector derecho |
| RX (GPIO44) | UART0 RX, desde el puente USB–UART | Solo sin el conector derecho |
| GPIO1 | Libre; ADC1, Touch1 | Sí, la mejor entrada analógica |
| GPIO2 | LED IO2; ADC1, Touch2 | Ojo con el LED |
| GPIO42 | Libre; MTMS del JTAG externo | Sí |
| GPIO41 | Libre; MTDI del JTAG externo | Sí |
| GPIO40 | microSD: D0; MTDO del JTAG externo | Solo sin tarjeta |
| GPIO39 | microSD: CLK; MTCK del JTAG externo | Solo sin tarjeta |
| GPIO38 | microSD: CMD | Solo sin tarjeta |
| GPIO37 | Octal PSRAM dentro del módulo | Nunca |
| GPIO36 | Octal PSRAM dentro del módulo | Nunca |
| GPIO35 | Octal PSRAM dentro del módulo | Nunca |
| GPIO0 | Botón BOOT, pin de strapping | Con cuidado |
| GPIO45 | Pin de strapping: tensión de alimentación de la memoria | Mejor no tocarlo |
| GPIO48 | LED RGB compatible con WS2812 | Ojo con el LED |
| GPIO47 | Libre | Sí |
| GPIO21 | Libre | Sí |
| GPIO20 | USB nativo: D+ (conector izquierdo) | Solo sin USB nativo |
| GPIO19 | USB nativo: D− (conector izquierdo) | Solo sin USB nativo |
| GND | Masa | No 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 por | GPIO | Regla |
|---|---|---|
| Cámara | 4–13, 15–18 | Ocupados mientras la cámara esté encendida |
| microSD | 38–40 | Ocupados mientras la tarjeta esté montada |
| Octal PSRAM | 35–37 | No usarlos nunca |
| USB nativo | 19, 20 | Libres solo si no necesitas el conector izquierdo |
| UART0 y puente USB–UART | 43, 44 | Libres solo si no necesitas el conector derecho |
| LED de la placa | 2, 48 | Se pueden usar si el LED no estorba |
| Pines de strapping | 0, 3, 45, 46 | Solo si tienes claros sus niveles al reiniciar |
| Nada | 1, 14, 21, 41, 42, 47 | Primera 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:
- 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.
- 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.
- 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.
- 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.
| Ajuste | Valor | Por qué |
|---|---|---|
| Board | ESP32S3 Dev Module | Perfil genérico para ESP32-S3 |
| Flash Size | 16MB (128Mb) | Tamaño real de la Flash del módulo N16R8 |
| Flash Mode | QIO 80MHz | Aquí la Flash va por Quad SPI; el modo OPI 80MHz es para módulos con Octal Flash |
| PSRAM | OPI PSRAM | La PSRAM va por Octal SPI; con QSPI PSRAM o Disabled el programa no la encontrará |
| Partition Scheme | 16M Flash (3MB APP/9.9MB FATFS) | CameraWebServer necesita al menos 3 MB para la aplicación; el resto queda para archivos |
| USB CDC On Boot | Disabled para trabajar por el conector derecho, Enabled por el izquierdo | Decide a qué puerto va Serial |
| USB Mode | Hardware CDC and JTAG | USB-Serial-JTAG integrado; el modo USB-OTG (TinyUSB) hace falta para dispositivos USB propios |
| Upload Mode | UART0 / Hardware CDC | Grabació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 favor | En contra |
|---|---|
| Dos USB‑C: grabación sin adaptador y USB nativo | Los conectores solo están rotulados en el reverso y es fácil confundirlos |
| 16 MB de Flash y 8 MB de Octal PSRAM | Los módulos con Octal PSRAM solo están especificados hasta 65 °C |
| Cámara intercambiable de 5 MP | Con la OV5640 a veces sale un fotograma negro y toca buscar la frecuencia de XCLK adecuada |
| Ranura microSD en la propia placa | La 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ía | Solo 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ínimo | No 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 placa | Los 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:
- Perfil ESP32S3 Dev Module: Flash de 16 MB, QIO 80MHz, PSRAM en OPI PSRAM.
- Mapa de pines:
CAMERA_MODEL_ESP32S3_EYE, no el de AI-Thinker. - Búferes de fotograma en la PSRAM y formato JPEG.
- microSD: SDMMC de un bit en GPIO38, 39 y 40.
- El cable, en el conector que corresponde al ajuste USB CDC On Boot.
- Pines nuevos: primero, los de la lista GPIO1, 14, 21, 41, 42 y 47.
- 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.