Raspberry Pi - Capteur de Couleur TCS3200D/TCS230

Ce guide complet vous montre comment connecter le capteur de couleur TCS3200D/TCS230 au Raspberry Pi pour une mesure de couleur précise et l'extraction de valeurs RVB. Maîtrisez les procédures de calibration et développez des capacités de reconnaissance des couleurs dans vos projets.

Objectifs d'apprentissage :

Tutoriel capteur de reconnaissance de couleur TCS3200D TCS230 avec Raspberry Pi

Matériel Requis

1×Raspberry Pi 5
1×TCS3200D/TCS230 Color Recognition Sensor Module
1×Plaque d'essai
1×Fils de connexion
1×Recommandé: Shield à bornier à vis pour Raspberry Pi
1×Recommandé: Kit plaque de base prototypage et plaque d'essai pour Raspberry Pi
1×Recommandé: Écran tactile HDMI pour Raspberry Pi

Ou vous pouvez acheter les kits suivants:

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 TCS3200D/TCS230 utilise une matrice de photodiodes disposées en grille 8×8 pour la détection des couleurs par filtrage optique. Dans ce réseau de 64 éléments, 16 photodiodes comportent des filtres spectraux rouges, 16 autres utilisent des filtres verts, 16 emploient des filtres bleus, et les 16 restantes fonctionnent sans filtres (réponse claire). La mesure des couleurs se fait en activant des ensembles de filtres spécifiques et en analysant la sortie en onde carrée modulée en fréquence.

Les tableaux de LED blanches intégrés sur les modules typiques fournissent un éclairage constant aux cibles, maintenant la stabilité des lectures indépendamment des variations d'éclairage externe et améliorant les performances dans les environnements peu éclairés.

Brochage

Connexions disponibles sur la carte capteur TCS3200D/TCS230 :

  • Broche VCC : Entrée de tension d'alimentation (+5V).
  • Broche GND : Référence de masse (0V).
  • Broches S0, S1 : Sélecteurs de mise à l'échelle de fréquence de sortie.
  • Broches S2, S3 : Sélecteurs de filtre de canal de couleur.
  • Broche OUT : Sortie en onde carrée modulée en fréquence.
  • Broche OE : Entrée d'activation de sortie (s'active quand LOW). Les modules standard câblent généralement cela à GND en interne. Si non connecté, câblez manuellement à GND.
Schéma de brochage du module capteur de couleur TCS3200 TCS230

Comment Ça Fonctionne

Deux paramètres critiques contrôlent le comportement du capteur : quel canal de couleur activer et quelle intensité de signal de sortie générer. Deux paires d'entrées de contrôle gèrent ces fonctions :

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

  • S0=LOW, S1=LOW : État d'arrêt
  • S0=LOW, S1=HIGH : Facteur de mise à l'échelle 2%
  • S0=HIGH, S1=LOW : Facteur de mise à l'échelle 20%
  • S0=HIGH, S1=HIGH : Facteur de mise à l'échelle 100% (pleine vitesse)

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

  • S2=LOW, S3=LOW : Photodiodes rouges actives
  • S2=LOW, S3=HIGH : Photodiodes bleues actives
  • S2=HIGH, S3=LOW : Photodiodes claires actives (sans filtre)
  • S2=HIGH, S3=HIGH : Photodiodes vertes actives

La broche OUT délivre des fréquences en onde carrée allant d'environ 2 Hz à 500 kHz. La fréquence augmente avec l'intensité lumineuse — une illumination plus brillante produit une sortie à fréquence plus élevée. En mesurant la durée d'impulsion (qui est inversement corrélée — des durées plus courtes indiquent une lumière plus forte), nous pouvons traduire ces mesures au format RVB standard 0-255 par calibration.

Atteindre une Précision Optimale

  • Gardez le capteur positionné à 1-3 cm de la cible de mesure avec un alignement angulaire stable.
  • Utilisez l'éclairage LED blanc intégré pour un éclairage répétable.
  • Protégez le capteur de la lumière ambiante variable pour améliorer la cohérence des mesures.

Schéma de Câblage

Configuration de câblage du capteur de couleur TCS3200 vers Raspberry Pi :

