Le immagini dei prodotti sono solo a scopo informativo e potrebbero presentare piccole differenze, a seconda del lotto e del fornitore. Le specifiche e i prezzi dei prodotti potrebbero essere soggetti a modifiche senza preavviso. Facciamo del nostro meglio per aggiungere specifiche quanto più precise e corrette possibili alla pagina del prodotto, ma è possibile che non siano del tutto corrette. Se identifichi un caso del genere, ti preghiamo di segnalarcelo.
Il prodotto è destinato agli specialisti e richiede personale qualificato e autorizzato. Il prodotto non include istruzioni di montaggio/uso . La messa in funzione del prodotto da parte di persone non qualificate comporta la perdita della garanzia secondo i Termini e Condizioni presenti sul sito.
Le specifiche tecniche indicate (corrente, potenza, ecc.) rappresentano valori massimi consentiti in condizioni ideali di funzionamento. Per un utilizzo sicuro e una durata ottimale, si raccomanda di utilizzare il prodotto in regime continuo a non più del 50% dei valori massimi specificati.
Scheda di sviluppo ESP32-CAM con CH340G, WiFi, Bluetooth, OV5640 5MP
Soluzione compatta per progetti di visione artificiale, streaming video e IoT, con processore ESP32 dual core fino a 240MHz, connettività WiFi 802.11 b g n e Bluetooth 4.2 LE per il controllo e la trasmissione wireless, fotocamera OV5640 da 5MP per immagini dettagliate, memoria con PSRAM da 4MB per acquisizioni ed elaborazione efficiente, programmazione semplice in Arduino IDE tramite CH340G con USB Type C.
Acquistando questo prodotto guadagni 347,66 Ft in punti fedeltà.
Spedizione veloce gratuita per ordini superiori a 100EUR nella maggior parte de paesi UE.
Spediamo dal nostro magazzino entro 24 ore
Ricevi punti a ogni ordine, per un valore del 5%.
La scheda di sviluppo ESP32-CAM combina in un unico modulo il processore ESP32 con WiFi e Bluetooth e una camera OV5640 da 5 MP collegata tramite cavo flex al connettore FPC della scheda. È una soluzione completa per l’acquisizione e la trasmissione di immagini in progetti di visione artificiale, streaming video e IoT. La scheda può funzionare autonomamente, inviando immagini e flussi video in rete tramite WiFi, oppure può essere programmata per rispondere a comandi ricevuti tramite UART, risultando adatta per videosorveglianza, riconoscimento degli oggetti, monitoraggio remoto e fotografia automatizzata.
La scheda viene fornita con programmatore dedicato, equipaggiato con CH340 o FT232 (a seconda del lotto), con porta USB Type-C.
Il processore è un ESP32 dual core LX6 a 32 bit, con frequenza operativa tra 80 e 240 MHz e potenza di calcolo fino a 600 DMIPS. La memoria interna di 520 KB SRAM è completata da 4 MB di PSRAM esterna, necessaria per l’elaborazione di immagini ad alta risoluzione prima della compressione e trasmissione. La camera OV5640 offre una risoluzione massima di 2592 x 1944 pixel (5 MP) e si collega a un connettore FPC a 24 pin. Il modulo supporta WiFi 802.11 b/g/n, Bluetooth 4.2 LE, immagini in formato JPEG, BMP o grayscale e modalità a basso consumo Deep-sleep, Modem-sleep e Light-sleep.
Tra le caratteristiche principali figurano il connettore FPC per la camera, lo slot per scheda microSD fino a 4 GB, un LED bianco usato come flash, l’antenna PCB stampata sulla scheda, due file di pin (16 in totale) che espongono l’alimentazione, i GPIO liberi e l’interfaccia UART, e un pulsante di RESET. L’alimentazione avviene a 5 VDC sul pin 5V, con una sorgente stabile da almeno 2 A, ma la scheda può essere alimentata anche a 3.3 VDC tramite il pin 3V3.
Tramite l’interfaccia UART (pin U0T e U0R), la scheda si programma e si testa con un adattatore USB-seriale collegato al computer, mentre dopo la connessione alla rete le immagini e il flusso video possono essere accessibili direttamente da un browser su qualsiasi computer o telefono della rete locale. I pin GPIO rimanenti consentono il collegamento di sensori o moduli aggiuntivi compatibili con Arduino, ESP32, STM32 o Raspberry Pi, utilizzando il livello logico di 3.3 V della scheda.
Specifiche:

