lundi 7 septembre 2020

Capteur de couleurs TCS3200 (GY-31) et Arduino


Cette semaine, j'ai eu l'agréable surprise de trouver dans ma boîte aux lettres le capteur de couleurs TCS3200 que j'avais commandé...5 mois plus tôt! 

Le TCS3200 est un capteur conçu pour déterminer la couleur d'un objet, Il est constitué d'une matrice de minuscules photodiodes: 16 d'entre elles sont munies d'un filtre qui ne laisse passer que la lumière rouge, 16 autres ne captent que la lumière verte, 16 photodiodes ne captent que la lumière bleue, et les 16 dernières n'ont pas de filtre et captent donc la totalité de la lumière reçue.

En plus du capteur TCS3200, le module GY-31 comporte 4 LEDs qui permettent de bien éclairer la cible.

Le module comporte 10 connecteurs (mais 2 d'entre eux sont redondants):

  • 2 connecteurs Vcc: Alimentation située entre 2,7 V et 5,5 V
  • 2 connecteurs GND: la masse, évidemment
  • S0 et S1 : sélection de l'échelle de fréquence
  • S2 et S3: sélection des photodiodes actives
  • OUT: signal de sortie
  • LED: contrôle des 4 LEDs d'éclairage

C'est l'état logique des entrées S2 et S3 qui détermine quel groupe de photodiode est actif:

  • S2 = 0 et S3 = 0 : Rouge
  • S2 = 0 et S3 = 1:  Bleu
  • S2 = 1 et S3 = 1: Vert
  • S2 = 1 et S3 = 0: Sans filtre
Le signal de sortie est une onde carrée dont la fréquence est proportionnelle à l'intensité lumineuse désirée. Pour faciliter la mesure de cette fréquence, on peut la diviser par 5 ou par 50 grâce aux entrées S0 et S1:
  • S0 =1 et S1 = 1: 100% de la fréquence (environ 600 kHz)
  • S0 = 1 et S1 = 0: 20% de la fréquence (environ 120 kHz)
  • S0 = 0 et S1 = 1: 2% de la fréquence (environ 12 kHz)
  • S0 = 0 et S1 = 0: capteur inactif
Puisque j'ai choisi de mesurer la demi-période du signal au moyen de la fonction pulseIn(), il m'a semblé préférable de travailler à l'échelle 2%, ce qui m'a donné des mesures de quelques centaines de microsecondes. 

Les LEDs seront allumées par défaut si on ne branche rien à l'entrée LED du module. Si on désire les éteindre, il s'agit de régler cette entrée au niveau logique 0.

Pour un même objet coloré, les résultats obtenus dépendent beaucoup de la lumière ambiante et de la distance entre le capteur et l'objet. Dans le but d'uniformiser mes résultats, j'ai placé mon capteur au fond d'un réceptacle noir qui bloquait la lumière ambiante, et qui me permettait de placer l'échantillon coloré à exactement 3 cm de distance par rapport au capteur.



J'ai branché le module GY-31 à l'Arduino Uno de la façon suivante:


  • VCC du module GY-31 : Arduino 5 V
  • GND du module GY-31: Arduino GND
  • S0 du module GY-31: Arduino 2
  • S1 du module GY-31: Arduino 3
  • S2 du module GY-31: Arduino 4
  • S3 du module GY-31: Arduino 5
  • OUT du module GY-31: Arduino 6
  • LED du module GY-31: Arduino 7

Voici un sketch qui affiche dans le moniteur série les valeurs mesurées par chaque groupe de photodiodes. Puisque la fonction pulseIn() mesure un temps et non une fréquence, un petit nombre correspond à une forte intensité lumineuse.

-
-



Ça fonctionne vraiment bien pour différencier deux objets dont les couleurs sont vives et très différentes l'une de l'autre. 

Même en prenant des précautions pour assurer une certaine uniformité des conditions de mesure (même carton coloré, écran bloquant la lumière ambiante, même distance entre le capteur et le carton), les mesures pour une même couleur peuvent varier de plusieurs dizaines de microsecondes d'un essai à l'autre (surtout si la couleur est foncée).  Il est peut-être possible d'obtenir de meilleurs résultats en améliorant la procédure pour mesurer la fréquence, ou en utilisant un microcontrôleur plus rapide.

À lire également:

On peut aussi détecter des couleurs en fabriquant une sonde RGB au moyen d'une simple LED RGB.

Ce module TCS3200 peut également être utilisé avec un Raspberry Pi.

Yves Pelletier (TwitterFacebook)


Aucun commentaire:

Enregistrer un commentaire