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.

Pinagem da ESP32-S3 WROOM CAM. Fila esquerda, de cima para baixo: 3V3, EN, GPIO4, 5, 6, 7, 15, 16, 17, 18, 8, 3, 46, 9, 10, 11, 12, 13, 14, 5V. Fila direita: GPIO43 (TX), 44 (RX), 1, 2, 42, 41, 40, 39, 38, 37, 36, 35, 0, 45, 48, 47, 21, 20, 19, GND. As etiquetas coloridas indicam câmara, microSD, PSRAM, USB, UART, JTAG, ADC e entradas táteis.
A ESP32-S3 WROOM CAM: as duas filas de pinos e as funções de cada um. Clique para ver a versão em tamanho real.

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

ElementoCaracterísticaO que significa na prática
MóduloESP32-S3-WROOM-1-N16R8, antena impressa na placaMódulo da Espressif já pronto, com 18 × 25,5 × 3,1 mm; os seus 36 GPIO estão todos nas filas de pinos
Processador2 núcleos Xtensa LX7, até 240 MHz, FPUChega 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 SoC512 KB de SRAM, 384 KB de ROMA memória interna não chega para os fotogramas da câmara: o lugar deles é na PSRAM
Flash16 MB, Quad SPIChega para uma aplicação grande, OTA e um sistema de ficheiros
PSRAM8 MB, Octal SPI (OPI)Buffers de imagem da câmara; no Arduino IDE é preciso o modo OPI PSRAM
Wi‑Fi2,4 GHz, 802.11 b/g/n, até 150 Mbit/sTransmissão de vídeo MJPEG, envio de fotografias, atualizações sem fios
BluetoothBluetooth 5 (LE), mesh, velocidades até 2 Mbit/s e modo Long RangeApenas BLE: o ESP32-S3 não tem Bluetooth clássico, logo nem SPP nem A2DP
CâmaraOV5640, 5 MP (2592 × 1944), barramento DVP de 8 bits, configuração por SCCBO próprio sensor comprime o fotograma em JPEG; o barramento ocupa 14 GPIO
Conector da câmaraFPC, 24 contactosO módulo da câmara é substituível: servem módulos do mesmo padrão
Cartão de memóriamicroSD, SDMMC em modo de 1 bitAs fotografias e os timelapses ficam gravados na própria placa; a ranhura ocupa os GPIO38–40
USBDois USB‑C: ponte USB–UART ligada à UART0 e o USB nativo do próprio ESP32-S3Gravação do firmware e registos pelo conector direito; dispositivos USB e depuração pelo esquerdo
GPIO36 pinos em duas filas de 20 contactosSeis estão livres sem restrições e mais alguns com condições
Indicadores e botõesLED 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ção5 V por USB‑C ou pelo pino 5V; no pino 3V3, 3,3 V do regulador da placaO módulo precisa de uma fonte capaz de fornecer pelo menos 0,5 A
Níveis lógicos3,3 V; os GPIO não toleram 5 VUm 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 desenvolvimentoArduino IDE, PlatformIO, ESP-IDF; MicroPython, numa compilação que inclua o controlador da câmaraPara 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:

ConectorO que está por trásPara que usar
Esquerdo, USB-OTGUSB nativo do próprio ESP32-S3: GPIO19 é D−, GPIO20 é D+. USB-Serial-JTAG incorporado ou USB OTGDepuração sem adaptador externo e dispositivos USB próprios: teclado, rato, MIDI, unidade de armazenamento, câmara web
Direito, USB-UARTPonte USB–UART ligada à UART0: GPIO43 é TX, GPIO44 é RXGravaçã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

PinoFunção na placaPode usar-se?
3V33,3 V do regulador da placaNão é um GPIO
ENReposição, botão EN; ativo a nível baixoNão
GPIO4Câmara: SIOD, dados SCCBSó sem a câmara
GPIO5Câmara: SIOC, relógio SCCBSó sem a câmara
GPIO6Câmara: VSYNCSó sem a câmara
GPIO7Câmara: HREFSó sem a câmara
GPIO15Câmara: XCLKSó sem a câmara
GPIO16Câmara: D7 (Y9)Só sem a câmara
GPIO17Câmara: D6 (Y8)Só sem a câmara
GPIO18Câmara: D5 (Y7)Só sem a câmara
GPIO8Câmara: D2 (Y4)Só sem a câmara
GPIO3Pino de strapping; ADC1, Touch3Com cuidado
GPIO46Pino de strapping do modo de arranqueCom cuidado
GPIO9Câmara: D1 (Y3)Só sem a câmara
GPIO10Câmara: D3 (Y5)Só sem a câmara
GPIO11Câmara: D0 (Y2)Só sem a câmara
GPIO12Câmara: D4 (Y6)Só sem a câmara
GPIO13Câmara: PCLKSó sem a câmara
GPIO14Livre; ADC2, Touch14Sim
5VBarramento de 5 VNão é um GPIO