Tensione di alimentazione: 5 VDC (pin 5V)
Assorbimento di corrente: 180 mA (Flash LED spento) / 310 mA (Flash LED acceso, luminosità massima)
Assorbimento di corrente Deep-sleep: 6 mA minimo
Assorbimento di corrente Modem-sleep: 20 mA minimo
Assorbimento di corrente Light-sleep: 6.7 mA minimo
Numero di pin: 16
WiFi: 802.11 b/g/n
Bluetooth: 4.2 LE
CPU: Dual core LX6, 32 bit
Frequenza CPU: 80 - 240 MHz
Memoria interna: 520 KB SRAM
Memoria esterna: 4 MB PSRAM
Memoria Flash SPI: 32 Mbit
Interfacce supportate: UART, SPI, I2C, PWM, ADC, DAC
Camera inclusa: OV5640, 5 MP, risoluzione massima 2592 x 1944 pixel
Connettore camera: FPC, 24 pin
Formato immagini: JPEG, BMP, grayscale
Scheda di memoria: microSD (TF), fino a 4 GB
Modalità a basso consumo: Deep-sleep, Modem-sleep, Light-sleep
Stack software integrato: LwIP, FreeRTOS
Modalità di funzionamento rete: STA / AP / STA+AP
Smart Config / AirKiss: Sì
Aggiornamento FOTA: Sì
Programmatore incluso: Sì, con Type-C, CH340 o FT232 a seconda del lotto
Dimensioni: 42 x 27 x 12 mm
ATTENZIONE!
Leggere attentamente prima dell’acquisto
Camera OV5640 (lotto attuale)
Questo modulo viene fornito con camera OV5640 (5MP) al posto della OV2640, a causa di problemi di approvvigionamento di camere OV2640 di qualità. Il sensore si riscalda molto durante il funzionamento e può diventare caldo al tatto. È un comportamento normale per questa combinazione scheda-camera, non un difetto.
Il programmatore può utilizzare il driver CH340 o FT232, a seconda del lotto.
Condizioni obbligatorie di utilizzo:
Dissipatore montato sul retro della camera, con nastro o pad termoconduttivo.
Buona ventilazione; non utilizzare il modulo in contenitori chiusi senza circolazione d’aria.
Alimentazione stabile a 5V, minimo 2A, sul pin 5V. Non alimentare il modulo dall’adattatore USB-seriale a 3.3V.
Riduzione del riscaldamento della camera OV5640 sulla scheda ESP32-CAM
La scheda ESP32-CAM (AI Thinker) è stata progettata per la camera OV2640 e alimenta il connettore della camera con 3.3V (DOVDD), 2.8V (AVDD) e 1.2V (DVDD). Il sensore OV5640 richiede però 1.5V sul core (DVDD). Per poter funzionare anche in queste condizioni, l’OV5640 attiva di default il proprio regolatore interno da 1.5V, alimentato dalla tensione di 3.3V. La differenza di tensione si trasforma in calore all’interno del sensore, motivo per cui il modulo si scalda molto durante il funzionamento continuo. Oltre circa 50°C possono comparire rumore e una tonalità viola nell’immagine. La soluzione consiste nel sostituire il regolatore da 1.2V con uno da 1.5V, seguito dalla disattivazione del regolatore interno via software.
Necessario
Regolatore: XC6206P152MR o ME6206A15XG (1.5V, SOT-23)
Strumenti: stazione ad aria calda, multimetro
Registro OV5640: 0x3031, bit 3 (valore 0x08)
Uso
Scollegate la camera e alimentate la scheda a 5V.
Misurate con il multimetro, rispetto a un pin GND della scheda, l’uscita dei regolatori SOT-23 vicino al connettore della camera e identificate quello che fornisce circa 1.2V. Il regolatore da 2.8V e l’AMS1117 (3.3V) non vanno modificati.

Annotate la posizione dei pin VIN (3.3V), VOUT (1.2V) e GND del regolatore identificato.
Rimuovete il regolatore da 1.2V e sostituitelo con quello da 1.5V, dopo aver verificato nel datasheet che i pin VIN, VOUT e GND corrispondano ai pad.
Alimentate la scheda senza la camera e verificate che l’uscita del nuovo regolatore sia compresa tra 1.45V e 1.55V.
Collegate la camera e aggiungete nel codice, subito dopo esp_camera_init(), la disattivazione del regolatore interno (esempio qui sotto).
Verificate nel Serial Monitor che il registro 0x3031 abbia valore 0x08.
Opzionalmente, montate sul retro del modulo camera un piccolo dissipatore in alluminio, fissato con nastro termoconduttivo.
// OV5640: disable the internal 1.5V core regulator (register 0x3031, bit 3)
// Use ONLY when DVDD is supplied externally with 1.5V
sensor_t *s = esp_camera_sensor_get();
if (s->id.PID == OV5640_PID) {
s->set_reg(s, 0x3031, 0x08, 0x08);
Serial.printf("OV5640 reg 0x3031 = 0x%02X\n", s->get_reg(s, 0x3031, 0xFF));
}
Dopo la modifica, la camera funziona correttamente a tutte le risoluzioni testate, fino a 2560x1920, e la temperatura del modulo diminuisce. Un dissipatore è comunque necessario poiché la camera raggiunge comunque, durante il funzionamento, circa 50 gradi C.
Alternativa senza saldatura
Montate un dissipatore sulla camera, usate nello stream risoluzioni al massimo SVGA o HD e mettete il sensore in standby tra le acquisizioni (registro 0x3008 = 0x42 per standby, 0x02 per attivo).
Attenzione! Non disattivate il regolatore interno su una scheda non modificata, con 1.2V su DVDD. Il core del sensore funzionerebbe al di sotto della tensione minima specificata, con rischio di immagini corrotte e blocchi. Su una scheda senza regolatore DVDD, la disattivazione lascia il core completamente senza alimentazione.
Dopo la modifica, la scheda non è più adatta alla camera OV2640, che richiede 1.2V sul core. Contrassegnate la scheda di conseguenza. La modifica richiede esperienza nella saldatura di componenti SMD.
Layout:
| Element | Funzione |
|---|---|
| Modulo ESP32-S con antenna PCB | Il processore ESP32 dual core e l’antenna WiFi / Bluetooth stampata sulla scheda. |
| LED bianco | Usato come flash per la camera ed è comandato da GPIO4. Si accende quando GPIO4 è HIGH e si spegne quando GPIO4 è LOW. |
| LED rosso di stato | LED sul retro della scheda, comandato da GPIO33. Si accende quando GPIO33 è LOW e può essere usato come indicatore libero nel programma. |
| Connettore FPC per la camera | Connettore a 24 pin a cui è collegato il cavo flex della camera OV5640. |
| Camera OV5640 | Modulo camera da 5 MP, montato separatamente dalla scheda e collegato tramite cavo flex. |
| Slot scheda microSD (TF) | Archiviazione locale di immagini e file, schede fino a 4 GB. Usa i pin IO2, IO4, IO12, IO13, IO14 e IO15. |
| Due file di pin (header doppio) | Espongono l’alimentazione, i GPIO liberi e l’interfaccia UART, 16 pin in totale. |
| Pin IO0 | Seleziona la modalità di avvio. Collegato a GND (il pin GND vicino ad esso) al momento del reset, la scheda entra in modalità di caricamento del programma. Lasciato libero, la scheda esegue il programma nella memoria Flash. |
| Pulsante RESET | Resetta il microcontrollore ESP32. Si preme dopo aver collegato IO0 a GND per entrare in modalità di caricamento e dopo aver rimosso il ponte per eseguire il programma. |
| Regolatore di tensione | Converte l’alimentazione a 5 V nella tensione di 3.3 V necessaria ai circuiti della scheda. |
| Fori di montaggio | Due fori tra le file di pin, per il fissaggio della scheda. |
Pinout:

