Le module caméra OV7670 est un capteur d’image complet sur une carte de quelques centimètres : une lentille, le capteur CMOS 0,3 mégapixel, ses régulateurs et son connecteur. Il sort une image VGA 640 × 480 en 8 bits parallèles, et se configure par un bus de commande de deux fils.
C’est la caméra la plus abordable de la robotique amateur : on l’utilise pour la vision d’un robot suiveur, un compteur de passages, un système de surveillance ou simplement pour comprendre comment une image se fabrique, pixel par pixel. Le module est livré seul, sans carte de traitement et sans mémoire d’image — tout le travail de lecture se fait sur le microcontrôleur.
Ce que fait le module
Le capteur convertit la lumière en nombres. Deux signaux encadrent chaque image et chaque ligne (VSYNC pour la trame, HREF pour la ligne), et une horloge de pixel PCLK cadence la sortie des octets sur les huit lignes D0 à D7. En parallèle, un bus de commande compatible I2C — appelé SCCB chez Omnivision — permet de régler la résolution, le format de couleur, la luminosité, le contraste et le reste des fonctions automatiques.
Il n’y a pas de mémoire tampon d’image sur ce module (les versions à mémoire, dites FIFO, ont une puce supplémentaire et une référence différente). Conséquence importante : l’image n’est disponible que pendant qu’elle défile. Un microcontrôleur rapide la lit en temps réel ; un Arduino Uno ou Mega peut en lire une partie, à cadence réduite, ce qui reste largement suffisant pour apprendre, compter des objets ou détecter un mouvement.
Caractéristiques techniques
| Capteur | OV7670 — CMOS 0,3 mégapixel, couleur |
|---|---|
| Résolution maximale | 640 × 480 (VGA), 30 images par seconde |
| Formats de sortie | YUV / YCbCr 4:2:2, RGB565, RGB555, RGB444, GRB 4:2:2, Raw RGB |
| Bus de données | 8 bits parallèles — D0 à D7 |
| Bus de commande | SCCB, compatible I2C — adresse 7 bits 0x21 |
| Horloge d’entrée | XCLK, fournie par le microcontrôleur — de 10 à 48 MHz (24 MHz typique) |
| Alimentation | 3,3 V sur la broche 3V3 — régulateurs 2,8 V et 1,8 V intégrés au module |
| Consommation | Environ 60 mW en marche |
| Optique | Format 1/6 pouce, lentille F1.8 / 6 mm, champ de vision d’environ 25° |
| Fonctions automatiques | Exposition (AEC), gain (AGC), balance des blancs (AWB), anti-scintillement 50/60 Hz |
| Réglages logiciels | Saturation, teinte, gamma, netteté, réduction du bruit, correction des défauts |
| Température de service | −30 °C à +70 °C |
| Connecteur | 2 rangées de 9 broches au pas de 2,54 mm, 18 signaux |
Le connecteur : 18 broches, 2 × 9
Les deux rangées se lisent ensemble, colonne par colonne. Chaque broche porte son nom en sérigraphie sur la carte :
| Broche impaire | Broche paire |
|---|---|
1 — 3V3 — alimentation 3,3 V | 2 — GND — masse |
3 — SIO_C — horloge du bus SCCB | 4 — SIO_D — données du bus SCCB |
5 — VSYNC — début de trame | 6 — HREF — ligne active |
7 — PCLK — horloge de pixel | 8 — XCLK — horloge d’entrée à fournir |
9 — D7 — bit de données 7 | 10 — D6 — bit de données 6 |
11 — D5 — bit de données 5 | 12 — D4 — bit de données 4 |
13 — D3 — bit de données 3 | 14 — D2 — bit de données 2 |
15 — D1 — bit de données 1 | 16 — D0 — bit de données 0 |
17 — RESET — remise à zéro, active à l’état bas | 18 — PWDN — mise en veille, active à l’état haut |
Pour une image complète, il faut donc réserver douze entrées au capteur : les huit lignes de données, plus PCLK, VSYNC, HREF et l’horloge XCLK. Pour dialoguer avec le capteur et régler ses registres, quatre fils suffisent : 3V3, GND, SIO_C, SIO_D — à condition de fournir XCLK, sans quoi le capteur ne répond pas.
Applications
- Robotique — suivi de ligne par vision, détection d’obstacle, reconnaissance de couleur, tri d’objets.
- Comptage — passages devant une vitrine, pièces sur un tapis, véhicules sur un parking.
- Surveillance et automatisation — détection de mouvement, déclenchement d’un éclairage, capture périodique d’une image.
- Apprentissage — comprendre une trame vidéo, une horloge de pixel, un bus de registres : c’est l’un des meilleurs supports pour aborder la vision embarquée.
- Systèmes rapides — STM32, ESP32, FPGA et DSP disposent d’une interface caméra qui exploite directement
PCLK,HREFetVSYNC.
Mini-projet : dialoguer avec le capteur sur le bus SCCB
Avant de lire une image, on vérifie que le module est vivant et qu’il répond à son adresse. Le programme lit deux registres internes qui ne changent jamais : l’identifiant produit et la version du silicium. C’est le contrôle le plus utile à faire en premier, et il ne demande que cinq fils.
Le matériel
| Le microcontrôleur | Uno R3 + câble USB — 16 MHz, sortie 3,3 V intégrée |
|---|---|
| Le support | Plaque d’essai 830 points |
| Les liaisons | 10 câbles Dupont fils — mâle-femelle pour clipper les broches du module |
| Le diviseur | Résistances 1/4 w 1 kΩ — une en série et deux en série pour la masse |
| Les tirages du bus | 10 résistances 1/4 w 10 kΩ — à poser seulement si le module ne répond pas |
Le câblage
Cinq fils partent du module, rien de plus. Les lignes de données D0 à D7 restent débranchées pour ce test, et PWDN est mis à la masse pour que le capteur ne se mette pas en veille.
Module 3V3 | → Arduino 3.3V — jamais le 5 V |
|---|---|
Module GND | → Arduino GND |
Module SIO_C | → Arduino A5 (SCL du bus I2C) |
Module SIO_D | → Arduino A4 (SDA du bus I2C) |
Module XCLK | → Arduino D9, à travers un diviseur 1 kΩ en série puis 2 kΩ vers la masse |
Module PWDN | → Arduino GND |
Pourquoi ce diviseur sur XCLK ? Les entrées du capteur sont alimentées en 2,8 V : leur envoyer directement un signal de 5 V les fait travailler hors de leurs limites. Le diviseur 1 kΩ + 2 kΩ ramène le signal à 3,3 V, ce qui reste dans la plage acceptée. Une résistance de 1 kΩ en série sur les lignes SIO_C et SIO_D complète la protection. Si vous disposez d’une carte alimentée en 3,3 V, cette précaution devient inutile : la tension est déjà correcte.
Le programme
À copier dans l’IDE Arduino, puis à téléverser sur la carte. Ouvrez le moniteur série à 9600 bauds.
/*
* Verification d un module camera OV7670 sur le bus SCCB
* Carte : Arduino Uno R3
* Montage : 3V3, GND, SIO_C, SIO_D et XCLK seulement
*
* Composants, brochage et fiche complete : www.marocproduits.com
*/
#include "Wire.h"
const byte ADRESSE_SCCB = 0x21; // adresse 7 bits du capteur OV7670
const byte REG_PID = 0x0A; // identifiant produit
const byte REG_VER = 0x0B; // version du silicium
void demarrerHorloge(void) {
// Le compteur 1 bascule la broche 9 a chaque comparaison :
// 16 MHz divise par 2, soit 8 MHz en sortie.
pinMode(9, OUTPUT);
TCCR1A = 0x40; // COM1A0 : basculer la sortie a chaque comparaison
TCCR1B = 0x09; // mode CTC, prescaler 1 (horloge de 16 MHz)
OCR1A = 0; // une comparaison par cycle : 8 MHz
}
byte lireRegistre(byte adresse) {
// Ecriture de l adresse du registre, puis lecture d un octet.
Wire.beginTransmission(ADRESSE_SCCB);
Wire.write(adresse);
Wire.endTransmission();
Wire.requestFrom(ADRESSE_SCCB, 1);
if (Wire.available() == 0) {
return 0xFF; // aucun octet recu
}
return Wire.read();
}
void setup() {
Serial.begin(9600);
demarrerHorloge(); // sans XCLK, le capteur reste muet
Wire.begin(); // SDA sur A4, SCL sur A5
Wire.setClock(100000); // 100 kHz, la cadence sure du bus
delay(200); // laisser le capteur se stabiliser
if (lireRegistre(REG_PID) == 0xFF) {
Serial.println("Aucune reponse. Verifier 3V3, GND, SIO_C, SIO_D et XCLK.");
return;
}
Serial.print("Identifiant produit (0x0A) : 0x");
Serial.println(lireRegistre(REG_PID), HEX);
Serial.print("Version silicium (0x0B) : 0x");
Serial.println(lireRegistre(REG_VER), HEX);
Serial.println("Attendu sur un OV7670 : 0x76 puis 0x73.");
}
void loop() {
delay(1000); // une seule lecture suffit, le capteur ne mue pas
}Ce que l’on doit lire
0x76dans le registre0x0A: c’est l’identifiant du capteur. Il est gravé en usine et ne change jamais.0x73dans le registre0x0B: c’est la version du silicium du OV7670. Une version0x70ou0x71désigne une autre révision, plus rare, du même capteur.
Si ces deux valeurs s’affichent, le module fonctionne, le bus SCCB passe et l’horloge est correcte : vous pouvez passer à la configuration de l’image et au câblage des huit lignes de données. Si vous lisez 0xFF, l’ordre de vérification est toujours le même : 3V3 à 3,3 V, GND commun, XCLK réellement présent sur la broche 8, puis SIO_C et SIO_D bien croisés avec A5 et A4.
Variantes selon la carte utilisée
- Arduino Mega 2560 — la sortie du compteur 1 n’est plus sur la broche 9 mais sur la broche 11, et le bus I2C se trouve sur
D20(SDA) etD21(SCL). Le reste du programme est identique. La Mega offre surtout beaucoup plus de mémoire pour stocker une trame : c’est la carte à préférer dès l’instant où l’on veut conserver une image entière. - Carte en 3,3 V (ESP32, STM32) — aucun diviseur n’est nécessaire, la logique est déjà à la bonne tension, et l’horloge peut monter à 20 MHz ou plus, ce qui rend l’image plus fluide en basse lumière.
- Lire les pixels — les huit lignes de données se câblent sur un port complet du microcontrôleur, et l’image est lue au rythme de
PCLK. Sur une carte 16 MHz, on capture en pratique une image réduite plutôt qu’une VGA complète. Augmenter la mémoire, ou réduire l’image, est la meilleure façon d’y arriver.
Points d’attention
- L’alimentation du module est en 3,3 V, jamais en 5 V. La sortie 3,3 V d’une carte Arduino suffit largement au module (quelques dizaines de milliampères), mais si vous y ajoutez d’autres périphériques gourmands, alimentez-le par une sortie 3,3 V séparée pour éviter toute chute de tension.
- L’horloge compte autant que l’alimentation. Un OV7670 sans
XCLKne répond à rien, même parfaitement alimenté. C’est la première cause des « aucune réponse » alors que le câblage est bon. - 8 MHz, c’est sous le minimum de la fiche technique. La datasheet donne une plage de 10 à 48 MHz, et la sortie d’horloge d’un Arduino 16 MHz ne peut pas dépasser 8 MHz (16 MHz divisés par deux). Les registres restent parfaitement lisibles à cette cadence, mais l’image, elle, se dégrade : c’est le principal défaut d’un montage Arduino sur ce capteur.
- Pas de mémoire d’image sur ce module. Sans puce FIFO, les octets sortent au rythme du pixel et doivent être lus immédiatement. Si votre programme prend du retard, l’image glisse et se déforme : ce n’est pas une panne du capteur.
- Certains exemplaires n’ont pas de résistances de tirage sur le bus SCCB. Si le module ne répond pas et que tout le reste est vérifié, ajoutez deux résistances de 10 kΩ entre
SIO_Cet3V3, puis entreSIO_Det3V3. - Ne rallongez pas les fils inutilement. À 8 MHz et plus, un câblage en accordéon sur une plaque d’essai provoque des images bruitées. Fils courts, masse commune soignée.
Questions fréquentes
Le module remplace-t-il une carte SD pour enregistrer une vidéo ?
Non. Il fournit une image vivante, jamais un fichier. Pour garder une photo, il faut soit transmettre l’image à un ordinateur par la liaison série, soit écrire les octets sur une carte mémoire avec un lecteur de carte mémoire piloté par la même carte.
Pourquoi mon programme compile-t-il alors que la broche reste silencieuse ?
Parce que le montage est incomplet, non parce que le code est en cause. Une image ne commence à sortir qu’avec XCLK, PCLK, HREF et VSYNC tous raccordés : sans ces quatre signaux, le capteur est correctement configuré mais n’a rien à envoyer. C’est exactement pour cette raison que ce montage se fait en deux étapes, en commençant par le test SCCB.
Comment savoir si le problème vient du capteur ou de mon programme ?
En regardant les signaux eux-mêmes plutôt que le résultat. Un analyseur logique USB branché sur XCLK, PCLK, HREF et VSYNC montre en une seconde si l’horloge est présente et si les trames défilent. Un signal absent est un problème de câblage ou de code, jamais un problème de capteur.
Y a-t-il un microcontrôleur intégré au module ?
Non, le module ne contient que le capteur, la lentille et ses régulateurs. Toute la logique — configuration, lecture, décision — est à écrire sur votre carte. C’est ce qui en fait un excellent composant pour apprendre, mais cela signifie aussi qu’aucun programme prêt à l’emploi ne fonctionnera sans comprendre un minimum la trame vidéo.
À combiner avec
Le montage présenté sur cette page utilise une carte 16 MHz et une simple plaque d’essai. Pour aller plus loin dans la capture d’image, trois éléments font la différence : une Mega 2560, dont la mémoire permet de garder une trame entière en mémoire vive ; un analyseur logique USB pour contrôler d’un coup d’œil les quatre signaux de synchronisation ; et un lecteur de carte mémoire lorsque vous voulez écrire les images sur une carte plutôt que de les afficher.