Fila direita, de cima para baixo

PinoFunção na placaPode usar-se?
TX (GPIO43)UART0 TX, para a ponte USB–UARTSó sem o conector direito
RX (GPIO44)UART0 RX, da ponte USB–UARTSó sem o conector direito
GPIO1Livre; ADC1, Touch1Sim, a melhor entrada analógica
GPIO2LED IO2; ADC1, Touch2Atenção ao LED
GPIO42Livre; MTMS do JTAG externoSim
GPIO41Livre; MTDI do JTAG externoSim
GPIO40microSD: D0; MTDO do JTAG externoSó sem o cartão
GPIO39microSD: CLK; MTCK do JTAG externoSó sem o cartão
GPIO38microSD: CMDSó sem o cartão
GPIO37Octal PSRAM dentro do móduloNunca
GPIO36Octal PSRAM dentro do móduloNunca
GPIO35Octal PSRAM dentro do móduloNunca
GPIO0Botão BOOT, pino de strappingCom cuidado
GPIO45Pino de strapping: tensão de alimentação da memóriaMelhor não mexer
GPIO48LED RGB compatível com WS2812Atenção ao LED
GPIO47LivreSim
GPIO21LivreSim
GPIO20USB nativo: D+ (conector esquerdo)Só sem o USB nativo
GPIO19USB nativo: D− (conector esquerdo)Só sem o USB nativo
GNDMassaNã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 porGPIORegra
Câmara4–13, 15–18Ocupados enquanto a câmara estiver ligada
microSD38–40Ocupados enquanto o cartão estiver montado
Octal PSRAM35–37Nunca usar
USB nativo19, 20Livres só se o conector esquerdo não fizer falta
UART0 e ponte USB–UART43, 44Livres só se o conector direito não fizer falta
LED da placa2, 48Utilizáveis se o LED não atrapalhar
Pinos de strapping0, 3, 45, 46Só quando se conhecem os níveis na reposição
Nada1, 14, 21, 41, 42, 47A 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:

  1. 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.
  2. 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.
  3. 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.
  4. 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âmetroValorPorquê
BoardESP32S3 Dev ModulePerfil genérico para o ESP32-S3
Flash Size16MB (128Mb)O tamanho real da Flash do módulo N16R8
Flash ModeQIO 80MHzAqui a Flash está ligada por Quad SPI; o modo OPI 80MHz destina-se a módulos com Octal Flash
PSRAMOPI PSRAMA PSRAM está ligada por Octal SPI; com QSPI PSRAM ou Disabled, o programa não a encontra
Partition Scheme16M 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 BootDisabled para trabalhar pelo conector direito, Enabled para o esquerdoDefine a porta para onde vai Serial
USB ModeHardware CDC and JTAGUSB-Serial-JTAG incorporado; o modo USB-OTG (TinyUSB) é preciso para dispositivos USB próprios
Upload ModeUART0 / Hardware CDCGravaçã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 favorContra
Dois USB‑C: gravação sem adaptador e USB nativoOs conectores só estão identificados no verso, e é fácil trocá-los
16 MB de Flash e 8 MB de Octal PSRAMOs módulos com Octal PSRAM só estão especificados até 65 °C
Câmara de 5 MP substituívelCom a OV5640 pode aparecer um fotograma preto, e há que afinar a frequência do XCLK
Ranhura microSD na própria placaO 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 serigrafiaSó 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ínimaNã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 placaOs 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:

  1. Perfil ESP32S3 Dev Module: Flash de 16 MB, QIO 80MHz, PSRAM em OPI PSRAM.
  2. Mapa de pinos: CAMERA_MODEL_ESP32S3_EYE, e não o da AI-Thinker.
  3. Buffers de imagem na PSRAM, formato JPEG.
  4. microSD em SDMMC de 1 bit nos GPIO38, 39 e 40.
  5. O cabo no conector que corresponde à opção USB CDC On Boot.
  6. Pinos novos: primeiro os da lista GPIO1, 14, 21, 41, 42 e 47.
  7. 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.