| Connettore | Pin | Funzione |
|---|---|---|
| Header 5V | 5V | Alimentazione scheda, 5 VDC |
| Header 5V | GND | Massa |
| Header 5V | IO12 | GPIO12, usato anche come MicroSD DATA2 |
| Header 5V | IO13 | GPIO13, usato anche come MicroSD DATA3 |
| Header 5V | IO15 | GPIO15, usato anche come MicroSD CMD |
| Header 5V | IO14 | GPIO14, usato anche come MicroSD CLK |
| Header 5V | IO2 | GPIO2, usato anche come MicroSD DATA0 |
| Header 5V | IO4 | GPIO4, usato anche come MicroSD DATA1, comanda il LED flash |
| Header 3V3 | 3V3 | Alimentazione scheda, 3.3 VDC |
| Header 3V3 | IO16 | GPIO16, linea libera, può essere UART2 RX |
| Header 3V3 | IO0 | GPIO0, seleziona la modalità di avvio, va collegato a GND per il caricamento del programma |
| Header 3V3 | GND | Massa |
| Header 3V3 | VCC | Uscita 3.3 V o 5 V, non alimentare la scheda tramite questo pin |
| Header 3V3 | U0R (IO3) | UART RX, ricezione dati seriali |
| Header 3V3 | U0T (IO1) | UART TX, trasmissione dati seriali |
| Header 3V3 | GND | Massa |
| Segnale camera (FPC) | GPIO ESP32 | Funzione |
|---|---|---|
| D0 | GPIO5 | Linea dati camera (Y2) |
| D1 | GPIO18 | Linea dati camera (Y3) |
| D2 | GPIO19 | Linea dati camera (Y4) |
| D3 | GPIO21 | Linea dati camera (Y5) |
| D4 | GPIO36 | Linea dati camera (Y6) |
| D5 | GPIO39 | Linea dati camera (Y7) |
| D6 | GPIO34 | Linea dati camera (Y8) |
| D7 | GPIO35 | Linea dati camera (Y9) |
| XCLK | GPIO0 | Clock di ingresso per il sensore della camera |
| PCLK | GPIO22 | Clock di uscita pixel |
| VSYNC | GPIO25 | Sincronizzazione verticale del frame |
| HREF | GPIO23 | Sincronizzazione orizzontale della linea |
| SIOD (SDA) | GPIO26 | I2C / SCCB, configurazione del sensore |
| SIOC (SCL) | GPIO27 | I2C / SCCB, configurazione del sensore |
| PWDN | GPIO32 | Spegnimento (power-down) del sensore, HIGH per spegnere tra le acquisizioni |
Uso:
Se il modulo camera non è già montato, fissarlo al connettore FPC della scheda rispettando l’orientamento dei contatti e chiudere la levetta di blocco del connettore.
Montare un piccolo dissipatore, con nastro o pad termoconduttivo, sul retro della camera OV5640 prima del primo utilizzo, poiché il sensore si riscalda molto durante il funzionamento e può diventare caldo al tatto; questo è un comportamento normale per questa combinazione scheda-camera.
Assicurare una buona ventilazione intorno al modulo e non usarlo in un contenitore chiuso senza circolazione d’aria.
Alimentare la scheda a 5 VDC, minimo 2 A, sul pin 5V, utilizzando una sorgente stabile, e non alimentare il modulo dall’uscita a 3.3 V di un adattatore USB-seriale. Non applicare tensione al pin VCC, poiché è un’uscita.
Per la programmazione, collegare un adattatore FT232 o equivalente ai pin U0R, U0T e GND, con il jumper dell’adattatore su 3.3 V, collegando il TXD dell’adattatore a U0R e il RXD dell’adattatore a U0T, e la massa dell’adattatore alla massa della scheda.
In Arduino IDE installare il pacchetto schede esp32 by Espressif Systems dal Boards Manager, selezionare la scheda AI Thinker ESP32-CAM e aprire l’esempio CameraWebServer dal menu File - Examples.
Nel codice, selezionare la riga con il modello di camera CAMERA_MODEL_AI_THINKER e inserire il nome della rete WiFi e la password.
Prima del caricamento, collegare temporaneamente il pin IO0 a GND, premere il pulsante RESET e caricare il programma.
Dopo il caricamento, rimuovere il ponte tra IO0 e GND e premere di nuovo RESET. Aprire il Serial Monitor a 115200 baud e annotare l’indirizzo IP visualizzato, quindi inserirlo nel browser di un computer o telefono connesso alla stessa rete.
Per lo streaming continuo scegliere il formato JPEG e una risoluzione ridotta (SVGA o HD), mentre la risoluzione massima va usata solo per le fotografie. Se si eseguono acquisizioni periodiche, mettere il sensore in spegnimento tra uno scatto e l’altro portando GPIO32 su HIGH.
Se si utilizza la scheda microSD, tenere presente che i pin IO2, IO4, IO12, IO13, IO14 e IO15 sono occupati dalla scheda, e che IO4 comanda anche il LED bianco.
Il modulo non è consigliato per streaming continuo 24 ore su 24. Per risultati stabili usare una buona alimentazione, cavi di alimentazione corti e una rete WiFi con segnale forte nel punto in cui è montata la scheda.
Diagramma dimensioni:

