Caméra OV7670

From Eric

Revision as of 21:05, 2 April 2011 by Ejenn (Talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Cette rubrique décrit succinctement la caméra OV7670 d'Omnivision ainsi que le montage à base d'ARM7 (LPC1768) que j'ai réalisé pour la mettre en oeuvre. Cette caméra est destinée à être intégrée sur le robot Trobot1.

Contents

Caractéristiques générales

L'OV7670 est un capteur utilisé dans les appareils mobiles (téléphones,...). Voici une photo de cette caméra ainsi que son brochage.

OV7670.jpg
Ov7620 chip.jpg

L'OV7670 dispose d'un nombre important de fonctions accessibles via un bus compatible I2C (SCCB). L'image, quant à elle, n'est pas accessible sur le port I2C : elle est transmise de façon autonome sur un bus parallèle rapide.


Alimentation

L'OV7670 doit être alimentée en 2.8V (la tension du coeur numérique, 1.8V, est obtenue par un régulateur intégré à partir de la tension VIO).

Horloge

L'entrée xclk reçoit le signal d'horloge de la caméra. Un circuit oscillant sous 3.3V à base de 74C04 et d'un quartz 24MHz fonctionne très bien (voir la datasheet pour les valeurs de fréquence min et max).

Stockage et accès aux images

La caméra transmettant une image en "continu" avec un débit important, il conviendra de la connecter soit sur un microprocesseur suffisamment rapide pour acquérir les données, soit sur une mémoire tampon à partir de laquelle le microcontrôleur accèdera à l'image.

Cette mémoire tampon doit pouvoir être écrite d'un côté par la caméra et lue, de l'autre côté par le microcontrôleur. Cela assure, au moins, qu'une image pourra être traitée complètement avant acquisition de l'image suivante. La perte d'information porte sur les images successives, et non sur les pixels d'une image. A cette fin, j'utilise la mémoire AL422B [AL422B] produite par Avermedia.

A noter :

  • En gros, on favorise la cohérence des pixels d'une image aux dépens de la latence minimale garantie entre un événement et son observation par la caméra.
  • Avec un microcontrôleur type dsPic ou Arm7, il doit être possible d'échantillonner le signal vidéo sans perte (voir par exemple l'article <a compléter>). Cette solution impose dependant l'entière disponibilité du micro-contrôleur pendant la phase d'échantillonnage. En outre, je souhaite une solution aussi indépendante que possible des performances du microcontrôleur.
  • On pourrait aussi utiliser directement de la DRAM (par ex. une barette de mémoire de PC, anciens modèles, dont mes tiroirs regorgent). Mais il faudrait alors générer les signaux de rafraîchissement, les signaux d'adresse, et gérer les accès multiples (quoique séquentiels)... Cette solution fera probablement l'objet d'une prochaine expérience...

La mémoire AL422B est une FIFO de 384K octets (3Mbits) à deux ports : un port d'écriture connecté à la caméra et un port de lecture connecté au microcontrôleur.

S'agissant d'une FIFO, cette mémoire n'a pas besoin qu'on lui fournisse l'adresse où stocker la donnée : celle-ci est simplement écrite en queue de la FIFO. La gestion des adresses est réalisée en interne par le composant. Il fournit cependant deux signaux de reset (en écriture et en lecture) pour repositionner le pointeur.

L'AL422B utilise une mémoire dynamique (DRAM) qui requiert donc un rafraîchissement périodique. Les signaux d'horloge en écriture (WCK) et en lecture (RCK) sont utilisés pour générer le signal de rafraîchissement de la mémoire (The faster one of WCK and RCK is used as the DRAM refresh timing clock). Ce signal doit avoir une fréquence d'au moins 1Mhz. Dans notre cas, la caméra fournit un signal vidéo permanent, cadencé par l'horloge PCLK (Pixel Clock). L'horloge PCLK fournissant le signal d'écriture en FIFO, il assure aussi le rafraîchissement de la RAM dynamique.


Dans cette configuration, la séquence d'opération est la suivante :

  • le microcontôleur configure la caméra par le biais du bus I2C ;
  • la caméra effectue l'acquisition vidéo et stocke l'image dans la FIFO ;
  • le microcontrôleur attend la fin de la transmission ;
  • le microcontrôleur récupère l'image dans la FIFO.

La caméra fournit les signaux nécessaires au pilotage direct de la FIFO :

  • un signal d'horloge (pixel clock ou PCLK)
  • un signal de synchronisation horizontale (HREF)
  • un signal de synchronisation verticale (VSYNC)
  • un bus de données de largeur 8 bits (D0 à D7)

La FIFO dispose quant à elle des signaux suivants (en entrée):

  • Un bus de données de largeur 8 bits
  • Un signal d'horloge en écriture (WCK). Si l'écriture est autorisée (signal WE actif), la donnée présente sur le bus est stockée en mémoire et le compteur interne (qui fournit l'adresse) est incrémenté. Le compteur peut être réinitialisé à zéro en activant le signal WRST (Write reset).

Voici le chronogramme d'accès en écriture de la FIFO :

Al422b write.jpg

Et voici le chronogramme de production des données par la caméra :

Ol7670 data write.jpg

La caméra peut donc directement "piloter" la FIFO. Pour cela, il suffit de

  • connecter le bus de donnée de la caméra au bus de donnée dana-in de la FIFO ;
  • réaliser un ET logique entre le signal de synchronisation horizontale HREF et un signal WE issue du microcontrôleur, d'en inverser le sens puis de le connecter à l'entrée WE de la FIFO (WE = NAND(HREF, WEmicro)).
  • connecter le signal PCLK sur l'entrée WRCK de la FIFO, de façon à en assurer le rafraîchissement permanent.

A noter que ça n'est pas exactement le schéma d'interconnexion que l'on trouve sur internet :

Ov7620 al422b.jpg

Ma méthode présente l'avantage d'assurer un signal de rafraîchissement de la FIFO régulier via l'entrée WCLK.

Pour capturer une image, on utilise le front montant du signal VSYNC, de la manière suivante :

  • Lorsque je veux acquérir une image, je réinitialise les pointeurs de la FIFO, je signale (dans la variable d'état du handler d'IT) que je souhaite faire une acquisition et, enfin, j'autorise les interruptions sur l'IT EINT3.
  • Lors du prochain front montant sur VSYNC, le signal WE est activé (ce qui va permettre l'écriture dans la FIFO, sachant que le signal WCLK est quant à lui toujours actif pour permettre le rafraîchissement de la DRAM de l'AL422), et la variable d'état est modifiée pour indiquer une acquisition en cours.
  • Lors du prochain front montant de VSYNC, l'acquision est arrêtée : le signal WE est désactivé et la variable d'état reprend la valeur correspondant à une attente.
  • De son côté la fonction appelée pour réaliser l'échantillonnage scrute cette variable et abandonne la scrutation dès qu'elle reprend la valeur correspondant à une attente (ce qui signifie la fin de l'échantillonnage). (Naturellement, ce schéma de scrutation sera remplacé par quelque chose d'un peu plus efficace basé sur les services de l'OS, mais c'est suffisant pour l'instant.)


La AL422B ne permet pas la lecture d'une donnée immédiatement après son écriture : il faut attendre au moins 128 cycles de WCK pour être certain de lire une donnée récente. Ce comportement est du à la présence d'une mémoire cache statique au sein du composant.

Ov7620 timing.jpg

La carte de contrôle

La carte de contrôle est présentée ci-après, avec son écran LCD Nokia (voir rubrique sur les écrans LCD).

Ov7620 al422b board.jpg
Ov7620 al422b display.jpg
Personal tools