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, Wi-Fi, Bluetooth, OV5640 5MP
Soluzione compatta per progetti di visione artificiale, streaming video e IoT, con connettività WiFi 802.11b/g/n e Bluetooth 4.2 LE per applicazioni wireless. Integra un processore dual core fino a 240MHz e 4MB PSRAM per l'elaborazione rapida delle immagini, una camera OV5640 da 5MP per fotogrammi dettagliati, supporto per scheda TF e formati JPEG, BMP, grayscale, compatibile con Arduino IDE per uno sviluppo rapido.
Spedito entro mercoledì 11 novembre
Acquistando questo prodotto guadagni 0,81 € 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 flat 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 in modo autonomo, inviando immagini e flussi video in rete tramite WiFi, oppure può essere programmata per rispondere a comandi ricevuti via UART, risultando adatta a sorveglianza, riconoscimento oggetti, monitoraggio remoto e scatto automatico.
Il processore è un ESP32 dual core LX6 a 32 bit, con frequenza di lavoro tra 80 e 240 MHz e una potenza di calcolo fino a 600 DMIPS. La memoria interna da 520 KB SRAM è completata da 4 MB di PSRAM esterna, necessaria per elaborare immagini ad alta risoluzione prima della compressione e della 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 alimentazione, GPIO liberi e interfaccia UART, e un pulsante di RESET. L’alimentazione avviene a 5 VDC sul pin 5V, con un’alimentazione stabile di 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 immagini e flusso video possono essere accessibili direttamente da un browser su qualsiasi computer o telefono della rete locale. I pin GPIO rimasti liberi consentono il collegamento di sensori o moduli aggiuntivi compatibili con Arduino, ESP32, STM32 o Raspberry Pi, utilizzando il livello logico a 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 in Deep-sleep: minimo 6 mA
Assorbimento in Modem-sleep: minimo 20 mA
Assorbimento in Light-sleep: minimo 6.7 mA
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à operative di rete: STA / AP / STA+AP
Smart Config / AirKiss: Sì
Aggiornamento FOTA: Sì
Programmatore incluso: No, richiede un adattatore esterno (consigliato FT232 o equivalente)
Dimensioni: 42 x 27 x 12 mm
ATTENZIONE!
Leggere attentamente prima di acquistare
Camera OV5640 (lotto attuale)
Questo modulo viene fornito con la camera OV5640 (5MP) al posto della OV2640, a causa di problemi di approvvigionamento di camere OV2640 di buona qualità. Il sensore si riscalda molto durante il funzionamento e può diventare caldo al tatto. Si tratta di un comportamento normale per questa combinazione scheda-camera, non di 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 da 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 regolatore interno da 1.5V, alimentato dalla tensione di 3.3V. La differenza di tensione si trasforma in calore direttamente all’interno del sensore, per questo il modulo si scalda molto durante il funzionamento continuo. Sopra 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, seguita 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)
Utilizzo
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 montate al suo posto il regolatore da 1.5V, dopo aver verificato nel datasheet che i pin VIN, VOUT e GND corrispondano ai pad.
Alimentate la scheda senza 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 sotto).
Verificate nel Serial Monitor che il registro 0x3031 abbia valore 0x08.
Facoltativamente, 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 perché la camera raggiunge comunque, durante il funzionamento, circa 50 gradi C.
Alternativa senza saldatura
Montate un dissipatore sulla camera, utilizzate nello stream risoluzioni non superiori a SVGA o HD e mettete il sensore in standby tra una cattura e l’altra (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 sotto la 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 in modo appropriato. 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 è controllato da GPIO4. Si accende quando GPIO4 è HIGH e si spegne quando GPIO4 è LOW. |
| LED rosso di stato | LED sul retro della scheda, controllato 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 flat della camera OV5640. |
| Camera OV5640 | Modulo camera da 5 MP, montato separatamente dalla scheda e collegato tramite cavo flat. |
| 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 alimentazione, GPIO liberi e 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 dalla memoria Flash. |
| Pulsante RESET | Resetta il microcontrollore ESP32. Va premuto dopo aver collegato IO0 a GND per entrare in modalità di caricamento e dopo aver rimosso il ponticello per eseguire il programma. |
| Regolatore di tensione | Converte l’alimentazione da 5 V nella tensione da 3.3 V necessaria ai circuiti della scheda. |
| Fori di montaggio | Due fori tra le file di pin, per fissare la 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 caricare il 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 sensore |
| SIOC (SCL) | GPIO27 | I2C / SCCB, configurazione sensore |
| PWDN | GPIO32 | Power-down del sensore, HIGH per spegnimento tra acquisizioni |
Utilizzo:
Se il modulo camera non è già montato, fissarlo al connettore FPC della scheda rispettando l’orientamento dei contatti e chiudere la linguetta 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 scalda molto durante il funzionamento e può diventare caldo al tatto; questo è un comportamento normale per questa combinazione scheda-camera.
Assicurare una buona ventilazione attorno al modulo e non utilizzarlo in un contenitore chiuso senza circolazione d’aria.
Alimentare la scheda a 5 VDC, minimo 2 A, sul pin 5V, usando un’alimentazione stabile, e non alimentare il modulo dall’uscita da 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 completare nome rete WiFi e password.
Prima del caricamento, collegare temporaneamente il pin IO0 a GND, premere il pulsante RESET e caricare il programma.
Dopo il caricamento, rimuovere il ponticello 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 foto. Se si eseguono acquisizioni periodiche, mettere il sensore in spegnimento tra uno scatto e l’altro portando GPIO32 su HIGH.
Se si usa la scheda microSD, tenere presente che i pin IO2, IO4, IO12, IO13, IO14 e IO15 sono occupati dalla scheda, e IO4 controlla anche il LED bianco.
Il modulo non è consigliato per streaming continuo 24 ore su 24. Per risultati stabili utilizzare un buon alimentatore, cavi di alimentazione corti e una rete WiFi con segnale forte nel luogo 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 (Flash LED oprit) / 310 mA (Flash LED pornit)
- Memoria
- 4 MB PSRAM
- Processore
- Dual core LX6, 32 bit
- WiFi
- 802.11 b/g/n
- Bluetooth
- 4.2 LE
- Consumo in standby
- 6 mA (Deep-sleep)
- Memoria SRAM
- 520 KB
- Frequenza del processore
- 80-240 MHz
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, utilizzato per acquisire e trasmettere immagini via WiFi senza altri componenti aggiuntivi. Si impiega in progetti di sorveglianza, monitoraggio a distanza, fotografia automatica e riconoscimento di immagini.
Il tutorial utilizza 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 avviene separatamente, da un alimentatore da 5 VDC con almeno 2 A. Il programma avvia la fotocamera e serve un flusso video tramite un semplice server web.

Come funziona:
Il sensore OV5640 cattura 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 inserisce facilmente in 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 almeno 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: il TXD dell'adattatore va a U0R, mentre l'RXD dell'adattatore va a U0T. Il ponticello tra IO0 e GND va inserito solo durante il caricamento del programma.
| Pin del prodotto | Si collega a | Funzione |
|---|---|---|
| 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 seguente 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 rimosso 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 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 conto che il LED acceso alla massima luminosità aggiunge circa 130 mA al consumo. Nei nostri test, la scheda con fotocamera OV5640 ha consumato circa 340 - 360 mA a 5 V, con fotocamera attiva e 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 passi di configurazione nell'Arduino IDE.
Non serve installare alcuna libreria dal Library Manager, perché esp_camera.h e WiFi.h sono inclusi nel pacchetto esp32 by Espressif Systems.
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, mentre l'oggetto server ascolta 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 parte azzerata (= {}), in modo che i campi non impostati non contengano valori casuali. Se psramFound() restituisce vero, si sceglie FRAMESIZE_SVGA con due buffer di fotogramma nella 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(), mostra l'identificatore 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: prende 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 chiama startCamera(), si connette la scheda al WiFi con WiFi.begin() e si mostra 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 sull'attesa del 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 dall'USB o da un alimentatore debole. Usate un alimentatore stabile da 5 VDC con almeno 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 è riscaldato troppo. Montate un dissipatore sul retro della fotocamera, assicurate la ventilazione e riducete la risoluzione a SVGA o HD.
La scheda si connette 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 a sua volta 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 massimo SVGA o HD nello streaming e portate il sensore in standby tra una cattura e l'altra tramite il registro 0x3008 (valore 0x42 per standby e 0x02 per 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 (per 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 deve essere contrassegnata in modo appropriato.
Sulla base di 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, utilizzando i GPIO liberi per sensori di movimento o altri moduli.