jeudi 2 janvier 2014

Arduino et perception des couleurs: construction d'une sonde RGB

Saviez-vous qu'il est facile et peu coûteux de fabriquer une sonde qui permettra à votre Arduino de connaître la couleur d'un objet?  Par exemple, grâce à cette sonde, votre robot pourrait reconnaître la pièce de la maison dans laquelle il se trouve en se basant sur la couleur des murs et du plancher. Vous pouvez aussi vous en servir dans cette impressionnante machine à trier les bonbons­.


Matériel:

Pour la fabrication de cette sonde, je me suis beaucoup inspiré de ce projet publié par Fjordcarver sur Instructables, par contre j'ai ajouté deux boutons poussoir qui déclenchent la calibration du capteur et la lecture de la couleur (dans le projet de Fjordcarver, la calibration se faisait au démarrage, et la lecture de la couleur se faisait ensuite sans arrêt).  Tout le matériel est facile à trouver:  une LED RGB à cathode commune (qu'on peut très bien remplacer par trois LEDs distinctes:  une rouge, une verte et une bleue), une photorésistance, une résistance de 220 Ω pour protéger la LED, une autre résistance pour mettre en série avec le photorésistance (j'ai utilisé 10 kΩ), deux boutons poussoir,  et bien sûr l'Arduino de votre choix (j'ai utilisé un Uno).  


Principe de fonctionnement:

Pour mesurer la couleur d'un objet, nous allons utiliser le système "RGB" qui consiste à assigner un nombre entre 0 et 255 pour chacune de ses trois composantes, soit le rouge (R), le vert (G) et le bleu (B).  Pour ce faire, nous allons éclairer l'objet avec une source de lumière rouge et mesurer au moyen de la photorésistance la quantité de lumière réfléchie par l'objet, puis répéter la mesure avec la lumière verte et la lumière bleue.

Un objet rouge réfléchira fortement la couleur émise par la LED rouge, mais beaucoup plus faiblement la lumière émise par la LED verte et la LED bleue.  Un objet blanc réfléchira fortement chacune des 3 couleurs, etc.

Puisque la couleur est mesurée par réflexion, ce dispositif ne permet pas de déterminer la couleur émise par une source de lumière (par exemple une LED colorée).

Le montage électrique:

Le montage est tellement simple que Fritzing fera parfaitement l'affaire pour l'illustrer:



La LED RGB est branchée aux entrées 2 (rouge), 3 (vert) et 4 (bleu) de l'Arduino.  La cathode commune à toutes les couleurs est branchée à une résistance protectrice de 220 Ω, qui est elle-même reliée à la masse (GND).  Une broche de la photorésistance est reliée à la masse (GND), et son autre broche est reliée à la fois à l'entrée A0 de l'Arduino, ainsi qu'à une résistance fixe (j'ai utilisé 10 kΩ). L'autre broche de la résistance fixe est reliée à + 5 V.

Deux boutons poussoirs sont reliés directement à la masse (GND); j'utilise les résistances pull-up interne de l'Arduino, donc pas besoin de résistance externe pour accompagner ces boutons.  L'autre borne du bouton de lecture des couleurs est branchée à l'entrée 5 de l'Arduino, alors que le bouton de calibration est relié à l'entrée 6.

Assurez-vous que la photoésistance est placée à proximité de la LED.  Mais attention:  vous voulez que la photorésistance capte la lumière réfléchie par l'objet et non la lumière provenant directement de la LED: pensez à insérer un carton noir ou autre obstacle opaque entre la LED et la photorésistance:




Pour mes tests sur breadboard, tout mon circuit était enfermé dans un récipient en carton noir afin d'éviter que la lumière ambiante n'affecte mes résultats (l'objet coloré était placé au dessus de ce récipient):



Après que les tests sur breadboard se soient révélé concluants, j'ai ensuite construit une sonde plus permanente en soudant les composants à l'extrémité d'un câble à six conducteurs (long de quelques dizaines de centimètres) ayant jadis servi à brancher un quelconque périphérique d'ordinateur:



...et en les enfermant dans un récipient opaque (un récipeint de Kinder Surprise dont l'intérieur est peint en noir; le diamètre est inutilement grand, mais c'est ce que j'avais de mieux sous la main):






Le sketch:

Le sketch est relativement simple:  chaque fois que vous appuyez sur le bouton poussoir de lecture, les trois couleurs de la LED RGB s'allument l'une après l'autre. Pour chaque couleur de la LED, on mesure la réflexion captée par la photorésistance (en faisant la moyenne sur plusieurs mesure pour une meilleure fiabilité).

Dans le système RGB, le noir est représenté par R = 0, G = 0 et B = 0 alors que le blanc est représenté par R = 255, G = 255 et B = 255.  Le sketch comporte donc une routine de calibration qui mesure la réflexion d'un objet blanc et d'un objet noir.  Ces données sont ensuite utilisées pour assigner une valeur entre 0 et 255 pour chaque couleur mesurée.


Utilisation de la sonde

Après avoir téléversé le sketch dans votre Arduino, vous affichez à l'écran le moniteur série, car c'est de cette façon que l'Arduino vous communiquera les résultats de ses mesures.

Commencez par calibrer votre capteur en appuyant sur le bouton de calibration (celui qui est relié à l'entrée 6 de l'Arduino).  L'Arduino vous demandera d'abord d'appuyer votre sonde sur un objet blanc (une feuille de papier, par exemple), puis ensuite sur un objet noir (mat, de préférence).

Ensuite, appuyez la sonde sur un objet coloré, puis appuyez sur le bouton de lecture (celui qui est branché à l'entrée 5 de l'Arduino).  Le code RGB correspondant à la couleur de l'objet s'affichera sur le moniteur série. L'Arduino tentera également de nommer la couleur (cette partie est à améliorer:  ça marche la plupart du temps, mais pas toujours).

À lire également:

3 commentaires:

  1. Bonjour,

    Tout d'abord merci pour vos montages extrêmement intéressant !
    Je viens de me lancer dans le monde "Arduino" et je découvre (difficilement) plein de choses :)

    Mon travail étant l'image (je suis retoucheur photo) , je suis très intéressé par votre montage de perception des couleurs.
    J'ai reçu mon matériel, et j'ai pris dans la foulée un écran LCD.
    Je souhaiterai afficher les informations du moniteur sur mon petit LCD.

    Pourriez vous m'éclairer sur ce point ?


    Merci encore pour votre partage !
    A vite,

    Tony.

    RépondreSupprimer
  2. Bonjour,

    très bien fait votre système de perception de couleurs
    je l'ai testé. j'aimerai y apporter en complément une recherche de valeurs approchées dans un tableau de codes
    RVB pour identifier une couleur pourriez-vous m'aider

    RépondreSupprimer
  3. Bonjour j'ai essayé ce programme et ce circuit mais lors de la calibration, les valeurs affiché atteignent 1023 alors que les valeurs sont censé être comprises entre 0 et 255. J'ai tout essayé (revérifier les branchements et les composants) mais je ne parviens pas à savoir quel est le problème. Pouvez vous m'aider s'il vous plaît?

    RépondreSupprimer