Tutorial:

- Tensione di alimentazione
- 5 V DC
- Dimensioni
- 42 x 27 x 12 mm
- Numero di pin
- 16
- Interfaccia
- UART, SPI, I2C, PWM, ADC, DAC
- Memoria Flash
- 32 Mbit SPI
- Consumo
- 180 mA / 310 mA
- Processore
- Dual core LX6, 32 bit
- WiFi
- 802.11 b/g/n
- Bluetooth
- 4.2 LE
- Consumo in standby
- 6 mA
- Memoria SRAM
- 520 KB
- Frequenza del processore
- 80-240 MHz
- Slot per scheda di memoria
- microSD (TF), fino a 4 GB
Produs destinat utilizarii in proiecte electronice, automatizari, prototipare, educatie si cercetare.
Produsul trebuie utilizat numai conform specificatiilor tehnice mentionate in descriere si/sau in documentatia produsului.
Avertismente generale de siguranta:
Nu utilizati produsul la tensiuni, curenti sau temperaturi peste valorile specificate.
Montajul si conectarea trebuie realizate de persoane cu cunostinte tehnice minime in domeniul electric/electronic.
Evitati scurtcircuitele, inversarea polaritatii si conectarea gresita a alimentarii.
Nu lasati produsul alimentat nesupravegheat in timpul testelor.
Produsul nu este jucarie si nu este destinat copiilor.
Pentru modulele electronice, se recomanda utilizarea in carcase, panouri sau montaje protejate, dupa caz.
Identificare produs:
Denumirea produsului, codul/SKU-ul si caracteristicile tehnice sunt mentionate in pagina produsului si/sau pe eticheta ambalajului.
Producator / Importator / Distribuitor:
Sigmanortec S.R.L.
Calea Bucuresti nr. 9, Targu Jiu, Gorj, Romania
E-mail: [email protected]
Website: www.sigmanortec.ro
Persoana responsabila in UE:
Sigmanortec S.R.L.
Calea Bucuresti nr. 9, Targu Jiu, Gorj, Romania
E-mail: [email protected]
Documentatie si siguranta:
Pentru informatii suplimentare, fise tehnice, declaratii de conformitate sau instructiuni, ne puteti contacta la [email protected].
/*
Test sketch for ESP32-CAM (AI-Thinker) with OV5640 5MP camera
Board selected in Arduino IDE: "AI Thinker ESP32-CAM" (Tools > Board > esp32)
Board package: esp32 by Espressif Systems (installed from Boards Manager)
Boards Manager URL (File > Preferences): https://dl.espressif.com/dl/package_esp32_index.json
Libraries: none to install, esp_camera.h comes with the esp32 package
Wiring: camera attached to the onboard FPC connector, board powered at 5 V (min 2 A) on the 5V pin,
FT232 TXD -> U0R, FT232 RXD -> U0T, FT232 GND -> GND, IO0 bridged to GND only during upload
This sketch does not use WiFi. It checks that the camera starts and reports the frame size.
*/
#include "esp_camera.h"
// AI-Thinker camera pin map
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
bool cameraReady = false;
void setup() {
Serial.begin(115200);
delay(500);
Serial.println("ESP32-CAM OV5640 test starting");
camera_config_t config;
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = Y2_GPIO_NUM;
config.pin_d1 = Y3_GPIO_NUM;
config.pin_d2 = Y4_GPIO_NUM;
config.pin_d3 = Y5_GPIO_NUM;
config.pin_d4 = Y6_GPIO_NUM;
config.pin_d5 = Y7_GPIO_NUM;
config.pin_d6 = Y8_GPIO_NUM;
config.pin_d7 = Y9_GPIO_NUM;
config.pin_xclk = XCLK_GPIO_NUM;
config.pin_pclk = PCLK_GPIO_NUM;
config.pin_vsync = VSYNC_GPIO_NUM;
config.pin_href = HREF_GPIO_NUM;
config.pin_sscb_sda = SIOD_GPIO_NUM;
config.pin_sscb_scl = SIOC_GPIO_NUM;
config.pin_pwdn = PWDN_GPIO_NUM;
config.pin_reset = RESET_GPIO_NUM;
config.xclk_freq_hz = 20000000;
config.pixel_format = PIXFORMAT_JPEG;
// SVGA keeps the sensor cooler than the maximum resolution
config.frame_size = psramFound() ? FRAMESIZE_SVGA : FRAMESIZE_CIF;
config.jpeg_quality = 12;
config.fb_count = psramFound() ? 2 : 1;
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK) {
Serial.printf("Camera init failed with error 0x%x\n", err);
return;
}
sensor_t *s = esp_camera_sensor_get();
Serial.printf("Camera init OK, sensor PID: 0x%04X\n", s->id.PID);
cameraReady = true;
}
void loop() {
if (!cameraReady) {
delay(1000);
return;
}
camera_fb_t *fb = esp_camera_fb_get();
if (!fb) {
Serial.println("Frame capture failed");
} else {
Serial.printf("Captured frame: %u x %u pixels, %u bytes\n",
(unsigned)fb->width, (unsigned)fb->height, (unsigned)fb->len);
esp_camera_fb_return(fb);
}
delay(5000);
}
La scheda ESP32-CAM con fotocamera OV5640 da 5 MP è un modulo ESP32 con fotocamera integrata, usato per acquisire e trasmettere immagini via WiFi senza altri componenti aggiuntivi. Si utilizza in progetti di sorveglianza, monitoraggio a distanza, fotografia automatica e riconoscimento di immagini.
Il tutorial usa proprio la scheda ESP32-CAM AI-Thinker come piattaforma, programmata dall'Arduino IDE. La scheda non ha porta USB, quindi il caricamento del programma avviene tramite un adattatore USB-seriale FT232RL, mentre l'alimentazione è separata, da un alimentatore da 5 VDC con minimo 2 A. Il programma avvia la fotocamera e serve un flusso video tramite un semplice server web.

