Arduino UNO R4 - capteur de couleur TCS3200D/TCS230

Ce guide vous montrera comment utiliser l'Arduino UNO R4 et le module capteur de reconnaissance des couleurs TCS3200D/TCS230 pour calibrer et lire les valeurs RVB des objets et détecter les couleurs.

Tutoriel du module capteur de reconnaissance des couleurs TCS3200D TCS230 pour Arduino UNO R4

À propos du capteur de couleur TCS3200D/TCS230

Le module capteur de reconnaissance de couleur TCS3200D/TCS230 utilise une matrice de photodiodes 8x8. Seize photodiodes sont équipées de filtres rouges, seize ont des filtres verts, seize ont des filtres bleus, et seize sont clairs (sans filtre). Le module convertit l'intensité lumineuse en un signal de fréquence carrée. En faisant varier les filtres de couleur et en mesurant la fréquence de sortie (ou la largeur d'impulsion), on peut estimer les valeurs RGB d'un objet.

De nombreux modules intègrent des LEDs blanches pour éclairer la cible. Cela rend les lectures plus cohérentes et aide le capteur à détecter les couleurs de manière fiable, même en faible luminosité.

Plan de brochage

Le module capteur de couleur TCS3200D/TCS230 possède généralement ces broches :

  • Broche VCC : Reliez cette broche au VCC (5 V).
  • Broche GND : Reliez cette broche à GND (0 V).
  • Broches S0, S1 : Sélection de l'échelle de fréquence de sortie.
  • Broches S2, S3 : Sélection du filtre couleur.
  • Broche OUT : Sortie de fréquence sous forme d'onde carrée.
  • Broche OE : Activation de la sortie (active lorsque le niveau est bas). La plupart des modules connectent déjà cette broche à la masse en interne, vous n'avez donc pas besoin de la câbler. Si ce n'est pas le cas pour le vôtre, connectez-la à la masse.
Schéma de brochage du module capteur de couleur TCS3200/TCS230 montrant les broches VCC, GND, S0, S1, S2, S3 et OUT.

Comment cela fonctionne

Le capteur doit recevoir deux informations : quel canal de couleur mesurer et à quelle amplitude régler le signal de sortie. Deux paires de broches de commande s'en chargent :

  • S0 et S1 contrôlent l'échelle de fréquence de sortie :
  • S0 = BAS, S1 = BAS : mise hors tension
  • S0 = BAS, S1 = HAUT : mise à l'échelle de 2 %
  • S0 = HAUT, S1 = BAS : mise à l'échelle de 20 %
  • S0 = HAUT, S1 = HAUT : mise à l'échelle de 100 %
  • S2 et S3 sélectionnent le filtre de couleur :
  • S2 = BAS, S3 = BAS : filtre rouge
  • S2 = BAS, S3 = HAUT : filtre bleu
  • S2 = HAUT, S3 = BAS : Aucun filtre
  • S2 = HAUT, S3 = HAUT : filtre vert

La broche OUT émet une onde carrée (généralement de 2 Hz à 500 kHz). La fréquence est proportionnelle à l'intensité de la couleur sélectionnée, tandis que la largeur d'impulsion est inversement proportionnelle. Nous pouvons mesurer la largeur d'impulsion en utilisant pulseIn() puis la convertir en valeurs RVB après étalonnage.

Conseils pour des lectures stables

  • Placez le capteur à 1 à 3 cm de l'objet et maintenez l'angle constant.
  • Utilisez les LED blanches intégrées pour fournir un éclairage stable.
  • Protégez le capteur des variations de lumière ambiante pour obtenir des résultats plus précis.

Diagramme de câblage

Cette image montre comment connecter le capteur de couleur TCS3200 à l'Arduino UNO R4 :

TCS3200 Color SensorArduino UNO R4
VCC5V
GNDGND
S0Pin 4
S1Pin 3
S2Pin 6
S3Pin 5
OUTPin 7
Arduino UNO R4 et capteur de couleur TCS3200 : schéma de câblage montrant la connexion entre les broches

Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.

Voir Comment alimenter l'Arduino UNO R4..