Capteur de Couleur TCS3200Raspberry Pi
VCC5V
GNDGND
OUTGPIO23
S0GPIO8
S1GPIO7
S2GPIO24
S3GPIO25
Schéma de câblage Raspberry Pi et capteur de couleur TCS3200 montrant la connexion entre les broches

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

Pour simplifier et organiser votre montage de câblage, nous recommandons l'utilisation d'un shield à bornier à vis pour Raspberry Pi. Ce shield assure des connexions plus sûres et mieux gérées, comme illustré ci-dessous :

Shield à bornier à vis pour Raspberry Pi

Code Raspberry Pi - Calibration par Largeur d'Impulsion

La calibration élimine les interférences environnementales des mesures brutes. Les variables incluant la puissance de sortie LED, l'espacement de la cible, la réflectivité du matériau et l'éclairage ambiant affectent toutes les lectures. Considérez-les comme des erreurs systématiques nécessitant une mesure. La routine de calibration 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 RVB précises 0–255 correspondant à votre environnement de déploiement.

# Ce code Raspberry Pi a été développé par newbiely.fr # Ce code Raspberry Pi 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/raspberry-pi/raspberry-pi-tcs3200d-tcs230-color-sensor import RPi.GPIO as GPIO import time # Pin Definitions (all on same physical row for easy wiring) OUT_PIN = 23 # Raspberry Pi GPIO23 pin connected to OUT (physical pin 16) S0_PIN = 8 # Raspberry Pi GPIO8 pin connected to S0 (physical pin 24) S1_PIN = 7 # Raspberry Pi GPIO7 pin connected to S1 (physical pin 26) S2_PIN = 24 # Raspberry Pi GPIO24 pin connected to S2 (physical pin 18) S3_PIN = 25 # Raspberry Pi GPIO25 pin connected to S3 (physical pin 22) # Set up GPIO mode GPIO.setmode(GPIO.BCM) GPIO.setup(S0_PIN, GPIO.OUT) GPIO.setup(S1_PIN, GPIO.OUT) GPIO.setup(S2_PIN, GPIO.OUT) GPIO.setup(S3_PIN, GPIO.OUT) GPIO.setup(OUT_PIN, GPIO.IN) # Set frequency scaling to 2% (S0=LOW, S1=HIGH) for reliable timing on Raspberry Pi GPIO.output(S0_PIN, GPIO.LOW) GPIO.output(S1_PIN, GPIO.HIGH) # Variables to track min and max pulse widths for each color red_min = 999999 red_max = 0 green_min = 999999 green_max = 0 blue_min = 999999 blue_max = 0 def read_pulse_width(): """Read the pulse width from OUT pin in microseconds""" # Wait for pulse to go HIGH timeout = time.time() + 0.1 # 100ms timeout while GPIO.input(OUT_PIN) == GPIO.LOW: if time.time() > timeout: return 0 # Measure HIGH pulse duration pulse_start = time.time() timeout = time.time() + 0.1 while GPIO.input(OUT_PIN) == GPIO.HIGH: if time.time() > timeout: return 0 pulse_end = time.time() # Return duration in microseconds return int((pulse_end - pulse_start) * 1000000) def read_red(): """Read red color pulse width """ GPIO.output(S2_PIN, GPIO.LOW) GPIO.output(S3_PIN, GPIO.LOW) time.sleep(0.01) return read_pulse_width() def read_green(): """Read green color pulse width""" GPIO.output(S2_PIN, GPIO.HIGH) GPIO.output(S3_PIN, GPIO.HIGH) time.sleep(0.01) return read_pulse_width() def read_blue(): """Read blue color pulse width """ GPIO.output(S2_PIN, GPIO.LOW) GPIO.output(S3_PIN, GPIO.HIGH) time.sleep(0.01) return read_pulse_width() try: print("=== TCS3200 Calibration ===") print("Point the sensor at different objects (white, black, colors).") print("Min and Max values are tracked automatically.") print("When values look stable, note them down for the next code.") print() while True: # Read all three colors (average of 3 readings for stability) red_readings = [read_red() for _ in range(3)] green_readings = [read_green() for _ in range(3)] blue_readings = [read_blue() for _ in range(3)] red_pw = sum(r for r in red_readings if r > 0) // max(1, len([r for r in red_readings if r > 0])) green_pw = sum(g for g in green_readings if g > 0) // max(1, len([g for g in green_readings if g > 0])) blue_pw = sum(b for b in blue_readings if b > 0) // max(1, len([b for b in blue_readings if b > 0])) # Update min values if red_pw > 0 and red_pw < red_min: red_min = red_pw if green_pw > 0 and green_pw < green_min: green_min = green_pw if blue_pw > 0 and blue_pw < blue_min: blue_min = blue_pw # Update max values if red_pw > red_max: red_max = red_pw if green_pw > green_max: green_max = green_pw if blue_pw > blue_max: blue_max = blue_pw # Display current readings and min/max print("-" * 42) print(f"Red PW = {red_pw} - Green PW = {green_pw} - Blue PW = {blue_pw}") print(f" Min -> R:{red_min} G:{green_min} B:{blue_min}") print(f" Max -> R:{red_max} G:{green_max} B:{blue_max}") time.sleep(0.5) except KeyboardInterrupt: print("\nCalibration stopped") print(f"\nFinal calibration values:") print(f"redMin = {red_min}, redMax = {red_max}") print(f"greenMin = {green_min}, greenMax = {green_max}") print(f"blueMin = {blue_min}, blueMax = {blue_max}") finally: GPIO.cleanup()

