Abstract
L’OV2640 è un sensore d’immagine CMOS da 2 megapixel progettato per sistemi embedded. Non è una semplice matrice fotosensibile: integra conversione analogico-digitale, elaborazione dell’immagine, controllo automatico di esposizione e guadagno, correzioni cromatiche, ridimensionamento e compressione JPEG. La configurazione avviene tramite un’interfaccia seriale SCCB, mentre le immagini vengono trasferite al dispositivo di controllo attraverso una porta video digitale parallela.
La presenza del compressore JPEG interno permette di utilizzare il sensore con microcontrollori dotati di memoria e capacità di calcolo limitate. Rimangono tuttavia vincoli rilevanti: larghezza di banda del bus, quantità e velocità della memoria, qualità dell’ottica, illuminazione, alimentazione e velocità della rete. L’OV2640 è quindi adatto a fotografia remota, robotica, acquisizione periodica, lettura di strumenti, controllo visivo e semplici applicazioni di visione artificiale, ma non sostituisce una moderna videocamera ad alta dinamica o un sistema industriale di machine vision.
Parole chiave
OV2640, sensore CMOS, camera embedded, JPEG, SCCB, DVP, ESP32, acquisizione immagini, visione artificiale.
Sensore, modulo e scheda di controllo
Con il nome OV2640 vengono spesso indicati tre oggetti differenti:
- il circuito integrato prodotto da OmniVision;
- il modulo composto da sensore, circuito stampato, cavo flessibile e obiettivo;
- la scheda elettronica che riceve e utilizza le immagini, per esempio un sistema basato su ESP32, ESP32-S2 o ESP32-S3.
Il sensore nudo richiede alimentazioni distinte: circa 1,2 V per il nucleo digitale, tra 2,5 e 3,0 V per la sezione analogica e tra 1,7 e 3,3 V per gli ingressi e le uscite. Un modulo commerciale può includere regolatori, condensatori e adattamenti elettrici, ma ciò dipende dal costruttore. La scritta “5 V” presente su alcune schede camera riguarda quindi la scheda completa, non l’alimentazione diretta del circuito OV2640.
Anche l’obiettivo non fa parte delle caratteristiche immutabili del sensore. Moduli apparentemente identici possono avere focali, angoli di campo, messa a fuoco e filtri infrarossi differenti. Due moduli OV2640 possono quindi produrre immagini sensibilmente diverse pur utilizzando lo stesso circuito integrato.
Matrice fotosensibile e risoluzione
La matrice fisica comprende 1632 × 1232 elementi, mentre l’area normalmente utilizzata per l’immagine è pari a 1600 × 1200 pixel, corrispondente alla risoluzione UXGA e a circa 1,92 megapixel effettivi. Il formato ottico è indicato come 1/4 di pollice e ogni pixel misura 2,2 × 2,2 µm.
La dimensione nominale del formato ottico non rappresenta la diagonale fisica del sensore. È una classificazione storica proveniente dai vecchi tubi da ripresa e viene ancora utilizzata per descrivere la compatibilità tra sensori e ottiche.
Il sensore può fornire l’intero fotogramma oppure applicare internamente:
- selezione di una finestra;
- ritaglio;
- sottocampionamento;
- ridimensionamento;
- spostamento dell’area acquisita;
- variazione del numero di righe e colonne trasmesse.
Le risoluzioni comunemente utilizzate comprendono UXGA, SXGA, XGA, SVGA, VGA, CIF, QVGA e formati inferiori. Il circuito può inoltre produrre dimensioni non standard attraverso i registri di scaling e windowing. Il datasheet dichiara la possibilità di ridurre l’immagine fino a 40 × 30 pixel.
Ridurre la risoluzione non significa semplicemente eliminare la parte esterna dell’immagine. A seconda della configurazione, il sensore può ritagliare, sottocampionare oppure scalare il fotogramma. Le tre operazioni producono risultati differenti in termini di campo visivo, dettaglio, aliasing e rumore.
Catena interna di elaborazione
L’OV2640 integra una catena di acquisizione quasi completa:
- matrice fotosensibile;
- circuiti di selezione e campionamento delle righe e delle colonne;
- amplificazione analogica;
- convertitori analogico-digitali a 10 bit;
- compensazione del livello del nero;
- processore digitale dell’immagine;
- formatore dei dati;
- motore di compressione;
- porta video digitale.
Sono inoltre presenti un generatore di temporizzazioni, una PLL, una memoria di registri, un’interfaccia SCCB e un piccolo microcontrollore interno.
Il processore digitale non deve essere confuso con il microcontrollore esterno. Il DSP interno opera sui pixel e può eseguire interpolazione cromatica, conversione dello spazio colore, correzione gamma, riduzione del rumore, regolazione della saturazione, miglioramento dei bordi e compensazioni dell’immagine. Il dispositivo esterno riceve quindi dati già elaborati, salvo quando viene selezionata un’uscita RAW.
SCCB: configurazione del sensore
L’interfaccia SCCB, Serial Camera Control Bus, utilizza i segnali
SIO_C e SIO_D. Serve a leggere e scrivere i
registri interni del sensore.
Attraverso SCCB vengono configurati, tra gli altri:
- risoluzione;
- formato dei pixel;
- esposizione;
- guadagno;
- bilanciamento del bianco;
- compressione;
- frequenza dei fotogrammi;
- polarità dei segnali;
- orientamento dell’immagine;
- luminosità, contrasto e saturazione;
- effetti cromatici;
- modalità di standby e reset.
SCCB non trasporta normalmente il contenuto del fotogramma. Tentare di acquisire un’immagine attraverso i soli collegamenti seriali di configurazione sarebbe come voler scaricare un film attraverso il filo del telecomando.
Porta video digitale
I dati dell’immagine vengono trasferiti tramite una porta parallela, frequentemente indicata come DVP, Digital Video Port.
I principali segnali sono:
XCLKoXVCLK: clock fornito dal dispositivo esterno al sensore;PCLK: clock associato ai pixel in uscita;VSYNC: sincronizzazione del fotogramma;HREF: indicazione dell’intervallo contenente pixel validi;D0–D7: bus parallelo utilizzato normalmente dai moduli a 8 bit;PWDN: spegnimento o standby hardware;RESET: reset del sensore.
A ogni fronte valido di PCLK, il controllore campiona il byte
presente sul bus dati. HREF identifica la porzione valida di
ciascuna riga, mentre VSYNC delimita il fotogramma. La polarità
e il fronte attivo di alcuni segnali possono essere modificati mediante i
registri del sensore.
La ricezione richiede quindi una periferica capace di campionare rapidamente più linee GPIO sincronizzate. Un normale ciclo di lettura software dei pin non è sufficiente alle frequenze operative previste. Sui sistemi ESP32 l’acquisizione viene effettuata attraverso periferiche dedicate e trasferimenti DMA verso i buffer di memoria. Il driver Espressif inizializza il bus di controllo, la ricezione parallela, i buffer e i descrittori DMA.
Formati di uscita
L’OV2640 può produrre dati in differenti formati:
- RAW RGB a 8 o 10 bit;
- RGB565;
- RGB555;
- YUV 4:2:2;
- YUV 4:2:0;
- YCbCr 4:2:2;
- flusso compresso JPEG.
La disponibilità effettiva di ciascun formato dipende dal driver, dal collegamento elettrico e dalla modalità selezionata. Il driver ufficiale Espressif indica per l’OV2640 una risoluzione massima di 1600 × 1200 e il supporto per formati RGB, YUV, RAW e dati compressi a 8 bit.
RGB565 utilizza 16 bit per pixel: 5 bit per il rosso, 6 per il verde e 5 per il blu. YUV422 utilizza mediamente 16 bit per pixel, ma separa la luminanza dalle componenti cromatiche e condivide parte delle informazioni di colore tra pixel adiacenti.
Il formato RAW conserva informazioni più vicine all’uscita della matrice, ma richiede elaborazione successiva per ricostruire un’immagine utilizzabile. JPEG riduce invece drasticamente la quantità di dati da memorizzare o trasmettere, introducendo una perdita controllata di informazione.
Compressione JPEG interna
Uno degli elementi che distingue l’OV2640 da sensori più semplici è il motore di compressione integrato. Il blocco comprende trasformata discreta del coseno, quantizzazione e codifica entropica. Il sensore può quindi emettere direttamente un’immagine JPEG senza chiedere al microcontrollore di comprimere un intero fotogramma RGB.
Questa caratteristica è decisiva nei sistemi embedded. Un’immagine UXGA RGB565 non compressa richiede:
1600 × 1200 × 2 = 3.840.000 byte
Un solo fotogramma occupa quindi circa 3,84 MB, oppure 3,66 MiB. A 15 fotogrammi al secondo il flusso teorico dei soli pixel raggiunge:
3.840.000 × 15 = 57.600.000 byte/s
Sono 57,6 MB/s, senza considerare buffer, copie in memoria, intervalli di sincronizzazione e traffico di rete.
La dimensione di un JPEG non è fissa. Dipende dalla risoluzione, dal parametro di qualità, dal rumore e dal contenuto dell’immagine. Una superficie uniforme si comprime molto meglio di foglie, capelli, erba, testo minuto o rumore elettronico.
L’OV2640 non produce H.264 o H.265. Lo “streaming video” realizzato con questi moduli è frequentemente una sequenza di immagini JPEG trasmesse in successione, cioè MJPEG. È una soluzione semplice e facilmente visualizzabile da un browser, ma meno efficiente dei codec video che sfruttano anche le somiglianze tra fotogrammi consecutivi.
Frequenza dei fotogrammi
Il datasheet indica valori massimi nominali pari a:
- 15 fps in UXGA;
- 30 fps in SVGA;
- 60 fps in CIF.
Questi valori descrivono il funzionamento del sensore in determinate condizioni e non garantiscono la stessa velocità al termine dell’intera catena di acquisizione, elaborazione, memorizzazione e trasmissione.
La frequenza reale dipende da:
- frequenza di
XCLK; - configurazione della PLL;
- divisori interni;
- risoluzione;
- formato;
- qualità JPEG;
- tempo di esposizione;
- numero di buffer;
- velocità della memoria;
- carico del processore;
- attività Wi-Fi;
- protocollo di trasmissione;
- velocità del destinatario.
Il sensore consente di modificare il frame rate attraverso il prescaler del clock, l’aggiunta di periodi inattivi orizzontali e l’aggiunta di righe inattive verticali. In questo modo è possibile ridurre la frequenza dei fotogrammi senza necessariamente modificare nello stesso modo la frequenza istantanea del bus dati.
Esposizione, guadagno e bilanciamento del bianco
L’OV2640 include controlli automatici per:
- esposizione, AEC;
- guadagno, AGC;
- bilanciamento del bianco, AWB;
- livello del nero;
- rilevamento dello sfarfallio a 50 e 60 Hz;
- filtraggio del rumore;
- correzione gamma;
- saturazione;
- tonalità;
- nitidezza;
- correzione dell’obiettivo.
Queste funzioni possono essere lasciate in modalità automatica oppure, entro i limiti del driver, controllate manualmente.
L’esposizione determina per quanto tempo i pixel accumulano carica. Un’esposizione lunga migliora la luminosità in condizioni difficili, ma aumenta il rischio di mosso. Il guadagno amplifica il segnale dopo l’acquisizione e rende l’immagine più chiara, ma amplifica anche rumore e difetti.
Il bilanciamento automatico del bianco cerca di compensare la temperatura cromatica della sorgente luminosa. In una sequenza temporale può però produrre variazioni cromatiche tra immagini consecutive. Per confronti quantitativi o acquisizioni ripetibili può essere preferibile stabilizzare prima la scena e poi bloccare esposizione, guadagno e bilanciamento.
Memoria, DMA e PSRAM
Il fotogramma ricevuto deve essere collocato in memoria. La quantità necessaria dipende dal formato e dalla risoluzione.
Un’immagine VGA RGB565 occupa:
640 × 480 × 2 = 614.400 byte
Una singola immagine richiede quindi circa 600 KiB. Due buffer superano 1,2 MB, senza contare sistema operativo, rete, stack, heap e applicazione.
Per questo motivo molte schede camera utilizzano PSRAM esterna. Il driver Espressif segnala che, salvo JPEG a risoluzione CIF o inferiore, è normalmente necessaria PSRAM attiva. L’acquisizione diretta in YUV o RGB sottopone inoltre memoria e processore a un carico elevato e può causare perdita di dati, soprattutto quando il Wi-Fi è attivo.
Con un solo frame buffer il driver attende l’inizio del fotogramma, acquisisce l’immagine e restituisce il buffer all’applicazione. Con due o più buffer la ricezione può funzionare in modo continuo, aumentando la frequenza ottenibile ma anche il carico su memoria e processore. Espressif raccomanda l’uso di più buffer soprattutto con JPEG.
Un buffer acquisito mediante esp_camera_fb_get() deve essere
restituito con esp_camera_fb_return(). Dimenticare questa
operazione esaurisce i buffer disponibili e blocca le acquisizioni
successive. La struttura restituita contiene puntatore ai dati, lunghezza,
larghezza, altezza, formato e timestamp.
Qualità reale dell’immagine
La risoluzione nominale non determina da sola la qualità. Sul risultato incidono:
- dimensione e qualità dell’obiettivo;
- precisione della messa a fuoco;
- filtro infrarosso;
- pulizia della lente;
- luce disponibile;
- contrasto della scena;
- vibrazioni;
- esposizione;
- guadagno;
- compressione;
- alimentazione;
- temperatura;
- taratura dei registri del sensore.
Il datasheet preliminare dichiara un rapporto segnale-rumore di 40 dB e una gamma dinamica di 50 dB nelle condizioni di prova indicate dal produttore. Questi valori non rendono il sensore adatto a scene estreme con zone contemporaneamente molto scure e molto luminose.
L’aumento della nitidezza digitale non crea dettaglio ottico. Amplifica i contorni e può rendere più evidenti rumore e artefatti JPEG. Analogamente, un JPEG impostato alla massima qualità può diventare molto grande senza recuperare informazioni perse dall’ottica, dal mosso o dalla saturazione dei pixel.
Possibili applicazioni
Acquisizione remota
- scatto su comando;
- fotografia periodica;
- timelapse;
- documentazione di esperimenti;
- controllo dello stato di un locale o di un impianto;
- registrazione su scheda SD;
- invio a un server locale o remoto.
Robotica
- telecamera frontale per rover;
- guida manuale a distanza;
- rilevamento di ostacoli;
- riconoscimento di marcatori;
- inseguimento di oggetti colorati;
- verifica della posizione di un braccio o di un utensile;
- lettura di codici applicati all’ambiente.
Controllo tecnico
- lettura di display;
- controllo di spie luminose;
- verifica della posizione di indicatori meccanici;
- lettura approssimata di strumenti analogici;
- documentazione dello stato di quadri elettrici;
- controllo di livelli, sportelli o meccanismi;
- verifica visiva dopo un comando remoto.
Visione artificiale embedded
- classificazione di un numero limitato di oggetti;
- rilevamento di presenza o assenza;
- conteggio in scene controllate;
- confronto con un’immagine di riferimento;
- individuazione di colori e forme;
- riconoscimento di semplici gesti;
- TinyML a bassa risoluzione.
Sicurezza e controllo accessi
- citofonia video;
- fotografia associata a un evento;
- controllo di una porta o di un cancello;
- verifica remota prima di azionare un dispositivo;
- documentazione di un allarme.
Non deve però essere considerato un dispositivo di sicurezza certificato. Autenticazione biometrica, riconoscimento facciale affidabile e identificazione forense richiedono sensori, ottiche, illuminazione e procedure di livello differente.
Ricerca, didattica e laboratorio
- studio delle interfacce video parallele;
- analisi dei formati RGB, YUV e JPEG;
- misure sperimentali sulla compressione;
- studio di esposizione e guadagno;
- realizzazione di microscopi economici;
- osservazione di processi lenti;
- sviluppo di algoritmi di elaborazione;
- prototipazione di sistemi di visione distribuita.
Limiti applicativi
L’OV2640 è poco adatto quando servono:
- elevata gamma dinamica;
- dettagli fini in scarsa illuminazione;
- riprese di oggetti molto veloci;
- autofocus;
- zoom ottico;
- video H.264 ad alta efficienza;
- risoluzione superiore a 1600 × 1200;
- misure fotometriche calibrate;
- OCR affidabile di caratteri piccoli;
- identificazione biometrica;
- sincronizzazione precisa di più camere;
- elaborazione industriale ad alta velocità;
- funzionamento senza una progettazione termica ed elettrica adeguata.
Una camera economica può verificare che una lancetta si trovi grossomodo nella zona corretta. Non diventa per magia uno strumento metrologico perché il software disegna una cifra con sei decimali.
Sketch generico di acquisizione
Lo sketch seguente mostra il flusso minimo: inizializzazione, acquisizione di un JPEG, accesso al buffer e restituzione della memoria.
Il file camera_pins.h deve contenere la mappatura specifica
della scheda utilizzata. Non esiste un pinout universale valido per
ESP32-CAM, XIAO ESP32S3 Sense e tutti gli altri moduli.
#include "esp_camera.h"
#include "camera_pins.h"
void setup() {
camera_config_t camera = {};
camera.pin_pwdn = CAM_PWDN;
camera.pin_reset = CAM_RESET;
camera.pin_xclk = CAM_XCLK;
camera.pin_sccb_sda = CAM_SIOD;
camera.pin_sccb_scl = CAM_SIOC;
camera.pin_d0 = CAM_D0;
camera.pin_d1 = CAM_D1;
camera.pin_d2 = CAM_D2;
camera.pin_d3 = CAM_D3;
camera.pin_d4 = CAM_D4;
camera.pin_d5 = CAM_D5;
camera.pin_d6 = CAM_D6;
camera.pin_d7 = CAM_D7;
camera.pin_vsync = CAM_VSYNC;
camera.pin_href = CAM_HREF;
camera.pin_pclk = CAM_PCLK;
camera.xclk_freq_hz = 20000000;
camera.ledc_timer = LEDC_TIMER_0;
camera.ledc_channel = LEDC_CHANNEL_0;
camera.pixel_format = PIXFORMAT_JPEG;
camera.frame_size = FRAMESIZE_VGA;
camera.jpeg_quality = 12;
camera.fb_count = 1;
camera.fb_location = CAMERA_FB_IN_PSRAM;
camera.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
if (esp_camera_init(&camera) != ESP_OK) {
while (true) {}
}
camera_fb_t *frame = esp_camera_fb_get();
if (frame != nullptr) {
// JPEG disponibile in frame->buf
// Dimensione disponibile in frame->len
esp_camera_fb_return(frame);
}
}
void loop() {}
Nel driver Espressif il parametro jpeg_quality utilizza una
scala da 0 a 63 nella quale un valore numericamente più basso indica una
qualità maggiore. fb_count stabilisce il numero di buffer
disponibili, mentre CAMERA_GRAB_WHEN_EMPTY riempie un buffer
quando questo torna libero.
Lo sketch non salva né trasmette l’immagine: individua esattamente il
punto nel quale il JPEG è disponibile. Il contenuto compreso tra
frame->buf e
frame->buf + frame->len può essere scritto su memoria,
inviato tramite rete oppure elaborato, purché l’operazione termini prima
della restituzione del buffer.
Prove in aria libera e limiti ambientali
Un modulo OV2640 montato su una scheda di sviluppo non costituisce, da solo, una telecamera destinata all’installazione permanente. La scheda presenta normalmente circuito stampato, connettori, componenti e contatti elettrici esposti. In assenza di un contenitore qualificato non può quindi essere attribuito alcun grado di protezione IP contro polvere, contatto accidentale o acqua: la classificazione IP riguarda infatti la protezione fornita dall’involucro, non il solo circuito elettronico.
Nelle prove sperimentali considerate, il sistema ha funzionato correttamente in aria libera con temperature ambiente comprese approssimativamente tra 0 e 40 °C. Le acquisizioni sono state eseguite a risoluzione ridotta, con un carico su memoria, processore e trasmissione inferiore rispetto all’acquisizione continua in UXGA o allo streaming ad alta frequenza.
Questo risultato deve essere interpretato come una verifica funzionale nelle specifiche condizioni di prova, non come una qualificazione ambientale. Non dimostra automaticamente:
- funzionamento continuativo per mesi o anni;
- resistenza a pioggia, polvere, condensa o nebbia;
- resistenza ai raggi ultravioletti e alla corrosione;
- funzionamento agli estremi termici dichiarati dai singoli componenti;
- stabilità con risoluzione, frame rate o trasmissione radio più elevati;
- conformità a norme industriali, automobilistiche o di sicurezza.
La condensa rappresenta un rischio particolarmente importante. Può formarsi anche entro l’intervallo 0–40 °C quando la temperatura della scheda o dell’ottica scende sotto il punto di rugiada. Umidità, residui superficiali e tensioni elettriche possono provocare correnti parassite, ossidazione e malfunzionamenti intermittenti.
Anche l’irraggiamento solare deve essere distinto dalla temperatura dell’aria. Una scheda esposta al sole può raggiungere temperature sensibilmente superiori a quella ambiente, mentre un contenitore chiuso può ridurre la ventilazione e trattenere il calore prodotto dal regolatore, dal microcontrollore e dalla trasmissione Wi-Fi.
Le eventuali certificazioni del chip, del modulo radio o dei singoli componenti non certificano automaticamente la telecamera completa. Cablaggio, alimentatore, antenna, software, contenitore e modalità d’installazione fanno parte del prodotto finale e possono richiedere verifiche proprie.
Per un impiego esterno stabile occorrono almeno un contenitore adeguato, una finestra ottica trasparente e non deformante, protezione dalla condensa, passaggi cavo sigillati e una verifica delle temperature effettive raggiunte dalla scheda. Il contenitore protegge l’elettronica, ma introduce nuovi problemi: riflessi, appannamento, accumulo di calore, sporco davanti all’obiettivo e possibile alterazione del campo visivo.
Le prove effettuate dimostrano quindi che un sistema OV2640 può funzionare in aria libera tra circa 0 e 40 °C nelle condizioni sperimentate. Non dimostrano che la stessa configurazione sia adatta, senza ulteriori protezioni e verifiche, a un’installazione esterna permanente.
Conclusioni
L’OV2640 integra in un singolo sensore una matrice da 2 megapixel, conversione analogico-digitale, elaborazione dell’immagine, controlli automatici e compressione JPEG. Questa integrazione riduce il carico sul dispositivo esterno e rende possibile acquisire e trasmettere immagini con microcontrollori dotati di risorse relativamente limitate.
Le prestazioni reali non dipendono però soltanto dal sensore. Memoria, DMA, clock, numero di buffer, formato, ottica, illuminazione, rete e alimentazione determinano il risultato complessivo. UXGA descrive la quantità massima di pixel; non garantisce automaticamente dettaglio, fluidità o qualità.
Utilizzato entro i suoi limiti, l’OV2640 rimane una soluzione efficace per fotografia remota, robotica, ispezione visiva, didattica e semplici sistemi di visione embedded. Utilizzato fuori da tali limiti, produce soprattutto fotogrammi grandi, lenti e rumorosi: megapixel sulla scatola, problemi nel circuito.
Fonti principali
OmniVision Technologies, OV2640 Color CMOS UXGA CAMERACHIP, Preliminary Datasheet, versione 1.6
Espressif Systems, driver ufficiale esp32-camera
Espressif Systems, DVP e soluzioni camera per sistemi embedded
OMNIVISION, documentazione tecnica relativa all’OV2640
IEC 60529, gradi di protezione degli involucri mediante codice IP.