Code Arduino UNO R4 - Calibrage (Largeur d'impulsion)

L’étalonnage est nécessaire parce que les lectures brutes du capteur sont affectées par l’environnement. Des facteurs tels que la luminosité des LED, la distance, la réflectivité de la surface et la lumière ambiante modifient les valeurs mesurées. On peut considérer ces effets comme du « bruit ». La première étape d’étalonnage vous aide à mesurer cette plage de bruit (valeurs minimales et maximales pour chaque couleur) afin que vous puissiez convertir les lectures en valeurs RVB comprises entre 0 et 255 pour votre configuration.

/* * Ce code Arduino UNO R4 a été développé par newbiely.fr * Ce code Arduino UNO R4 est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/arduino-uno-r4/arduino-uno-r4-tcs3200d-tcs230-color-sensor */ // Define color sensor pins #define S0 4 #define S1 3 #define S2 6 #define S3 5 #define sensorOut 7 // Variables for Color Pulse Width Measurements int redPW = 0; int greenPW = 0; int bluePW = 0; // Variables to track min and max pulse widths for calibration int redMin = 10000, redMax = 0; int greenMin = 10000, greenMax = 0; int blueMin = 10000, blueMax = 0; void setup() { // Set S0 - S3 as outputs pinMode(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); // Set Pulse Width scaling to 20% digitalWrite(S0, HIGH); digitalWrite(S1, LOW); // Set Sensor output as input pinMode(sensorOut, INPUT); // Setup Serial Monitor Serial.begin(9600); Serial.println("=== TCS3200 Calibration ==="); Serial.println("Point the sensor at different objects (white, black, colors)."); Serial.println("Min and Max values are tracked automatically."); Serial.println("When values look stable, note them down for the next code."); Serial.println("------------------------------------------"); } void loop() { // Read Red Pulse Width redPW = getRedPW(); // Delay to stabilize sensor delay(200); // Read Green Pulse Width greenPW = getGreenPW(); // Delay to stabilize sensor delay(200); // Read Blue Pulse Width bluePW = getBluePW(); // Delay to stabilize sensor delay(200); // Update min and max values if (redPW < redMin) redMin = redPW; if (redPW > redMax) redMax = redPW; if (greenPW < greenMin) greenMin = greenPW; if (greenPW > greenMax) greenMax = greenPW; if (bluePW < blueMin) blueMin = bluePW; if (bluePW > blueMax) blueMax = bluePW; // Print current readings Serial.print("Red PW = "); Serial.print(redPW); Serial.print(" - Green PW = "); Serial.print(greenPW); Serial.print(" - Blue PW = "); Serial.println(bluePW); // Print current min/max Serial.print(" Min -> R:"); Serial.print(redMin); Serial.print(" G:"); Serial.print(greenMin); Serial.print(" B:"); Serial.println(blueMin); Serial.print(" Max -> R:"); Serial.print(redMax); Serial.print(" G:"); Serial.print(greenMax); Serial.print(" B:"); Serial.println(blueMax); Serial.println("------------------------------------------"); } // Function to read Red Pulse Widths int getRedPW() { // Set sensor to read Red only digitalWrite(S2, LOW); digitalWrite(S3, LOW); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; } // Function to read Green Pulse Widths int getGreenPW() { // Set sensor to read Green only digitalWrite(S2, HIGH); digitalWrite(S3, HIGH); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; } // Function to read Blue Pulse Widths int getBluePW() { // Set sensor to read Blue only digitalWrite(S2, LOW); digitalWrite(S3, HIGH); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; }

Étapes rapides

Suivez ces instructions étape par étape :

  • Si c'est la première fois que vous utilisez l'Arduino Uno R4 WiFi/Minima, reportez-vous au tutoriel sur Arduino UNO R4 - Installation du logiciel..
  • Connectez la carte Arduino UNO R4 au capteur de couleur selon le schéma fourni.
  • Connectez la carte Arduino UNO R4 à votre ordinateur à l'aide d'un câble USB.
  • Lancez l'IDE Arduino sur votre ordinateur.
  • Sélectionnez la carte Arduino UNO R4 appropriée (par exemple Arduino Uno R4 WiFi) et le port COM.
  • Copiez le code ci-dessus et ouvrez-le dans l'IDE Arduino.
  • Cliquez sur le bouton Upload dans l'IDE Arduino pour téléverser le code vers l'Arduino UNO R4.
  • Ouvrez le Moniteur série. Vous verrez des lectures continues ainsi que les valeurs Min et Max.
  • Déplacez le capteur sur différents objets : un objet blanc (comme du papier), un objet noir et éventuellement quelques objets colorés.
  • Observez les lignes Min et Max se mettre à jour automatiquement pendant que le capteur suit les extrêmes.
  • Lorsque les valeurs Min et Max cessent de changer (généralement après 10 à 20 secondes), ce sont vos valeurs de calibration — notez-les.
COM6
Send
=== TCS3200 Calibration === Point the sensor at different objects (white, black, colors). Min and Max values are tracked automatically. When values look stable, note them down for the next code. ------------------------------------------ Red PW = 42 - Green PW = 55 - Blue PW = 60 Min -> R:42 G:55 B:60 Max -> R:42 G:55 B:60 ------------------------------------------ Red PW = 210 - Green PW = 185 - Blue PW = 172 Min -> R:42 G:55 B:60 Max -> R:210 G:185 B:172 ------------------------------------------ Red PW = 44 - Green PW = 57 - Blue PW = 61 Min -> R:42 G:55 B:60 Max -> R:210 G:185 B:172 ------------------------------------------
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Par exemple, à partir de la sortie ci-dessus, vos valeurs de calibration seraient :

  • RougeMin = 42, rougeMax = 210
  • VertMin = 55, vertMax = 185
  • BleuMin = 60, bleuMax = 172

Code Arduino UNO R4 - Lire les valeurs RVB

/* * Ce code Arduino UNO R4 a été développé par newbiely.fr * Ce code Arduino UNO R4 est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/arduino-uno-r4/arduino-uno-r4-tcs3200d-tcs230-color-sensor */ // Define color sensor pins #define S0 4 #define S1 3 #define S2 6 #define S3 5 #define sensorOut 7 // Calibration Values // *Get these from the Calibration Sketch int redMin = 0; // Red minimum pulse width int redMax = 0; // Red maximum pulse width int greenMin = 0; // Green minimum pulse width int greenMax = 0; // Green maximum pulse width int blueMin = 0; // Blue minimum pulse width int blueMax = 0; // Blue maximum pulse width // Variables for Color Pulse Width Measurements int redPW = 0; int greenPW = 0; int bluePW = 0; // Variables for final RGB values int redValue = 0; int greenValue = 0; int blueValue = 0; void setup() { // Set S0 - S3 as outputs pinMode(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); // Set Pulse Width scaling to 20% digitalWrite(S0, HIGH); digitalWrite(S1, LOW); // Set Sensor output as input pinMode(sensorOut, INPUT); // Setup Serial Monitor Serial.begin(9600); } void loop() { // Read Red Pulse Width redPW = getRedPW(); // Map to value from 0-255 redValue = map(redPW, redMin, redMax, 255, 0); // Delay to stabilize sensor delay(200); // Read Green Pulse Width greenPW = getGreenPW(); // Map to value from 0-255 greenValue = map(greenPW, greenMin, greenMax, 255, 0); // Delay to stabilize sensor delay(200); // Read Blue Pulse Width bluePW = getBluePW(); // Map to value from 0-255 blueValue = map(bluePW, blueMin, blueMax, 255, 0); // Delay to stabilize sensor delay(200); // Print output to Serial Monitor Serial.print("Red = "); Serial.print(redValue); Serial.print(" - Green = "); Serial.print(greenValue); Serial.print(" - Blue = "); Serial.println(blueValue); } // Function to read Red Pulse Widths int getRedPW() { // Set sensor to read Red only digitalWrite(S2, LOW); digitalWrite(S3, LOW); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; } // Function to read Green Pulse Widths int getGreenPW() { // Set sensor to read Green only digitalWrite(S2, HIGH); digitalWrite(S3, HIGH); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; } // Function to read Blue Pulse Widths int getBluePW() { // Set sensor to read Blue only digitalWrite(S2, LOW); digitalWrite(S3, HIGH); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; }

Étapes rapides

  • Dans le code ci-dessus, trouvez ces lignes près du début:
int redMin = 0; // Largeur d'impulsion minimale rouge int redMax = 0; // Largeur d'impulsion maximale pour le rouge int greenMin = 0; // Largeur d'impulsion minimale du vert int greenMax = 0; // Largeur d'impulsion maximale pour le vert int blueMin = 0; // Largeur d'impulsion minimale bleue int blueMax = 0; // Largeur d'impulsion maximale bleue
  • Remplacez TOUTES les six valeurs 0 par vos valeurs de calibration de l'étape précédente. Par exemple, si votre calibration vous a donné redMin = 42, redMax = 210, greenMin = 55, greenMax = 185, blueMin = 60, blueMax = 172, modifiez les lignes pour :
int rougeMin = 42; int rougeMax = 210; int vertMin = 55; int vertMax = 185; int bleuMin = 60; int bleuMax = 172;
  • Téléversez le code sur l'Arduino UNO R4.
  • Placez un objet de couleur devant le capteur.
  • Vérifiez le résultat sur le Moniteur série.
COM6
Send
Red = 210 - Green = 35 - Blue = 20 Red = 25 - Green = 200 - Blue = 40 Red = 30 - Green = 45 - Blue = 215
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Les valeurs RVB sont désormais mappées sur la plage standard de 0 à 255. Des durées d'impulsion plus courtes (plus de lumière) produisent des valeurs RVB plus élevées, et des durées d'impulsion plus longues (moins de lumière) produisent des valeurs RVB plus faibles.

Applications

Maintenant que vous pouvez lire les valeurs RVB, vous pouvez réaliser des projets comme :

  • Triageur de couleurs: Trier les objets par couleur (rouge, vert, bleu)
  • Jeu de correspondance des couleurs: Vérifier si deux objets ont la même couleur
  • Robot suiveur de ligne: Suivre des lignes colorées au sol
  • Contrôle qualité: Détecter les produits défectueux par couleur
  • Alarme activée par couleur: Déclencher un buzzer ou une LED lorsqu'une couleur spécifique est détectée

Vidéo

※ NOS MESSAGES

  • N'hésitez pas à partager le lien de ce tutoriel. Cependant, veuillez ne pas utiliser notre contenu sur d'autres sites web. Nous avons investi beaucoup d'efforts et de temps pour créer ce contenu, veuillez respecter notre travail !