Étapes Rapides

  • Copiez le code et sauvegardez-le dans un fichier, par exemple, tcs3200_calibration.py
  • Exécutez le script :
PuTTY - Raspberry Pi
python3 tcs3200_calibration.py
  • Exposez le capteur à diverses surfaces : matériaux blancs (papier d'imprimante), objets noirs, plus des articles multicolores
  • Regardez les limites Min/Max se mettre à jour automatiquement au fur et à mesure que les extrêmes sont détectés
  • Une fois que les valeurs se stabilisent (généralement 10-20 secondes), appuyez sur Ctrl+C pour arrêter
  • Notez les six paramètres de calibration affichés
PuTTY - Raspberry Pi
=== 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 ------------------------------------------ Calibration stopped Final calibration values: redMin = 42, redMax = 210 greenMin = 55, greenMax = 185 blueMin = 60, blueMax = 172

Paramètres de calibration extraits de la sortie ci-dessus :

  • RedMin = 42, redMax = 210
  • GreenMin = 55, greenMax = 185
  • BlueMin = 60, blueMax = 172

Code Raspberry Pi - Mesure des Valeurs RVB

# Ce code Raspberry Pi a été développé par newbiely.fr # Ce code Raspberry Pi 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/raspberry-pi/raspberry-pi-tcs3200d-tcs230-color-sensor import RPi.GPIO as GPIO import time # Pin Definitions (all on same physical row for easy wiring) OUT_PIN = 23 # Raspberry Pi GPIO23 pin connected to OUT (physical pin 16) S0_PIN = 8 # Raspberry Pi GPIO8 pin connected to S0 (physical pin 24) S1_PIN = 7 # Raspberry Pi GPIO7 pin connected to S1 (physical pin 26) S2_PIN = 24 # Raspberry Pi GPIO24 pin connected to S2 (physical pin 18) S3_PIN = 25 # Raspberry Pi GPIO25 pin connected to S3 (physical pin 22) # Calibration values - REPLACE with your calibrated values! red_min = 0 red_max = 0 green_min = 0 green_max = 0 blue_min = 0 blue_max = 0 # Set up GPIO mode GPIO.setmode(GPIO.BCM) GPIO.setup(S0_PIN, GPIO.OUT) GPIO.setup(S1_PIN, GPIO.OUT) GPIO.setup(S2_PIN, GPIO.OUT) GPIO.setup(S3_PIN, GPIO.OUT) GPIO.setup(OUT_PIN, GPIO.IN) # Set frequency scaling to 2% (S0=LOW, S1=HIGH) for reliable timing on Raspberry Pi GPIO.output(S0_PIN, GPIO.LOW) GPIO.output(S1_PIN, GPIO.HIGH) def read_pulse_width(): """Read the pulse width from OUT pin in microseconds""" # Wait for pulse to go HIGH timeout = time.time() + 0.1 # 100ms timeout while GPIO.input(OUT_PIN) == GPIO.LOW: if time.time() > timeout: return 0 # Measure HIGH pulse duration pulse_start = time.time() timeout = time.time() + 0.1 while GPIO.input(OUT_PIN) == GPIO.HIGH: if time.time() > timeout: return 0 pulse_end = time.time() # Return duration in microseconds return int((pulse_end - pulse_start) * 1000000) def read_red(): """Read red color pulse width """ GPIO.output(S2_PIN, GPIO.LOW) GPIO.output(S3_PIN, GPIO.LOW) time.sleep(0.01) return read_pulse_width() def read_green(): """Read green color pulse width""" GPIO.output(S2_PIN, GPIO.HIGH) GPIO.output(S3_PIN, GPIO.HIGH) time.sleep(0.01) return read_pulse_width() def read_blue(): """Read blue color pulse width """ GPIO.output(S2_PIN, GPIO.LOW) GPIO.output(S3_PIN, GPIO.HIGH) time.sleep(0.01) return read_pulse_width() def map_value(value, in_min, in_max, out_min, out_max): """Map value from one range to another""" if in_max == in_min: return out_min return int((value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min) def constrain(value, min_val, max_val): """Constrain value between min and max """ return max(min_val, min(value, max_val)) try: print("TCS3200 Color Sensor - RGB Reading") print() while True: # Read pulse widths for all colors (average of 3 readings for stability) red_readings = [read_red() for _ in range(3)] green_readings = [read_green() for _ in range(3)] blue_readings = [read_blue() for _ in range(3)] red_pw = sum(r for r in red_readings if r > 0) // max(1, len([r for r in red_readings if r > 0])) green_pw = sum(g for g in green_readings if g > 0) // max(1, len([g for g in green_readings if g > 0])) blue_pw = sum(b for b in blue_readings if b > 0) // max(1, len([b for b in blue_readings if b > 0])) # Convert to 0-255 RGB values # Lower pulse width = brighter = higher RGB value red_value = map_value(red_pw, red_min, red_max, 255, 0) green_value = map_value(green_pw, green_min, green_max, 255, 0) blue_value = map_value(blue_pw, blue_min, blue_max, 255, 0) # Constrain to 0-255 range red_value = constrain(red_value, 0, 255) green_value = constrain(green_value, 0, 255) blue_value = constrain(blue_value, 0, 255) # Display RGB values print(f"Red = {red_value} - Green = {green_value} - Blue = {blue_value}") time.sleep(0.5) except KeyboardInterrupt: print("\nProgram stopped") finally: GPIO.cleanup()

Étapes Rapides

  • Identifiez les variables de calibration au début du code :
red_min = 0 red_max = 0 green_min = 0 green_max = 0 blue_min = 0 blue_max = 0
  • Remplacez les six zéros par les données de calibration mesurées. Exemple avec les valeurs redMin = 42, redMax = 210, greenMin = 55, greenMax = 185, blueMin = 60, blueMax = 172 :
red_min = 42 red_max = 210 green_min = 55 green_max = 185 blue_min = 60 blue_max = 172
  • Sauvegardez le code mis à jour dans un fichier, par exemple, tcs3200_sensor.py
  • Exécutez le script :
PuTTY - Raspberry Pi
python3 tcs3200_sensor.py
  • Disposez l'échantillon coloré devant le capteur
  • Vérifiez la sortie RVB dans le terminal
PuTTY - Raspberry Pi
TCS3200 Color Sensor - RGB Reading Red = 210 - Green = 35 - Blue = 20 Red = 25 - Green = 200 - Blue = 40 Red = 30 - Green = 45 - Blue = 215

Les valeurs RVB affichées sont conformes à 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 étendues (réflexions plus sombres) donnent des valeurs plus basses.

Applications de Projet

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

  • Système de tri chromatique : Catégoriser 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 de marqueurs chromatiques
  • Inspection de qualité visuelle : Détecter les défauts de production par analyse des couleurs
  • Automatisation déclenchée par couleur : Exécuter des actions quand des teintes spécifiques sont détectées

Vidéo

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 !