On nous demande souvent si une Arduino peut "envoyer des informations" d’une caméra ou traiter les informations de deux caméras pour faire un algorithme de reconnaissance 3D ou bien d’autres traitements complexes de ce genre.
Préambule
Il faut rappeler qu’une Arduino est un micro-contrôleur (famille AVR) et qu’il existe des modèles de caméras pilotées par AVR. Donc rien d’infaisable. Mais il faut aussi dire qu’il y a différents types de caméra, donc la question nécessite un peu de précision avant de pouvoir y répondre.
Il faut savoir ce qu’on entends par "envoyer des informations" et de quel modèle de caméra on parle.
Caractéristiques d’une caméra
On va distinguer trois caractéristiques :
– le type de connexion
– le flux vidéo
– les fonctionnalités avancées
Connexion entre Arduino et caméra
Si vous avez une webcam USB, passez votre chemin : l’Arduino ne permet pas de piloter un périphérique USB car s’il est vrai qu’il y a une prise USB sur l’Arduino, la puce ne fait pas "hôte" (ou USB host en anglais). Il existe des puces permettant de piloter des périphériques USB qu’on peut trouver comme extension, mais les fonctions supportées sont plutôt des accès lecture/écriture vers une unité de stockage (clé USB) ou des données d’interface de contrôle comme une souris, un joystick, etc.. (en anglais HID pour Human Interface Device).
Si vous avez une caméra avec un signal analogique ou un flux vidéo composite pour chaque couleur, la tâche sera également difficile.
Les seules caméras vraiment pratiques pour interfacer avec un micro-contrôleur sont celles qui mettent à disposition chaque image dans un format numérique via une interface sérielle ou parallèle. On trouve plus facilement des caméras (celles qui équipent les téléphones portables par exemple) qui ont à la fois un port de communication série pour les signaux de contrôle (allumer, éteindre, calibrage, ordre d’envoi) et une communication parallèle pour transmettre les pixels qui forment l’image.
Le flux vidéo
Qui dit caméra dit vidéo et qui dit vidéo dit flux important. Qui dit flux important dit grande rapidité et qui dit grande rapidité dit Lucky Luke, pas Arduino. Relire Le Daily Star pour comprendre l’allusion.
En clair, une Arduino n’est pas faite pour lire un flux vidéo (certains disent qu’elle n’est même pas faite pour de la robotique...). Mais bien sûr tout dépend du flux : la résolution de chaque image et la fréquence de lecture de chaque image.
Si votre objectif est de transmettre par la liaison série de l’Arduino le flux d’image d’une caméra connectée à l’Arduino qui en plus contrôle votre robot, revoyez votre conception et choisissez une autre solution.
Voici un exemple concret d’un calcul du transfert d’une image :
Une image 320 x 240 en RGB fait environ 230koctets
Si tu la transfères à 115200 bauds sur la liaison série de l’arduino il te faut un peu plus de 15s pour l’envoyer.
Si votre objectif est de lire cette image de 320 x 240 mais uniquement pour faire un calcul sur la totalité des pixels à la vitesse d’une image toutes les deux secondes, et que l’Arduino ne fait que ça, alors pourquoi pas. Encore plus pour une caméra linéaire avec seulement 128 pixels. Il y a caméra et caméra donc pas de réponse unique.
Les fonctionnalités avancées
Certains modèles de caméra dédiées à la robotique contiennent un contrôleur qui fait un traitement préalable des images (pré-programmé ou bien que vous pouvez développer) afin de laisser un micro-contrôleur indépendant (votre Arduino ou n’importe quel autre) accéder aux résultats de calculs complexes : détection de forme, détection de couleur, valeur moyenne pour chaque couleur primaire, etc..
Ce sont ces modèles vers lesquels vous devez vous diriger : CMUCam, Pob-Eye. Si le prix vous déroute, essayez de reproduire cette architecture : une caméra numérique / une puce dédiée / votre Arduino. La puce dédiée peut être une autre Arduino si le traitement n’est pas trop gourmand en ressource et si la caméra est interfaçable avec.
Citations et sources
Voici quelques discussions sur le sujet :
Vos commentaires
# Le 4 juin 2013 à 19:26, par Julien H. En réponse à : Caméras et Arduino
Oui effectivement si l’image est ensuite envoyée à un serveur qui sait traiter les images jpeg, alors cette caméra permettra de gagner du temps. Peut-être une image par seconde ? Il faut refaire les calculs et s’assurer qu’ensuite l’image puisse être envoyée jusqu’au serveur : il y a peut-être aussi un goulet d’étranglement à l’écriture/lecture sur la puce mémoire qui accueillera l’image ?
Mais pourquoi le faire avec une Arduino et se compliquer la vie avec une caméra qui a une si basse résolution et qui coûte déjà 35 € sans les frais de port et de douane ?
Une Raspberry Pi, une webcam ou une camera board en Full HD et c’est fini, pour un prix à peine plus cher.
Je ne sais pas quel est le projet, mais traiter une image de 160 x 120 pour en extraire une information exploitable pour piloter un robot, il faut être vachement costaud en algorithmes de traitement d’image.
Répondre à ce message
# Le 4 juin 2013 à 15:34, par jtrampq En réponse à : Caméras et Arduino
Bonjour,
Mon projet est de capturer les informations des senseurs depuis un arduino/robot et de l’envoyer par wifi au serveur pour ensuite piloter l’arduino/robot. En lisant ton article, j’ai pris peur et je me suis dit que la voie série ne supporterait jamais le flux...
Si votre objectif est de transmettre par la liaison série de l’Arduino le flux d’image d’une caméra connectée à l’Arduino qui en plus contrôle votre robot, revoyez votre conception et choisissez une autre solution.
Mais en cherchant un peu sur le net, je suis tombé sur une petite caméra toute simple et qui génère un flux video très léger : 160x120 en JPG.
Référence : LS-Y201
Exemple d’utilisation : http://mbed.org/cookbook/Camera_LS_Y201
Qu’en pensez vous ?
Répondre à ce message