ESP32-S3-CAM N16R8: a placa de câmara que a ESP32-CAM devia ter sido
A clássica ESP32-CAM da AI-Thinker pôs uma câmara com Wi‑Fi ao alcance de quase toda a gente e, pelo caminho, ensinou paciência a toda uma geração de makers. Não tem porta USB: cada gravação do firmware exige um adaptador USB–UART externo e um jumper no GPIO0. Dos seus 16 pinos, os que ficam livres contam-se pelos dedos, e o LED do flash pisca sempre que o programa escreve no cartão de memória.
A placa deste artigo é a mesma ideia, mas finalmente bem resolvida. Traz um ESP32-S3 com 16 MB de Flash e 8 MB de PSRAM, uma câmara OV5640 de 5 MP, uma ranhura microSD, dois conectores USB‑C e os 36 GPIO do módulo, todos disponíveis nas filas de pinos. Há apenas um senão: com a câmara e o cartão de memória a trabalhar, os pinos realmente livres ficam reduzidos a seis. A seguir, um mapa detalhado da placa: o que está ligado a quê, que conector serve para quê, que pinos se podem ocupar e como configurar o Arduino IDE para que a câmara não se transforme num quebra-cabeças.

De que placa se fala exatamente
Nas lojas, esta placa aparece com vários nomes: ESP32-S3-CAM, ESP32-S3 WROOM CAM, ESP32-S3 CAM Development Board. Na própria placa lê-se apenas um modesto ESP32-S3 WROOM, e na blindagem metálica do módulo, ESP32-S3-N16R8. É precisamente essa marcação que revela a característica principal: N16 significa 16 MB de Flash e R8, 8 MB de PSRAM. O módulo propriamente dito é um ESP32-S3-WROOM-1 com antena impressa na placa.
O desenho copia o da placa Freenove ESP32-S3-WROOM CAM: o mesmo lugar para a câmara, os mesmos pinos, dois botões e dois USB‑C. A Freenove fornece a sua placa com uma câmara OV2640 de 2 MP, ao passo que o exemplar deste artigo traz uma OV5640 de 5 MP, como mostra a inscrição no cabo flexível. Placas destas saem de várias fábricas, e o módulo da câmara e a ponte USB–UART podem mudar de lote para lote. Antes de procurar um controlador ou o exemplo de outra pessoa, vale a pena ver a marcação do exemplar que se tem na mão.


