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.

-
/****************************************************************
Détection de couleur avec Arduino et TCS2300
Pour plus de détails:
https://electroniqueamateur.blogspot.com/2020/09/capteur-de-couleurs-tcs3200-gy-31-et.html
****************************************************************/
// définitions des broches utilisées sur l'Arduino
#define brocheS0 2
#define brocheS1 3
#define brocheS2 4
#define brocheS3 5
#define brocheLecture 6
#define brocheLED 7
// valeur mesurée pour chaque couleur
int rouge, vert, bleu, total;
void setup() {
pinMode(brocheS0, OUTPUT);
pinMode(brocheS1, OUTPUT);
pinMode(brocheS2, OUTPUT);
pinMode(brocheS3, OUTPUT);
pinMode(brocheLED, OUTPUT);
pinMode(brocheLecture, INPUT);
// éteignons les LEDs pour l'instant
digitalWrite(brocheLED, LOW);
// Réglage de l'échelle de fréquence à 2% (plus facile à lire avec pulseIn)
digitalWrite(brocheS0, LOW);
digitalWrite(brocheS1, HIGH);
// pour affichage des résultats dans le moniteur série
Serial.begin(9600);
}
void loop() {
digitalWrite(brocheLED, HIGH); // on allume les LEDs
digitalWrite(brocheS2, LOW); // rouge
digitalWrite(brocheS3, LOW);
rouge = pulseIn(brocheLecture, LOW);
Serial.print("rouge: ");
Serial.print(rouge);
digitalWrite(brocheS2, HIGH); // vert
digitalWrite(brocheS3, HIGH);
vert = pulseIn(brocheLecture, LOW);
Serial.print(" vert: ");
Serial.print(vert);
digitalWrite(brocheS2, LOW); // bleu
digitalWrite(brocheS3, HIGH);
bleu = pulseIn(brocheLecture, LOW);
Serial.print(" bleu: ");
Serial.print(bleu);
digitalWrite(brocheS2, HIGH); // lumière complète, sans filtre
digitalWrite(brocheS3, LOW);
total = pulseIn(brocheLecture, LOW);
Serial.print(" total: ");
Serial.println(total);
digitalWrite(brocheLED, LOW); // on éteint les LEDs
delay(1000); // pause avant la prochaine mesure
}
-



Ç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