\subsection{Gestion de la caméra} \subsubsection{Fonctionnement de la caméra} La caméra produit un flot de données incessant. Elle fournit aussi des signaux de synchronisation. Ceux-ci nous permettent de savoir quand est-ce qu'une nouvelle image commence, quand est-ce que l'on change de ligne. De cette manière nous pouvons reconstituer une information cohérente avec notre vision. \begin{figure}[htbp] \caption{La caméra} \includegraphics[width=\textwidth]{./ovcam/ov6620.pdf} \label{schema1} \end{figure} Pour vérifier que nous avions bien compris le fonctionnement de la caméra, nous avons écrit un programme pour micro-contrôleur qui saisie une image. Pour réaliser cette application teste, nous avons utilisé une carte à base de 68HC11F1 à 8MHz doté de 64Ko de mémoire. Voici le résultat: figure \ref{image_test} page \pageref{image_test}. \begin{figure}[htbp] \caption{L'image test} \includegraphics[]{./ovcam/image.png} \label{image_test} \end{figure} Pour obtenir cette image nous avons écrit un programme en C avec gcc pour 68HC11. Ce programme prend 72 lignes d'une première image puis les envoie à l'ordinateur à 9600 baud (c'est très lent) puis attend une nouvelle image, saute les 72 premières lignes et enregistre les 72 lignes suivantes puis les envoie. Ainsi de suite 4 fois par image car Le microcontroleur n'a pas assez de mémoire pour enregistrer l'image entière. Il faut donc la "tronçonner". En effet l'image fait normalement 352 par 288 pixel et chaque pixel est codé sur 8 bits. La caméra dispose d'un réglage de gain automatique c'est pour cela que les 4 parties ont des contrastes différents. Bien que l'on ait ralentit au maximum la fréquence de Pclk, nous n'arrivons à obtenir que 72 point par lignes au lieu de 288. Comme l'image reste "compréhensible" nous pouvons croire que le microcontroleur n'est pas assez rapide pour lire plus de points. Et du coups il fait un "sample régulier" de la ligne, ce qui nous donne cette impression d'image comprimé en largeur. Tout ceci nous laisse croire que nous maitrisons la capture d'une image. \subsubsection{Implémentation de la récupération d'une image dans un fpga} Le principe utilisé est simple, il s'agit de remplir une mémoire avec les données provenant de la caméra. Un compteur peut incrémenter l'adresse et ainsi parcourir la mémoire. Nous allons utilisé les macros que fournit Xilinx pour réaliser des DPRAMs : qui sont des mémoires ram à double ports, permettant une lecture et une écriture sur deux ports differents. Nous utiliserons 2 DPRAM afin que l'ordinateur puisse lire un bank mémoire alors que l'automate de récupartion de donnée caméra en remplit un autre. \begin{figure}[htbp] \caption{Synoptique d'implémentation} \includegraphics[width=\textwidth]{./ovcam/ovcam2.pdf} \label{ovcam} \end{figure} Ce système est ordonné par un séquenceur. Cette machine d'état aura la charge de choisir le bank à remplir, la gestion de la ligne d'interruption ( moyen d'avertir d'ordinateur pour qu'il vienne lire) et le registre de contrôle avec ses quelques bits: \begin{itemize} \item Un bit disant quel bank doit être lu. \item Un bit disant si l'interruption est levée, c'est dire si le bit précédent est valide. \item Un bit disant s'il y a eu écrasement d'un bank, dans le cas ou l'ordinateur ne serait pas venu suffsament tôt. \item un bit de reset pour remettre à zero la machine d'état les différents compteurs et convertisseur. \item Un bit servant à dire que l'ordinateur va bientot lire un bank et donc, que le sequenceur doit baisser sa ligne d'interruption. Cette dernière fonction pourrait être remplacée par un système qui détecte la lecture du bank. \end{itemize} D'autres indicateurs pourraient être donnsé, par exemple : un flag pourrait se lever pour marquer que le bank de remplissage est déjà à moitié rempli. \subsubsection{Le driver} Avec le fonctionnement décrit si dessus, Le driver devra réaliser la sous-routine suivante: \begin{itemize} \item Détecter une interruption caméra \item Lire le registre de la caméra pour savoir si il y a bien eu une interruption, et connaitre le bank à lire. \item Ecrire dans le registre le bit correspondant à "lecture imminente" \item Lire le bank, le placer en mémoire, incrémenter une variable. Lorsque cette variable sera égale à 50, l'ordinateur aura récupéré une image complète. \end{itemize} Bien sûr, si la cadence des images est trop rapprochée dans le temps, Une fois que l'on a récupéré une image complète, on peut ne pas écrire le bit "lecture imminente", ce qui aura pour conséquence de ne pas baisser la ligne d'interruption et de ne plus être dérangé. Pour reprendre la capture, il suffit de faire un reset avec le bit prévu dans le registre de contrôle. \pagebreak