Come funziona:
Il sensore OV5640 acquisisce l'immagine e la invia all'ESP32 su 8 linee dati parallele (D0 - D7), sincronizzate dai segnali XCLK (il clock fornito al sensore), PCLK (il clock dei pixel), VSYNC (inizio fotogramma) e HREF (linea valida). La configurazione del sensore, cioè risoluzione, esposizione e bilanciamento del bianco, avviene tramite un bus I2C / SCCB sulle linee SIOD (GPIO26) e SIOC (GPIO27). Il pin PWDN (GPIO32) può spegnere il sensore quando non è in uso.
Il calcolo qui sotto mostra perché l'immagine viene compressa in JPEG direttamente nel sensore. La risoluzione massima è 2592 x 1944 = 5 038 848 pixel. Con 2 byte per pixel (formato RGB565), un fotogramma occuperebbe poco più di 10 MB (10 077 696 byte), più dei 4 MB di PSRAM della scheda. In JPEG, un fotogramma occupa molto meno e si adatta facilmente alla memoria.
Alla risoluzione SVGA (800 x 600 = 480 000 pixel), un fotogramma JPEG ha, a seconda della scena e della qualità scelta nel codice, circa 10 - 40 KB. Nei nostri test, con qualità 12, la media è stata di circa 13 KB per fotogramma. Se la rete WiFi offre in pratica 400 KB/s e un fotogramma ha 40 KB, risultano 400 / 40 = 10 fotogrammi al secondo. Oltre la risoluzione HD, il sensore fornisce solo 4 - 6 fotogrammi al secondo con il clock XCLK di 20 MHz. La risoluzione massima resta quindi riservata alle fotografie singole, mentre per il flusso video si scelgono SVGA o HD. La libreria esp32-camera offre come risoluzione massima QSXGA di 2560 x 1920 pixel, leggermente sotto i 2592 x 1944 pixel del sensore.
Collegamento:
La scheda si alimenta da un alimentatore separato da 5 VDC con minimo 2 A, sul pin 5V. Non alimentatela dall'adattatore USB-seriale, perché l'adattatore e la porta USB non garantiscono la corrente di picco richiesta dalla fotocamera OV5640 insieme al WiFi, e l'uscita da 3.3 V dell'adattatore non è adatta a questa scheda. Il pin VCC dell'adattatore FT232RL resta non collegato, mentre il jumper dell'adattatore va impostato su 3.3 V, affinché i segnali TXD e RXD abbiano il livello logico di 3.3 V dei GPIO dell'ESP32. Le linee seriali si incrociano: TXD dell'adattatore va a U0R, e RXD dell'adattatore a U0T. Il ponticello tra IO0 e GND va messo solo durante il caricamento del programma.
| Pin prodotto | Si collega a | Ruolo |
|---|---|---|
| 5V | Alimentatore 5 VDC, morsetto + | Alimentazione scheda, minimo 2 A |
| GND (header 5V) | Alimentatore 5 VDC, morsetto - | Massa alimentazione |
| U0R (GPIO3) | FT232 TXD | Ricezione dati seriali sulla scheda |
| U0T (GPIO1) | FT232 RXD | Trasmissione dati seriali dalla scheda |
| GND (vicino a U0T) | FT232 GND | Massa comune con l'adattatore |
| IO0 | GND (pin vicino a IO0) | Ponticello temporaneo per la modalità di caricamento del programma |
L'immagine qui sotto mostra il collegamento della scheda al programmatore FT232.