Características técnicas
| Elemento | Característica | O que significa na prática |
|---|---|---|
| Módulo | ESP32-S3-WROOM-1-N16R8, antena impressa na placa | Módulo da Espressif já pronto, com 18 × 25,5 × 3,1 mm; os seus 36 GPIO estão todos nas filas de pinos |
| Processador | 2 núcleos Xtensa LX7, até 240 MHz, FPU | Chega para uma transmissão JPEG, o Wi‑Fi e a lógica da aplicação em simultâneo; tem instruções que aceleram redes neuronais e o processamento de sinal |
| Memória do SoC | 512 KB de SRAM, 384 KB de ROM | A memória interna não chega para os fotogramas da câmara: o lugar deles é na PSRAM |
| Flash | 16 MB, Quad SPI | Chega para uma aplicação grande, OTA e um sistema de ficheiros |
| PSRAM | 8 MB, Octal SPI (OPI) | Buffers de imagem da câmara; no Arduino IDE é preciso o modo OPI PSRAM |
| Wi‑Fi | 2,4 GHz, 802.11 b/g/n, até 150 Mbit/s | Transmissão de vídeo MJPEG, envio de fotografias, atualizações sem fios |
| Bluetooth | Bluetooth 5 (LE), mesh, velocidades até 2 Mbit/s e modo Long Range | Apenas BLE: o ESP32-S3 não tem Bluetooth clássico, logo nem SPP nem A2DP |
| Câmara | OV5640, 5 MP (2592 × 1944), barramento DVP de 8 bits, configuração por SCCB | O próprio sensor comprime o fotograma em JPEG; o barramento ocupa 14 GPIO |
| Conector da câmara | FPC, 24 contactos | O módulo da câmara é substituível: servem módulos do mesmo padrão |
| Cartão de memória | microSD, SDMMC em modo de 1 bit | As fotografias e os timelapses ficam gravados na própria placa; a ranhura ocupa os GPIO38–40 |
| USB | Dois USB‑C: ponte USB–UART ligada à UART0 e o USB nativo do próprio ESP32-S3 | Gravação do firmware e registos pelo conector direito; dispositivos USB e depuração pelo esquerdo |
| GPIO | 36 pinos em duas filas de 20 contactos | Seis estão livres sem restrições e mais alguns com condições |
| Indicadores e botões | LED ON, TX, RX, IO2 (GPIO2) e RGB WS2812 (GPIO48); botões EN e BOOT (GPIO0) | Já há luzes para piscar e botões para premir, sem peças externas |
| Alimentação | 5 V por USB‑C ou pelo pino 5V; no pino 3V3, 3,3 V do regulador da placa | O módulo precisa de uma fonte capaz de fornecer pelo menos 0,5 A |
| Níveis lógicos | 3,3 V; os GPIO não toleram 5 V | Um sinal de 5 V só se liga através de adaptação de níveis |
| Temperatura de funcionamento | −40…+65 °C (módulos com Octal PSRAM) | Abaixo dos 85 °C dos módulos sem PSRAM; numa caixa fechada, isto conta |
| Ambientes de desenvolvimento | Arduino IDE, PlatformIO, ESP-IDF; MicroPython, numa compilação que inclua o controlador da câmara | Para começar depressa, o Arduino é mais cómodo; para um projeto sério, o ESP-IDF |
Um pouco de aritmética. Um fotograma de 5 MP em formato RGB565 ocupa 2592 × 1944 × 2 = 10 077 696 bytes, ou seja, cerca de 9,6 MiB. É mais do que a totalidade dos 8 MB de PSRAM, pelo que a resolução completa só está disponível em JPEG, comprimido pelo próprio sensor. Um fotograma UXGA de 1600 × 1200 no mesmo RGB565 ocupa cerca de 3,7 MiB e já cabe. Na prática, a câmara trabalha quase sempre em JPEG: assim gasta menos memória e as imagens são mais fáceis de enviar por Wi‑Fi.
Dois USB‑C: que conector serve para quê
Na frente, os conectores não estão identificados: as inscrições USB-UART e USB-OTG estão no verso. Daí a clássica armadilha do espelho: ao virar a placa com a frente para cima, a inscrição da esquerda fica por baixo do conector da direita. Vista do lado da câmara, com a antena para cima, a placa fica assim:
| Conector | O que está por trás | Para que usar |
|---|---|---|
| Esquerdo, USB-OTG | USB nativo do próprio ESP32-S3: GPIO19 é D−, GPIO20 é D+. USB-Serial-JTAG incorporado ou USB OTG | Depuração sem adaptador externo e dispositivos USB próprios: teclado, rato, MIDI, unidade de armazenamento, câmara web |
| Direito, USB-UART | Ponte USB–UART ligada à UART0: GPIO43 é TX, GPIO44 é RX | Gravação e Serial Monitor: o caminho mais previsível |
A porta que recebe a saída de Serial é decidida pela opção USB CDC On Boot do Arduino IDE. Na posição Disabled, Serial é a UART0 e as mensagens saem pelo conector direito. Na posição Enabled, Serial passa para o USB nativo, ou seja, para o esquerdo. Se o monitor série ficar mudo, a primeira coisa a verificar é precisamente esta opção, e também o conector onde o cabo está ligado. Por predefinição, as mensagens do bootloader da ROM saem pelas duas portas.
O conector esquerdo tem ainda uma vantagem menos óbvia. O controlador USB-Serial-JTAG incorporado no ESP32-S3 permite depurar o programa com pontos de interrupção sem adaptador externo e sem gastar um único pino extra. Aqui isso é especialmente valioso, porque nesta placa os pinos predefinidos do JTAG externo (GPIO39–42) estão parcialmente ocupados pelo cartão de memória.
As filas de pinos: cada pino em detalhe
A orientação das tabelas é com os componentes virados para cima, a antena no topo e os conectores USB em baixo. Os números da serigrafia levam símbolos: os pinos sublinhados estão ocupados pela câmara, o til assinala os pinos do microSD e o asterisco os da PSRAM. A legenda destes símbolos está impressa no verso.
Fila esquerda, de cima para baixo
| Pino | Função na placa | Pode usar-se? |
|---|---|---|
| 3V3 | 3,3 V do regulador da placa | Não é um GPIO |
| EN | Reposição, botão EN; ativo a nível baixo | Não |
| GPIO4 | Câmara: SIOD, dados SCCB | Só sem a câmara |
| GPIO5 | Câmara: SIOC, relógio SCCB | Só sem a câmara |
| GPIO6 | Câmara: VSYNC | Só sem a câmara |
| GPIO7 | Câmara: HREF | Só sem a câmara |
| GPIO15 | Câmara: XCLK | Só sem a câmara |
| GPIO16 | Câmara: D7 (Y9) | Só sem a câmara |
| GPIO17 | Câmara: D6 (Y8) | Só sem a câmara |
| GPIO18 | Câmara: D5 (Y7) | Só sem a câmara |
| GPIO8 | Câmara: D2 (Y4) | Só sem a câmara |
| GPIO3 | Pino de strapping; ADC1, Touch3 | Com cuidado |
| GPIO46 | Pino de strapping do modo de arranque | Com cuidado |
| GPIO9 | Câmara: D1 (Y3) | Só sem a câmara |
| GPIO10 | Câmara: D3 (Y5) | Só sem a câmara |
| GPIO11 | Câmara: D0 (Y2) | Só sem a câmara |
| GPIO12 | Câmara: D4 (Y6) | Só sem a câmara |
| GPIO13 | Câmara: PCLK | Só sem a câmara |
| GPIO14 | Livre; ADC2, Touch14 | Sim |
| 5V | Barramento de 5 V | Não é um GPIO |
Fila direita, de cima para baixo
| Pino | Função na placa | Pode usar-se? |
|---|---|---|
| TX (GPIO43) | UART0 TX, para a ponte USB–UART | Só sem o conector direito |
| RX (GPIO44) | UART0 RX, da ponte USB–UART | Só sem o conector direito |
| GPIO1 | Livre; ADC1, Touch1 | Sim, a melhor entrada analógica |
| GPIO2 | LED IO2; ADC1, Touch2 | Atenção ao LED |
| GPIO42 | Livre; MTMS do JTAG externo | Sim |
| GPIO41 | Livre; MTDI do JTAG externo | Sim |
| GPIO40 | microSD: D0; MTDO do JTAG externo | Só sem o cartão |
| GPIO39 | microSD: CLK; MTCK do JTAG externo | Só sem o cartão |
| GPIO38 | microSD: CMD | Só sem o cartão |
| GPIO37 | Octal PSRAM dentro do módulo | Nunca |
| GPIO36 | Octal PSRAM dentro do módulo | Nunca |
| GPIO35 | Octal PSRAM dentro do módulo | Nunca |
| GPIO0 | Botão BOOT, pino de strapping | Com cuidado |
| GPIO45 | Pino de strapping: tensão de alimentação da memória | Melhor não mexer |
| GPIO48 | LED RGB compatível com WS2812 | Atenção ao LED |
| GPIO47 | Livre | Sim |
| GPIO21 | Livre | Sim |
| GPIO20 | USB nativo: D+ (conector esquerdo) | Só sem o USB nativo |
| GPIO19 | USB nativo: D− (conector esquerdo) | Só sem o USB nativo |
| GND | Massa | Não é um GPIO |
Os pinos 35–37 estão acessíveis na fila, mas não se podem usar: nos módulos com Octal PSRAM estão ligados internamente à memória, e qualquer sinal externo neles perturba o funcionamento desta.
36 GPIO, e quantos são realmente seus
Juntando tudo, o quadro obriga a pôr os pés na terra:
| Ocupados por | GPIO | Regra |
|---|---|---|
| Câmara | 4–13, 15–18 | Ocupados enquanto a câmara estiver ligada |
| microSD | 38–40 | Ocupados enquanto o cartão estiver montado |
| Octal PSRAM | 35–37 | Nunca usar |
| USB nativo | 19, 20 | Livres só se o conector esquerdo não fizer falta |
| UART0 e ponte USB–UART | 43, 44 | Livres só se o conector direito não fizer falta |
| LED da placa | 2, 48 | Utilizáveis se o LED não atrapalhar |
| Pinos de strapping | 0, 3, 45, 46 | Só quando se conhecem os níveis na reposição |
| Nada | 1, 14, 21, 41, 42, 47 | A primeira escolha para o seu próprio circuito |
Em suma, com a câmara e o cartão de memória a funcionar, ficam livres sem restrições seis pinos: GPIO1, 14, 21, 41, 42 e 47. Para um sensor I²C, um par de botões e um relé, chega; para uma coleção extensa de periféricos, já não. É possível reconquistar mais um par de pinos abdicando de uma das vias USB: se a placa trabalhar apenas pelo conector direito, ficam livres o GPIO19 e o GPIO20. Se trabalhar apenas pelo esquerdo, vale a pena experimentar o GPIO43 e o GPIO44, sem esquecer que continuam ligados à ponte USB–UART.
Com as entradas analógicas, a coisa é mais delicada. No ESP32-S3, o ADC1 corresponde aos GPIO1–10 e o ADC2 aos GPIO11–20. A câmara fica com quase todos os pinos do ADC1, por isso, com a câmara ativa, a única entrada analógica sem conflitos é o GPIO1. O GPIO2 e o GPIO3 também pertencem ao ADC1, mas o primeiro tem um LED ligado e o segundo é um pino de strapping. O GPIO14 pertence ao ADC2, e o ADC2 partilha recursos com o Wi‑Fi: enquanto o rádio trabalha, a leitura pode atrasar-se ou terminar com erro. Para sensores num projeto com Wi‑Fi, deve escolher-se o ADC1. As entradas táteis Touch1–Touch14 estão nos GPIO1–14, mas, entre eles, só o GPIO1 e o GPIO14 estão livres sem restrições.
E quatro regras sobre os pinos de strapping que poupam um serão:
- O GPIO0 é o botão BOOT. Se estiver a nível baixo durante a reposição, o chip entra em modo de gravação em vez de executar o programa. O circuito externo não deve puxar o GPIO0 para a massa durante o arranque.
- O GPIO46 está, por predefinição, puxado para a massa e escolhe o modo de arranque juntamente com o GPIO0. A combinação «nível baixo no GPIO0, nível alto no GPIO46» durante a reposição não é permitida.
- O GPIO45 define a tensão de alimentação da memória: nível baixo durante a reposição dá 3,3 V, nível alto dá 1,8 V. A Flash e a PSRAM deste módulo funcionam a 3,3 V, por isso um nível alto no GPIO45 durante a reposição não é permitido. Por predefinição, o pino está puxado para a massa, e é assim que deve ficar.
- O GPIO3 escolhe a origem dos sinais JTAG, mas só se o bit correspondente do eFuse tiver sido queimado; num módulo com as definições de fábrica, o seu nível é ignorado. Mesmo assim, a Espressif inclui-o entre os pinos de strapping, por isso é melhor não o escolher logo para o primeiro botão que se ligue.
A câmara: OV5640 e o mapa de pinos certo
A câmara está ligada por um barramento paralelo DVP: oito linhas de dados, três de sincronização, o relógio XCLK e um par de linhas SCCB para configurar o sensor, num total de 14 GPIO. Os pinos PWDN e RESET não estão ligados na placa, e na configuração indica-se -1 para eles.
A principal armadilha é um mapa de pinos alheio. Os exemplos mais populares que circulam na internet foram escritos para a AI-Thinker ESP32-CAM, e os números de GPIO dessa placa, num ESP32-S3, apontam, entre outros, para os pinos 26–32, que no S3 estão reservados à memória interna, e para os números 22–25, que o S3 nem sequer tem. Em contrapartida, as ligações desta placa coincidem ponto por ponto com as da Espressif ESP32-S3-EYE, para a qual o Arduino já tem tudo descrito.
No exemplo CameraWebServer (File → Examples → ESP32 → Camera), o modelo escolhe-se no ficheiro board_config.h. Por predefinição, está ativo o CAMERA_MODEL_ESP_EYE, que corresponde a outra placa, baseada no ESP32 antigo. É preciso comentar essa linha e descomentar CAMERA_MODEL_ESP32S3_EYE. Em camera_pins.h, os pinos deste modelo são os seguintes, exatamente como na nossa 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
Para este modelo, o próprio exemplo inverte a imagem na vertical com uma chamada a set_vflip. Se a imagem sair de pernas para o ar, basta alternar o V-Flip na interface web; é lá também que se aumenta a resolução, porque a transmissão arranca em QVGA. Já a falta de PSRAM, o exemplo contorna-a em silêncio: se psramFound() devolver false, o tamanho do fotograma fica limitado a SVGA e o buffer passa para a memória interna. A câmara continua a funcionar, mas muito longe de todo o seu potencial.
Se a transmissão ficar a preto
A OV5640 tem nesta placa um percalço conhecido. Donos destas placas relataram que o exemplo inicializa a câmara sem erros e que uma OV2640 funciona na mesma placa, mas a OV5640 devolve um fotograma preto. A julgar pelos seus relatos, ajuda mudar a frequência do relógio XCLK: em vez dos 20 MHz predefinidos, usam 24 MHz ou 12 MHz. Em setup() muda-se uma única linha, xclk_freq_hz; os restantes campos mostram com que definições costuma ser combinada:
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;
Se não resultar, convém verificar se o cabo flexível está inserido até ao fim no conector e com a patilha de fixação fechada, e também se a placa não está a aquecer demasiado: nas mesmas discussões, aconselha-se não a deixar com a câmara a trabalhar dentro de uma caixa fechada sem ventilação. A resolução completa do sensor, FRAMESIZE_5MP, com 2592 × 1944, só está disponível em JPEG.
Definições do Arduino IDE
A placa não precisa de um pacote próprio: serve o perfil padrão ESP32S3 Dev Module do arduino-esp32. O essencial é indicar corretamente a memória, porque disso depende que o programa veja ou não a PSRAM.
| Parâmetro | Valor | Porquê |
|---|---|---|
| Board | ESP32S3 Dev Module | Perfil genérico para o ESP32-S3 |
| Flash Size | 16MB (128Mb) | O tamanho real da Flash do módulo N16R8 |
| Flash Mode | QIO 80MHz | Aqui a Flash está ligada por Quad SPI; o modo OPI 80MHz destina-se a módulos com Octal Flash |
| PSRAM | OPI PSRAM | A PSRAM está ligada por Octal SPI; com QSPI PSRAM ou Disabled, o programa não a encontra |
| Partition Scheme | 16M Flash (3MB APP/9.9MB FATFS) | O CameraWebServer precisa de pelo menos 3 MB para a aplicação; o resto fica para ficheiros |
| USB CDC On Boot | Disabled para trabalhar pelo conector direito, Enabled para o esquerdo | Define a porta para onde vai Serial |
| USB Mode | Hardware CDC and JTAG | USB-Serial-JTAG incorporado; o modo USB-OTG (TinyUSB) é preciso para dispositivos USB próprios |
| Upload Mode | UART0 / Hardware CDC | Gravação por qualquer um dos dois conectores |
Se a gravação deixar de funcionar (por exemplo, porque o programa reconfigurou o USB nativo ou entrou num ciclo de reinícios), a solução é entrar manualmente no bootloader: manter BOOT premido, carregar brevemente em EN, largar BOOT e repetir o carregamento. Para o conector direito, o computador pode precisar do controlador da ponte USB–UART. Na placa original da Freenove é um CH343, e nos clones aparecem também outros chips, por isso o melhor é guiar-se pelo que o gestor de dispositivos mostra. O conector esquerdo é reconhecido pelos sistemas atuais como porta série, sem controlador à parte.
microSD, LED e botões
A ranhura microSD está ligada por SDMMC em modo de 1 bit: CMD no GPIO38, CLK no GPIO39, D0 no GPIO40. É mais lento do que o modo de 4 bits, mas poupa três pinos. Duas das três linhas coincidem com os pinos predefinidos do JTAG externo (MTCK e MTDO), por isso o cartão e um depurador externo atrapalham-se mutuamente; com o cartão, é mais cómodo depurar pelo conector USB esquerdo.
Há cinco LED. O ON indica a alimentação, o TX e o RX piscam quando há troca de dados pela ponte USB–UART, o IO2 é um LED de utilizador no GPIO2 e o 48 é um LED RGB endereçável, compatível com WS2812, no GPIO48. No perfil ESP32S3 Dev Module, as macros LED_BUILTIN e RGB_BUILTIN apontam precisamente para este último, pelo que o Blink padrão acende o LED RGB a branco. A cor define-se com a função rgbLedWrite(), e a antiga neopixelWrite() foi declarada obsoleta.
O botão EN reinicia o módulo; o BOOT está ligado ao GPIO0 e serve para entrar manualmente no bootloader. Depois de o programa arrancar, o BOOT pode ser lido como um botão normal. Um autoteste rápido da placa consiste em montar o cartão e indicar o resultado com uma cor:
#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() {}
Alimentação e aquecimento
A placa alimenta-se por qualquer um dos USB‑C ou pelo pino 5V. O pino 3V3 é a saída do regulador da placa e pode alimentar sensores de 3,3 V de baixo consumo. Os GPIO trabalham apenas com níveis de 3,3 V: um sinal de 5 V numa entrada pode danificar o módulo, cuja tensão de alimentação máxima absoluta é de 3,6 V.
A câmara, o envio de dados por Wi‑Fi e a escrita no cartão provocam picos de corrente. A folha de características do módulo exige da fonte de alimentação pelo menos 0,5 A, e uma porta USB fraca ou um cabo comprido e fino ficam facilmente aquém desse requisito. Os sintomas são fáceis de reconhecer: a placa reinicia no momento em que a transmissão arranca, e no registo aparece uma mensagem do detetor de subtensão, o brownout. Resolve-se com um cabo curto de boa qualidade e uma fonte de alimentação de 5 V decente.
O segundo limite é menos óbvio: a temperatura. Os módulos com Octal PSRAM, incluindo o N16R8, estão especificados para uma temperatura ambiente até 65 °C, ao passo que as variantes sem PSRAM vão até 85 °C. A Espressif ressalva que, com a correção de erros da PSRAM (ECC) ativada, o limite sobe para 85 °C, à custa de 1/16 da capacidade da memória. A câmara e o rádio aquecem a placa continuamente, por isso, numa caixa fechada ao sol, essa margem esgota-se depressa; é melhor prever orifícios de ventilação desde o início.
O que construir com ela: três cenários elucidativos
1. Uma câmara para a impressora 3D
Acompanhar à distância como vai a impressão e, já agora, fazer um timelapse é o cenário mais natural para uma placa destas. O projeto Prusa-Firmware-ESP32-Cam, um firmware que liga a câmara ao serviço Prusa Connect, tem uma descrição específica para a placa Freenove ESP32-S3-WROOM. Os módulos testados nesse projeto são OV2640, por isso a compatibilidade com a OV5640 terá de ser verificada por conta própria, mas a disposição da placa é a mesma.
2. Um registador de timelapse com cartão próprio
A ranhura microSD transforma a placa num registador autónomo: acordar por temporizador, tirar uma fotografia JPEG, guardá-la no cartão e voltar a adormecer. É assim que se filma o crescimento das plantas, as obras vistas da janela ou um processo demorado na oficina. A placa, porém, não está otimizada para funcionar a bateria: o LED ON está sempre aceso e o pino PWDN da câmara não está ligado, pelo que não é possível cortar a alimentação ao sensor por hardware; resta apenas o modo de espera por software, através do SCCB. A corrente em suspensão será nitidamente mais alta do que a do módulo sozinho; para um timelapse ligado à rede elétrica isso não importa, mas para um alimentado a bateria faz muita diferença.
3. Câmara web USB e visão no próprio dispositivo
O USB nativo permite ao ESP32-S3 apresentar-se ao computador como câmara web. O esp-iot-solution da Espressif inclui o exemplo usb_webcam: a placa torna-se um dispositivo UVC e transmite MJPEG, e a lista de modos do exemplo inclui 1280 × 720 a 15 fotogramas por segundo. Por predefinição, o exemplo é compilado para a ESP32-S3-EYE, ou seja, para o mesmo mapa de pinos desta placa. A segunda via é processar os fotogramas no próprio dispositivo: a framework ESP-WHO da Espressif é orientada para o ESP32-S3 e consegue, por exemplo, detetar rostos sem depender da nuvem.
Pontos fortes e fracos
| A favor | Contra |
|---|---|
| Dois USB‑C: gravação sem adaptador e USB nativo | Os conectores só estão identificados no verso, e é fácil trocá-los |
| 16 MB de Flash e 8 MB de Octal PSRAM | Os módulos com Octal PSRAM só estão especificados até 65 °C |
| Câmara de 5 MP substituível | Com a OV5640 pode aparecer um fotograma preto, e há que afinar a frequência do XCLK |
| Ranhura microSD na própria placa | O cartão ocupa três pinos e entra em conflito com o JTAG externo |
| Os 36 GPIO do módulo nas filas de pinos, com os ocupados assinalados na serigrafia | Só seis pinos estão livres sem restrições |
| O mapa de pinos coincide com o da ESP32-S3-EYE, e os exemplos prontos servem com uma alteração mínima | Não está otimizada para aparelhos a bateria: o PWDN não está ligado e o LED de alimentação está sempre aceso |
| LED de utilizador e LED RGB na placa | Os lotes diferem na câmara e na ponte USB–UART |
Conclusão
A ESP32-S3-CAM N16R8 é uma ESP32-CAM curada de quase todas as doenças de infância: um USB como deve ser, memória de sobra, câmara de 5 MP substituível e uma marcação honesta dos pinos ocupados na própria placa. Para uma câmara de oficina, um timelapse, vigiar uma impressora 3D ou fazer experiências com visão artificial, é uma base muito cómoda.
O preço dessa comodidade é ter tudo muito apertado. A câmara e o cartão de memória comem quase todos os pinos, a PSRAM tem de ser ativada corretamente e a OV5640 pode obrigar a afinar a frequência. Antes da primeira gravação, vale a pena percorrer uma pequena lista:
- Perfil ESP32S3 Dev Module: Flash de 16 MB, QIO 80MHz, PSRAM em OPI PSRAM.
- Mapa de pinos:
CAMERA_MODEL_ESP32S3_EYE, e não o da AI-Thinker. - Buffers de imagem na PSRAM, formato JPEG.
- microSD em SDMMC de 1 bit nos GPIO38, 39 e 40.
- O cabo no conector que corresponde à opção USB CDC On Boot.
- Pinos novos: primeiro os da lista GPIO1, 14, 21, 41, 42 e 47.
- GPIO0, 3, 45 e 46 sem circuitos externos que alterem o seu nível durante a reposição.
Tudo o que ficou dito acima num único ficheiro: uma referência aos pinos e às limitações de hardware da placa. Dá jeito tê-la ao lado do sketch ou entregá-la a um agente de programação, para que não invente a pinagem.