ESP8266 - Capteur de couleur TCS3200D/TCS230

Ce tutoriel vous guide dans l'utilisation de l'ESP8266 avec le capteur de couleur TCS3200D/TCS230 pour une détection précise des couleurs et une mesure RVB.

En détail, nous apprendrons :

Préparation du matériel

1×ESP8266 NodeMCU ESP-12E
1×Recommandé: ESP8266 NodeMCU ESP-12E (Uno-form)
1×Câble USB Type-A vers Type-C (pour PC USB-A)
1×Câble USB Type-C vers Type-C (pour PC USB-C)
1×TCS3200D/TCS230 Color Recognition Sensor Module
1×Plaque d'essai
1×Fils de connexion
1×Optionnel: Connecteur d'alimentation DC
1×Recommandé: Carte d'extension à bornier à vis pour ESP8266
1×Recommandé: Répartiteur d'alimentation pour ESP8266 Type-C

Ou vous pouvez acheter les kits suivants:

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

Le capteur de couleur TCS3200D/TCS230 utilise une grille de 64 photodiodes disposées en une matrice 8×8 pour la détection des couleurs via un filtrage spécifique à la longueur d’onde. Dans ce réseau, 16 photodiodes intègrent des filtres de longueur d’onde rouge, 16 utilisent des filtres de longueur d’onde verte, 16 emploient des filtres bleus et 16 fonctionnent sans filtrage (réponse claire). La mesure des couleurs s’effectue en sélectionnant des ensembles de filtres particuliers et en évaluant la fréquence du signal de sortie.

Les modules TCS3200D courants présentent des matrices d’éclairage LED blanches intégrées qui fournissent un éclairage constant de la cible, assurant la stabilité des mesures quelles que soient les fluctuations de l’éclairage externe et améliorant la sensibilité dans des conditions de faible luminosité.

Brochage

Configuration des broches du module capteur TCS3200D/TCS230 :

  • Broche VCC: Entrée d'alimentation (+5 V).
  • Broche GND: Référence de masse (0 V).
  • Broches S0, S1: Sélecteurs de mise à l'échelle de la fréquence de sortie.
  • Broches S2, S3: Sélecteurs de filtre des canaux couleur.
  • Broche OUT: Sortie d'onde carrée modulée en fréquence.
  • Broche OE: Entrée d'activation de la sortie (s'active lorsque le niveau est BAS). Les modules standard la branchent généralement directement à la masse en interne. Si ce n'est pas connecté, reliez-le manuellement à 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 fonctionnement du capteur dépend de deux commandes principales : quel groupe de filtres pour photodiodes activer et quelle plage de fréquences de sortie générer. Deux paires de broches de contrôle gèrent ces fonctions :

Contrôle de la mise à l'échelle de la fréquence (broches S0 et S1) :

  • S0=BAS, S1=BAS: État hors tension
  • S0=BAS, S1=HAUT: facteur d'échelle de 2 %
  • S0=HAUT, S1=BAS: facteur d'échelle de 20 %
  • S0=HAUT, S1=HAUT: facteur d'échelle de 100 % (vitesse maximale)

Sélection du canal de couleur (broches S2 et S3) :

  • S2=BAS, S3=BAS: Photodiodes rouges actives
  • S2=BAS, S3=HAUT: Photodiodes bleues actives
  • S2=HAUT, S3=BAS: Photodiodes claires actives (pas de filtrage)
  • S2=HAUT, S3=HAUT: Photodiodes vertes actives

La broche OUT fournit des fréquences d'onde carrée couvrant environ 2 Hz à 500 kHz. Une intensité lumineuse plus élevée produit une sortie de fréquence plus élevée. La fonction pulseIn() de l'ESP8266 mesure la durée d'une impulsion, ce qui est inversement corrélé : une illumination plus lumineuse produit des durées plus courtes. Des mesures calibrées se traduisent par un format RVB conventionnel 0-255.

Atteindre une précision optimale

  • Maintenez le capteur à une distance de 1 à 3 cm de la cible de mesure avec un alignement angulaire stable.
  • Utilisez un éclairage LED blanc intégré pour un éclairage reproductible.
  • Protégez le capteur de la lumière ambiante variable afin d'améliorer la constance des mesures.

Diagramme de câblage

Connectez le capteur de couleur TCS3200 à l'ESP8266 comme suit :

TCS3200 Color SensorESP8266
VCC3V3
GNDGND
S0D6 (GPIO12)
S1D7 (GPIO13)
S2D2 (GPIO4)
S3D5 (GPIO14)
OUTD1 (GPIO5)
Schéma de câblage du capteur de couleur ESP8266 NodeMCU et TCS3200

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

Pour plus d'informations, consultez Brochage ESP8266. et Comment alimenter l'ESP8266..

Code ESP8266 - Calibration du capteur

L'étalonnage élimine les interférences environnementales des mesures brutes. Les variables telles que la puissance de sortie de la LED, l'espacement des cibles, la réflectivité du matériau et l'éclairage ambiant influent sur les mesures. La routine d'étalonnage identifie les largeurs d'impulsion minimales et maximales sur tous les canaux de couleur, établissant des limites de référence pour convertir les données brutes en valeurs RGB précises de 0 à 255 adaptées à votre environnement de déploiement.