Pulsanti, regolazioni e indicatori:
| Elemento | Cosa fa | Come si usa |
|---|---|---|
| Pulsante RESET | Riavvia il microcontrollore ESP32. | Si preme brevemente dopo aver collegato IO0 a GND per entrare in modalità di caricamento, poi dopo aver tolto il ponticello per eseguire il programma. |
| Ponticello IO0 - GND | Seleziona la modalità di avvio. | Inserito durante il reset, la scheda attende il caricamento di un programma. Rimosso durante il reset, la scheda esegue il programma dalla Flash. |
| LED bianco (flash) | Illumina la scena per la fotocamera, comandato da GPIO4. | Si accende quando GPIO4 è HIGH. Nel programma del tutorial resta spento. |
| LED rosso di stato | Indicatore sul retro della scheda, comandato da GPIO33. | Si accende quando GPIO33 è LOW. Non è usato dal programma del tutorial. |
Per il caricamento, collegate IO0 a GND, premete RESET e caricate il programma. La scheda è entrata nella modalità corretta se l'Arduino IDE avvia il caricamento senza l'errore di connessione.
Dopo il caricamento, rimuovete il ponticello tra IO0 e GND e premete RESET. La scheda esegue ora il programma e nel Serial Monitor compaiono i messaggi di avvio.
Il LED bianco resta spento nel programma. Se volete un'illuminazione supplementare, comandate GPIO4 dal codice, tenendo presente che il LED acceso alla luminosità massima aggiunge circa 130 mA al consumo. Nei nostri test, la scheda con fotocamera OV5640 ha consumato circa 340 - 360 mA a 5 V, con la fotocamera attiva e il LED spento.
Scheda e librerie:
Nell'Arduino IDE, andate su File - Preferences e aggiungete nel campo Additional Boards Manager URLs l'indirizzo https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json. Aprite poi Tools - Board - Boards Manager, cercate esp32 e installate il pacchetto esp32 by Espressif Systems, in una versione recente (2.0.x o successiva).
Dopo l'installazione, selezionate la scheda AI Thinker ESP32-CAM da Tools - Board - esp32. Le schermate qui sotto illustrano i passaggi di configurazione nell'Arduino IDE.
Non è necessario installare alcuna libreria dal Library Manager, perché esp_camera.h e WiFi.h sono inclusi nel pacchetto esp32 by Espressif Systems.
Il codice:
Il programma inizializza la fotocamera con la mappatura dei pin della scheda AI-Thinker, si connette alla rete WiFi e invia il flusso video JPEG a un client connesso sulla porta 80. Sostituite il nome e la password della rete prima del caricamento.
/*
ESP32-CAM (AI-Thinker) with OV5640 5MP camera - WiFi MJPEG video stream
Board selected in Arduino IDE: "AI Thinker ESP32-CAM" (Tools > Board > esp32)
Board package: esp32 by Espressif Systems (installed from Boards Manager)
Boards Manager URL (File > Preferences): https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
Libraries: none to install, esp_camera.h and WiFi.h come with the esp32 package
Upload wiring: FT232 TXD -> U0R, FT232 RXD -> U0T, FT232 GND -> GND,
5V supply (min 2 A) on the 5V pin, IO0 bridged to GND only during upload
*/
#include "esp_camera.h"
#include <WiFi.h>
// ---- Wi-Fi credentials (replace with your own) ----
const char* WIFI_SSID = "YOUR_WIFI_SSID";
const char* WIFI_PASSWORD = "YOUR_WIFI_PASSWORD";
// ---- AI-Thinker camera pin map ----
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
// White flash LED on GPIO4 (also SD card DATA1)
#define FLASH_LED_GPIO_NUM 4
WiFiServer server(80);
// Configure and start the camera
bool startCamera() {
camera_config_t config = {}; // start from a zeroed structure
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = Y2_GPIO_NUM;
config.pin_d1 = Y3_GPIO_NUM;
config.pin_d2 = Y4_GPIO_NUM;
config.pin_d3 = Y5_GPIO_NUM;
config.pin_d4 = Y6_GPIO_NUM;
config.pin_d5 = Y7_GPIO_NUM;
config.pin_d6 = Y8_GPIO_NUM;
config.pin_d7 = Y9_GPIO_NUM;
config.pin_xclk = XCLK_GPIO_NUM;
config.pin_pclk = PCLK_GPIO_NUM;
config.pin_vsync = VSYNC_GPIO_NUM;
config.pin_href = HREF_GPIO_NUM;
config.pin_sccb_sda = SIOD_GPIO_NUM;
config.pin_sccb_scl = SIOC_GPIO_NUM;
config.pin_pwdn = PWDN_GPIO_NUM;
config.pin_reset = RESET_GPIO_NUM;
config.xclk_freq_hz = 20000000; // 20 MHz clock for the sensor
config.pixel_format = PIXFORMAT_JPEG; // the sensor compresses the image itself
if (psramFound()) {
config.frame_size = FRAMESIZE_SVGA; // 800x600, a good balance for streaming
config.jpeg_quality = 12; // lower number = better quality, bigger file
config.fb_count = 2; // two frame buffers for smoother streaming
config.fb_location = CAMERA_FB_IN_PSRAM;
config.grab_mode = CAMERA_GRAB_LATEST; // always send the newest frame
Serial.println("PSRAM found, using SVGA with 2 frame buffers");
} else {
config.frame_size = FRAMESIZE_CIF;
config.jpeg_quality = 15;
config.fb_count = 1;
config.fb_location = CAMERA_FB_IN_DRAM;
config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
Serial.println("No PSRAM, using CIF with 1 frame buffer");
}
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK) {
Serial.printf("Camera init failed with error 0x%x\n", err);
return false;
}
// Read the sensor ID to confirm which camera is attached
sensor_t *s = esp_camera_sensor_get();
Serial.printf("Camera init OK, sensor PID: 0x%04X\n", s->id.PID);
if (s->id.PID != OV5640_PID) {
Serial.println("Warning: the attached sensor is not an OV5640");
}
return true;
}
// Read and ignore the HTTP request header sent by the browser
void skipRequest(WiFiClient &client) {
unsigned long start = millis();
while (client.connected() && millis() - start < 1000) {
if (client.available()) {
String line = client.readStringUntil('\n');
if (line.length() <= 1) break; // blank line ends the header
}
}
}
// Send frames to the client until it disconnects
void streamTo(WiFiClient &client) {
client.print("HTTP/1.1 200 OK\r\n");
client.print("Content-Type: multipart/x-mixed-replace; boundary=frame\r\n\r\n");
Serial.println("Streaming started");
uint32_t frames = 0;
while (client.connected()) {
camera_fb_t *fb = esp_camera_fb_get(); // get one JPEG frame
if (!fb) {
Serial.println("Frame capture failed");
break;
}
size_t len = fb->len;
client.print("--frame\r\n");
client.print("Content-Type: image/jpeg\r\n");
client.printf("Content-Length: %u\r\n\r\n", (unsigned)len);
size_t sent = client.write(fb->buf, len);
client.print("\r\n");
esp_camera_fb_return(fb); // give the buffer back to the driver
if (sent != len) break; // client is gone
frames++;
}
Serial.printf("Client disconnected after %u frames\n", (unsigned)frames);
}
void setup() {
Serial.begin(115200);
delay(500);
Serial.println();
Serial.println("ESP32-CAM OV5640 stream example");
// Keep the white flash LED off
pinMode(FLASH_LED_GPIO_NUM, OUTPUT);
digitalWrite(FLASH_LED_GPIO_NUM, LOW);
if (!startCamera()) {
return; // stop here if the camera did not start
}
// Connect to Wi-Fi
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
WiFi.setSleep(false); // no Wi-Fi power saving, better for streaming
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("WiFi connected, IP address: ");
Serial.println(WiFi.localIP());
Serial.print("Open http://");
Serial.print(WiFi.localIP());
Serial.println("/ in a browser to see the stream");
server.begin();
}
void loop() {
WiFiClient client = server.available(); // wait for a browser
if (client) {
Serial.println("Client connected");
skipRequest(client);
streamTo(client);
client.stop();
}
}
Come funziona il codice:
La prima parte contiene le definizioni. Le costanti WIFI_SSID e WIFI_PASSWORD memorizzano i dati della rete, mentre le righe con PWDN_GPIO_NUM, XCLK_GPIO_NUM, SIOD_GPIO_NUM, SIOC_GPIO_NUM, Y2_GPIO_NUM - Y9_GPIO_NUM, VSYNC_GPIO_NUM, HREF_GPIO_NUM e PCLK_GPIO_NUM descrivono i pin tra l'ESP32 e il connettore della fotocamera, gli stessi della tabella della descrizione. FLASH_LED_GPIO_NUM è GPIO4, e l'oggetto server resta in ascolto sulla porta 80.
La funzione startCamera() riempie la struttura camera_config_t con i pin della fotocamera, con il clock XCLK di 20 MHz e con il formato PIXFORMAT_JPEG. La struttura viene inizializzata vuota (= {}), in modo che i campi non impostati non contengano valori casuali. Se psramFound() restituisce vero, si sceglie FRAMESIZE_SVGA con due buffer di fotogrammi in PSRAM (fb_count = 2) e la modalità CAMERA_GRAB_LATEST, che invia sempre il fotogramma più recente. Altrimenti si sceglie FRAMESIZE_CIF con un solo buffer nella memoria interna. Dopo esp_camera_init() la funzione legge il sensore con esp_camera_sensor_get(), stampa l'identificativo PID, che per l'OV5640 è 0x5640, e avvisa se il sensore collegato è un altro.
La funzione skipRequest() legge e ignora l'intestazione della richiesta HTTP inviata dal browser, fino alla prima riga vuota. La funzione streamTo() invia l'intestazione multipart/x-mixed-replace, poi ripete in ciclo: acquisisce un fotogramma con esp_camera_fb_get(), invia il separatore, il tipo e la lunghezza, scrive i dati JPEG con client.write() e libera il buffer con esp_camera_fb_return(). Il ciclo si interrompe quando il client si disconnette.
In setup() si avvia Serial a 115200 baud, si mantiene spento il LED bianco, si richiama startCamera(), si connette la scheda al WiFi con WiFi.begin() e si visualizza l'indirizzo IP ricevuto. In loop() il programma attende un client con server.available() e, quando ne arriva uno, gli serve il flusso tramite streamTo().
Risultato:
Aprite il Serial Monitor a 115200 baud. Dopo l'avvio deve comparire la conferma dell'inizializzazione della fotocamera con PID 0x5640, poi l'indirizzo IP della scheda. Inserite l'indirizzo nel browser e comparirà l'immagine in tempo reale.
ESP32-CAM OV5640 stream example
PSRAM found, using SVGA with 2 frame buffers
Camera init OK, sensor PID: 0x5640
Connecting to WiFi......
WiFi connected, IP address: 192.168.1.57
Open http://192.168.1.57/ in a browser to see the stream
Client connected
Streaming started
Client disconnected after 412 frames
Problemi frequenti:
Il caricamento si interrompe con un errore di connessione. La causa comune è la modalità di avvio sbagliata. Verificate che IO0 sia collegato a GND, premete RESET prima del caricamento e verificate che TXD vada a U0R e RXD a U0T, non direttamente.
Dopo il caricamento non succede nulla e nel Serial Monitor compare un messaggio che attende il caricamento del programma. Il ponticello tra IO0 e GND è rimasto inserito. Rimuovetelo e premete RESET.
La scheda si riavvia continuamente oppure compare il messaggio Brownout detector was triggered. L'alimentazione è insufficiente, di solito perché la scheda è alimentata dal USB o da un alimentatore debole. Usate un alimentatore stabile da 5 VDC con minimo 2 A, con cavi corti.
Compare il messaggio Camera init failed con un codice di errore. Il cavo flat della fotocamera non è inserito completamente oppure la clip del connettore FPC non è chiusa. Scollegate l'alimentazione, reinserite il cavo con i contatti nella posizione corretta e chiudete la clip.
L'immagine presenta rumore o una tonalità violacea dopo un certo tempo di funzionamento. Il sensore OV5640 si è surriscaldato troppo. Montate un dissipatore sul retro della fotocamera, assicurate la ventilazione e riducete la risoluzione a SVGA o HD.
La scheda si collega al WiFi, ma l'immagine si blocca o ha pochi fotogrammi al secondo. Il segnale WiFi è debole oppure la risoluzione è troppo alta. Avvicinate la scheda al router e riducete la risoluzione nel codice.
Limitazioni e consigli:
Il modulo non è consigliato per lo streaming continuo 24 ore su 24, perché la fotocamera OV5640 si riscalda molto su questa scheda. Il motivo è che la scheda è stata progettata per la fotocamera OV2640 e alimenta il connettore della fotocamera con 3.3 V, 2.8 V e 1.2 V, mentre l'OV5640 alimenta il proprio nucleo da un regolatore interno da 1.5 V alimentato da 3.3 V. La differenza di tensione si trasforma in calore direttamente nel sensore, e oltre circa 50 gradi C possono comparire rumore e una tonalità violacea nell'immagine.
Senza modifiche hardware, usate un dissipatore sulla fotocamera, risoluzioni di al massimo SVGA o HD nello streaming, e mettete il sensore in standby tra un'acquisizione e l'altra tramite il registro 0x3008 (valore 0x42 per lo standby e 0x02 per l'attivo). Nei nostri test, il consumo della scheda è sceso da circa 338 mA a 163 mA con il sensore in standby. La risoluzione massima offerta dalla libreria, 2560 x 1920 pixel, è adatta alle fotografie.
Gli utenti con esperienza nella saldatura di componenti SMD possono ridurre il riscaldamento sostituendo il regolatore da 1.2 V vicino al connettore della fotocamera con uno da 1.5 V (ad esempio XC6206P152MR o ME6206A15XG) e disattivando via software il regolatore interno del sensore, tramite il bit 3 del registro 0x3031 (valore 0x08), subito dopo esp_camera_init(). Dopo questa modifica, il dissipatore della fotocamera è rimasto visibilmente più freddo nei nostri test.
// Only on a board where the DVDD regulator was replaced with a 1.5 V one
sensor_t *s = esp_camera_sensor_get();
if (s->id.PID == OV5640_PID) {
s->set_reg(s, 0x3031, 0x08, 0x08); // bypass the internal 1.5 V core regulator
}
Non disattivate il regolatore interno su una scheda non modificata, perché il nucleo del sensore funzionerebbe sotto la tensione minima, con rischio di immagini corrotte e blocchi. Una scheda modificata non è più adatta alla fotocamera OV2640 e va contrassegnata in modo appropriato.
Partendo da questo tutorial potete costruire una telecamera di sorveglianza con accesso dal browser, un sistema di fotografia periodica con salvataggio su scheda microSD, oppure un progetto di riconoscimento di oggetti, usando i GPIO liberi per sensori di movimento o altri moduli.