Arduino - Capteur de couleur TCS3200D/TCS230

Ce tutoriel illustre l'interfaçage d'un capteur de reconnaissance de couleur TCS3200D/TCS230 avec Arduino afin de mesurer et d'identifier les valeurs RGB de divers objets. Vous maîtriserez les techniques d'étalonnage du capteur et la programmation de la détection des couleurs.

Sujets abordés:

Tutoriel Arduino avec le module capteur de reconnaissance des couleurs TCS3200D/TCS230

Préparation du matériel

1×Arduino Uno R3
1×Câble USB 2.0 type A/B (pour PC USB-A)
1×Câble USB 2.0 type C/B (pour PC USB-C)
1×TCS3200D/TCS230 Color Recognition Sensor Module
1×Fils de connexion
1×Recommandé: Shield à bornier à vis pour Arduino Uno
1×Recommandé: Shield plaque d'essai pour Arduino Uno
1×Recommandé: Boîtier pour Arduino Uno
1×Recommandé: Kit plaque de base prototypage et plaque d'essai pour Arduino Uno

Ou vous pouvez acheter les kits suivants:

1×Kit de Démarrage DIYables STEM V3 (Arduino inclus)
1×Kit de Capteurs DIYables (30 capteurs/écrans)
1×Kit de Capteurs DIYables (18 capteurs/écrans)
Divulgation : Certains des liens fournis dans cette section sont des liens affiliés Amazon. Nous pouvons recevoir une commission pour tout achat effectué via ces liens, sans coût supplémentaire pour vous. Nous vous remercions de votre soutien.

À propos du capteur de couleur TCS3200D/TCS230

Construit autour d'une matrice de photodiodes 8×8, le TCS3200D/TCS230 identifie les couleurs grâce à un filtrage optique spécialisé. La grille de 64 diodes comprend 16 photodiodes à filtre rouge, 16 photodiodes à filtre vert, 16 photodiodes à filtre bleu et 16 photodiodes non filtrées (claires). La détection des couleurs s'effectue en basculant entre les types de filtres et en analysant la sortie en forme d'onde carrée dont la fréquence représente l'intensité lumineuse.

Des LED blanches intégrées sur la plupart des modules offrent un éclairage de la cible cohérent, garantissant des mesures stables quelles que soient les conditions ambiantes et améliorant les performances en faible luminosité.

Schéma des broches

Les broches de connexion du module TCS3200D/TCS230 incluent :

  • Broche VCC : Connexion d'alimentation (+5 V).
  • Broche GND : Connexion à la masse (0 V).
  • Broches S0, S1 : Entrées de contrôle de l'échelle de fréquence.
  • Broches S2, S3 : Entrées de sélection du filtre couleur.
  • Broche OUT : Sortie de fréquence (onde carrée).
  • Broche OE : Contrôle d'activation de la sortie (actif lorsque LOW). La plupart des modules commerciaux mettent ce pin à la masse en interne, ce qui élimine le câblage externe. S'il n'est pas pré-connecté, reliez-le manuellement à la masse.
Diagramme de brochage du module capteur de couleur TCS3200/TCS230 montrant les broches VCC, GND, S0, S1, S2, S3 et OUT.

Comment cela fonctionne

Pour faire fonctionner le capteur, il est nécessaire de configurer deux paramètres clés : le canal de couleur actif et l'intensité du signal. Des paires de broches de contrôle gèrent ces paramètres :

Mise à l'échelle de la sortie via S0 et S1 :

  • Les deux LOW: mode hors tension
  • S0 LOW, S1 HIGH: échelle de fréquence de 2 %
  • S0 HIGH, S1 LOW: échelle de fréquence de 20 %
  • Les deux HIGH: échelle de fréquence à 100 %

Sélection des filtres via S2 et S3:

  • Tous deux en état bas : canal rouge actif
  • S2 bas, S3 haut : canal bleu actif
  • S2 haut, S3 bas : canal clair (non filtré)
  • Tous deux en état haut : canal vert actif

La broche OUT génère des signaux carrés allant d'environ 2 Hz à 500 kHz. Des fréquences plus élevées indiquent une intensité lumineuse plus forte pour le canal sélectionné. Mesurer la largeur d'impulsion avec pulseIn() illustre la relation inverse — des impulsions plus courtes signifient des couleurs plus vives. Après calibrage, la conversion donne des valeurs RVB standard.

Maximiser la précision de la lecture

  • Maintenez une distance de 1 à 3 cm entre le capteur et la cible, en conservant un positionnement cohérent.
  • Activez les LED blanches embarquées pour des conditions d'éclairage uniformes.
  • Réduisez au minimum les interférences de la lumière ambiante en protégeant le capteur pour une précision améliorée.

Diagramme de câblage

Schéma de câblage pour le capteur de couleur TCS3200 et Arduino:

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

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

Code Arduino - Calibration du capteur par largeur d'impulsion

L'étalonnage environnemental s'avère essentiel car la sortie brute du capteur varie en fonction de plusieurs facteurs : l'intensité de la LED embarquée, la distance à la cible, les propriétés de réflexion de la surface et l'éclairage ambiant. Considérez ces variables comme des interférences de mesure. L'étalonnage quantifie ces interférences en établissant des limites minimales et maximales pour chaque canal de couleur, permettant une conversion précise vers l'échelle RGB standard de 0 à 255 adaptée à votre configuration spécifique.