/* * Ce code ESP8266 NodeMCU a été développé par newbiely.fr * Ce code ESP8266 NodeMCU 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/esp8266/esp8266-tcs3200d-tcs230-color-sensor */ // Define color sensor pins #define PIN_S0 D6 // The ESP8266 pin GPIO12 connected to the S0 of the color module #define PIN_S1 D7 // The ESP8266 pin GPIO13 connected to the S1 of the color module #define PIN_S2 D2 // The ESP8266 pin GPIO4 connected to the S2 of the color module #define PIN_S3 D5 // The ESP8266 pin GPIO14 connected to the S3 of the color module #define PIN_sensorOut D1 // The ESP8266 pin GPIO5 connected to the OUT of the color module // 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

Pour commencer avec l'ESP8266 dans l'IDE Arduino, suivez ces étapes :

  • Consultez le tutoriel Installation du logiciel ESP8266. si c'est la première fois que vous utilisez l'ESP8266.
  • Connectez les composants comme indiqué sur le schéma.
  • Branchez la carte ESP8266 à votre ordinateur à l'aide d'un câble USB.
  • Ouvrez l'IDE Arduino sur votre ordinateur.
  • Choisissez la carte ESP8266 correcte, telle que (par exemple NodeMCU 1.0 (ESP-12E Module)), et son port COM respectif.
  • Copiez le code d'étalonnage et ouvrez-le dans l'IDE Arduino.
  • Cliquez sur le bouton Upload pour compiler et téléverser sur l'ESP8266.
  • Lancez le moniteur série.
  • Dirigez le capteur vers différentes surfaces : blanc (papier), noir et différentes couleurs.
  • Observez les valeurs min et max qui se mettent à jour automatiquement.
  • Lorsque les valeurs se stabilisent (généralement 10 à 20 secondes), enregistrez les six paramètres 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  

Exemples de paramètres d'étalonnage extraits de la sortie ci-dessus:

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

Code ESP8266 - Lecture des valeurs RVB

/* * Ce code ESP8266 NodeMCU a été développé par newbiely.fr * Ce code ESP8266 NodeMCU 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/esp8266/esp8266-tcs3200d-tcs230-color-sensor */ // Define color sensor pins #define PIN_S0 D6 // The ESP8266 pin GPIO12 connected to the S0 of the color module #define PIN_S1 D7 // The ESP8266 pin GPIO13 connected to the S1 of the color module #define PIN_S2 D2 // The ESP8266 pin GPIO4 connected to the S2 of the color module #define PIN_S3 D5 // The ESP8266 pin GPIO14 connected to the S3 of the color module #define PIN_sensorOut D1 // The ESP8266 pin GPIO5 connected to the OUT of the color module // 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 variables d'étalonnage au début du code:

Please provide the English text to translate. The content between the code blocks is empty.

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

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

int greenMin = 0; // Largeur d'impulsion minimale pour le vert

int greenMax = 0; // Largeur d'impulsion maximale du vert

int blueMin = 0; // Largeur d'impulsion minimale bleue

int blueMax = 0; // Largeur d'impulsion maximale bleue

The content to translate is missing. Please paste the English text you want translated into French.

  • Remplacez tous les six espaces réservés à zéro par des données d'étalonnage mesurées. Exemple en utilisant les valeurs redMin = 42, redMax = 210, greenMin = 55, greenMax = 185, blueMin = 60, blueMax = 172 :

Please provide the English text to translate.

int rougeMin = 42;

int rougeMax = 210;

int vertMin = 55;

int maxVert = 185;

int bleuMin = 60;

int bleuMax = 172;

Please provide the English text you would like translated into French.

  • Téléchargez le code mis à jour sur l'ESP8266.
  • Placez un objet de couleur devant le capteur.
  • Ouvrez le moniteur série pour afficher les mesures RGB.
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 affichées respectent l'échelle standard 0-255. Des largeurs d'impulsion réduites (indiquant des réflexions plus lumineuses) génèrent des sorties RVB plus élevées ; des largeurs d'impulsion prolongées (réflexions plus sombres) produisent des valeurs plus faibles.

À partir des valeurs RVB, vous pouvez :

  • Identifier des couleurs spécifiques en comparant les rapports RVB
  • Trier les objets selon la détection des couleurs
  • Faire correspondre les couleurs entre différents échantillons
  • Déclencher des actions en fonction des couleurs détectées

Candidatures de projets

Avec une capacité de mesure RGB opérationnelle, vous pouvez développer :

  • Système de tri chromatique : Classer les objets par couleur (différenciation rouge/vert/bleu)
  • Dispositif de vérification des couleurs : Confirmer la cohérence des couleurs entre les échantillons
  • Suiveur de chemin coloré : Robots qui naviguent le long des marqueurs chromatiques
  • Inspection visuelle de la qualité : Détecter les défauts de production par analyse des couleurs
  • Automatisation déclenchée par la couleur : Exécuter des actions lorsque des teintes spécifiques sont détectées

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 !