/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino 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/arduino-tcs3200d-tcs230-color-sensor */ // Define color sensor pins #define PIN_S0 4 #define PIN_S1 3 #define PIN_S2 6 #define PIN_S3 5 #define PIN_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(PIN_S0, OUTPUT); pinMode(PIN_S1, OUTPUT); pinMode(PIN_S2, OUTPUT); pinMode(PIN_S3, OUTPUT); // Set Pulse Width scaling to 20% digitalWrite(PIN_S0, HIGH); digitalWrite(PIN_S1, LOW); // Set Sensor output as input pinMode(PIN_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 the pulse width values with min/max Serial.print("Red PW = "); Serial.print(redPW); Serial.print(" - Green PW = "); Serial.print(greenPW); Serial.print(" - Blue PW = "); Serial.println(bluePW); 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("------------------------------------------"); delay(1000); } // Function to read Red Pulse Widths int getRedPW() { // Set sensor to read Red only digitalWrite(PIN_S2, LOW); digitalWrite(PIN_S3, LOW); // Read the Pulse Width int PW = pulseIn(PIN_sensorOut, LOW); // Return the value return PW; } // Function to read Green Pulse Widths int getGreenPW() { // Set sensor to read Green only digitalWrite(PIN_S2, HIGH); digitalWrite(PIN_S3, HIGH); // Read the Pulse Width int PW = pulseIn(PIN_sensorOut, LOW); // Return the value return PW; } // Function to read Blue Pulse Widths int getBluePW() { // Set sensor to read Blue only digitalWrite(PIN_S2, LOW); digitalWrite(PIN_S3, HIGH); // Read the Pulse Width int PW = pulseIn(PIN_sensorOut, LOW); // Return the value return PW; }

Étapes rapides

  • Ouvrez le code d'étalonnage dans l'IDE Arduino
  • Téléversez sur votre carte Arduino en utilisant le bouton Upload
  • Lancez le Moniteur Série pour afficher les lectures en direct avec le suivi Min/Max
  • Scannez divers objets avec le capteur : surfaces blanches (papier), objets noirs, ainsi que divers objets colorés
  • Observez les mises à jour automatiques des valeurs Min/Max à mesure que les extrêmes sont enregistrés
  • Lorsque les chiffres se stabilisent (généralement 10 à 20 secondes), enregistrez les six constantes d'étalonnage
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 d'étalonnage seraient :

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

Code Arduino - Lecture des valeurs de couleur RVB

/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino 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/arduino-tcs3200d-tcs230-color-sensor */ // Define color sensor pins #define PIN_S0 4 #define PIN_S1 3 #define PIN_S2 6 #define PIN_S3 5 #define PIN_sensorOut 7 // Calibration Values // Replace these values with your actual calibration data from the previous step 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 Color values int redValue; int greenValue; int blueValue; void setup() { // Set S0 - S3 as outputs pinMode(PIN_S0, OUTPUT); pinMode(PIN_S1, OUTPUT); pinMode(PIN_S2, OUTPUT); pinMode(PIN_S3, OUTPUT); // Set Pulse Width scaling to 20% digitalWrite(PIN_S0, HIGH); digitalWrite(PIN_S1, LOW); // Set Sensor output as input pinMode(PIN_sensorOut, INPUT); // Setup Serial Monitor Serial.begin(9600); } void loop() { // Read Red value redPW = getRedPW(); // Map to value from 0-255 redValue = map(redPW, redMin, redMax, 255, 0); // Delay to stabilize sensor delay(200); // Read Green value greenPW = getGreenPW(); // Map to value from 0-255 greenValue = map(greenPW, greenMin, greenMax, 255, 0); // Delay to stabilize sensor delay(200); // Read Blue value 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(PIN_S2, LOW); digitalWrite(PIN_S3, LOW); // Read the Pulse Width int PW = pulseIn(PIN_sensorOut, LOW); // Return the value return PW; } // Function to read Green Pulse Widths int getGreenPW() { // Set sensor to read Green only digitalWrite(PIN_S2, HIGH); digitalWrite(PIN_S3, HIGH); // Read the Pulse Width int PW = pulseIn(PIN_sensorOut, LOW); // Return the value return PW; } // Function to read Blue Pulse Widths int getBluePW() { // Set sensor to read Blue only digitalWrite(PIN_S2, LOW); digitalWrite(PIN_S3, HIGH); // Read the Pulse Width int PW = pulseIn(PIN_sensorOut, LOW); // Return the value return PW; }

Étapes rapides

  • • Localisez les déclarations des variables d'étalonnage près du début du code :

Aucun texte fourni à traduire.

int redMin = 0; // Largeur d'impulsion minimale pour le rouge

int redMax = 0; // Largeur d'impulsion maximale rouge

int greenMin = 0; // Largeur d'impulsion minimale pour la couleur verte

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

Please provide the English text to translate.

  • Mettez à jour toutes les six valeurs zéro en utilisant les résultats d'étalonnage de l'exercice précédent. Exemple de transformation (en utilisant les résultats d'étalonnage redMin = 42, redMax = 210, greenMin = 55, greenMax = 185, blueMin = 60, blueMax = 172) :

Please provide the English text to translate.

int rougeMin = 42;

int redMax = 210;

int minVert = 55;

int vertMax = 185;

int bleuMin = 60;

int bleuMax = 172;

Please provide the English text to translate.

  • Téléversez le code modifié sur l'Arduino
  • Placez une cible colorée devant le capteur
  • Surveillez la sortie RVB dans 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 0-255. Des largeurs d'impulsion plus courtes (plus de lumière) produisent des valeurs RVB plus élevées, et des largeurs 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 :

  • Trieur de couleurs: Trie les objets par couleur (rouge, vert, bleu)
  • Jeu d'association des couleurs: Vérifie si deux objets ont la même couleur
  • Robot suiveur de ligne: Suit des lignes colorées au sol
  • Contrôle qualité: Détecte les produits défectueux par leur couleur
  • Alarme activée par la couleur: Déclenche un buzzer ou une DEL lorsque une couleur spécifique est détectée

Vidéo

Références de fonctions

Tutoriels connexes

※ 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 !