Raspberry Pi - TCS3200D/TCS230 Farbsensor

Diese umfassende Anleitung zeigt Ihnen, wie Sie den TCS3200D/TCS230 Farbsensor mit dem Raspberry Pi für präzise Farbmessungen und RGB-Wertextraktion verbinden. Meistern Sie Kalibrierungsverfahren und entwickeln Sie Farberkennungsfähigkeiten in Ihren Projekten.

Lernziele:

Raspberry Pi mit TCS3200D TCS230 Farberkennungs-Sensormodul Tutorial

Benötigte Hardware

1×Raspberry Pi 5
1×TCS3200D/TCS230 Farberkennungs-Sensormodul
1×Breadboard (Steckplatine)
1×Jumper Kabel
1×(Empfohlen) Schraubklemmenblock-Shield für Raspberry Pi
1×(Empfohlen) Raspberry Pi Prototyping-Grundplatte & Breadboard-Kit
1×(Empfohlen) HDMI-Touchscreen-Monitor für Raspberry Pi

Oder Sie können die folgenden Kits kaufen:

1×DIYables Sensor-Kit (30 Sensoren/Displays)
1×DIYables Sensor-Kit (18 Sensoren/Displays)
Offenlegung: Einige der in diesem Abschnitt bereitgestellten Links sind Amazon-Affiliate-Links. Wir können eine Provision für Käufe erhalten, die über diese Links getätigt werden, ohne zusätzliche Kosten für Sie. Wir schätzen Ihre Unterstützung.

Über den TCS3200D/TCS230 Farbsensor

Der TCS3200D/TCS230 Sensor nutzt eine Photodioden-Matrix in einer 8×8-Anordnung für Farberkennung durch optische Filterung. Innerhalb dieser 64-Element-Anordnung verfügen 16 Photodioden über rote Spektralfilter, weitere 16 verwenden grüne Filter, 16 nutzen blaue Filter, und die verbleibenden 16 arbeiten ohne Filter (klare Reaktion). Die Farbmessung erfolgt durch Aktivierung spezifischer Filtersätze und Analyse des resultierenden frequenzmodulierten Rechtecksignal-Ausgangs.

Eingebaute weiße LED-Arrays auf typischen Modulen liefern konstante Beleuchtung für Ziele, wodurch die Messstabilität unabhängig von externen Lichtveränderungen aufrechterhalten und die Leistung in dunklen Umgebungen verbessert wird.

Pinbelegung

Verfügbare Verbindungen auf der TCS3200D/TCS230 Sensor-Platine:

  • VCC-Pin: Versorgungsspannungseingang (+5V).
  • GND-Pin: Massebezug (0V).
  • S0, S1-Pins: Ausgangsfrequenz-Skalierungswahlschalter.
  • S2, S3-Pins: Farbkanal-Filterwahlschalter.
  • OUT-Pin: Frequenzmodulierter Rechteckwellen-Ausgang.
  • OE-Pin: Ausgangs-Enable-Eingang (aktiviert bei LOW). Standardmodule verdrahten diesen typischerweise intern fest mit GND. Falls nicht verbunden, manuell mit GND verdrahten.
TCS3200 TCS230 Farbsensormodul Pinbelegungsdiagramm zeigt VCC GND S0 S1 S2 S3 OUT Pins

Funktionsweise

Zwei kritische Einstellungen steuern das Sensorverhalten: welcher Farbkanal aktiviert wird und welche Ausgangssignalstärke erzeugt wird. Zwei Paare von Steuereingängen verwalten diese Funktionen:

Frequenzskalierung-Steuerung (S0 und S1 Pins):

  • S0=LOW, S1=LOW: Stromsparzustand
  • S0=LOW, S1=HIGH: 2% Skalierungsfaktor
  • S0=HIGH, S1=LOW: 20% Skalierungsfaktor
  • S0=HIGH, S1=HIGH: 100% Skalierungsfaktor (volle Geschwindigkeit)

Farbkanal-Auswahl (S2 und S3 Pins):

  • S2=LOW, S3=LOW: Rote Photodioden aktiv
  • S2=LOW, S3=HIGH: Blaue Photodioden aktiv
  • S2=HIGH, S3=LOW: Klare Photodioden aktiv (keine Filterung)
  • S2=HIGH, S3=HIGH: Grüne Photodioden aktiv

Der OUT-Pin liefert Rechteckwellen-Frequenzen im Bereich von etwa 2 Hz bis 500 kHz. Die Frequenz steigt mit der Lichtintensität—hellere Beleuchtung erzeugt höhere Frequenzausgänge. Durch Messung der Impulsdauer (die umgekehrt korreliert—kürzere Dauern zeigen stärkeres Licht an) können wir diese Messungen durch Kalibrierung in das konventionelle 0-255 RGB-Format übersetzen.

Optimale Präzision erreichen

  • Halten Sie den Sensor 1-3 cm vom Messziel entfernt mit stabiler Winkelausrichtung.
  • Nutzen Sie die integrierte weiße LED-Beleuchtung für wiederholbare Beleuchtung.
  • Schirmen Sie den Sensor vor variablem Umgebungslicht ab, um die Messkonsistenz zu verbessern.

Schaltplan

TCS3200 Farbsensor zu Raspberry Pi Verkabelungskonfiguration:

TCS3200 FarbsensorRaspberry Pi
VCC5V
GNDGND
OUTGPIO23
S0GPIO8
S1GPIO7
S2GPIO24
S3GPIO25
Raspberry Pi und TCS3200 Farbsensor Schaltplan zeigt Verbindung zwischen Pins

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.

Um Ihren Verdrahtungsaufbau zu vereinfachen und zu organisieren, empfehlen wir die Verwendung eines Schraubklemmenblock-Shields für Raspberry Pi. Dieses Shield gewährleistet sicherere und besser verwaltbare Verbindungen, wie unten gezeigt:

Raspberry Pi Schraubklemmenblock-Shield

Raspberry Pi Code - Pulsbreiten-Kalibrierung

Die Kalibrierung eliminiert Umgebungsinterferenzen von Rohmessungen. Variablen einschließlich LED-Ausgangsstärke, Zielabstand, Materialreflektivität und Raumbeleuchtung beeinflussen alle Messwerte. Betrachten Sie diese als systematische Fehler, die eine Messung erfordern. Die Kalibrierungsroutine identifiziert minimale und maximale Pulsbreiten über alle Farbkanäle hinweg und stellt Referenzgrenzen für die Umwandlung von Rohdaten in genaue 0–255 RGB-Werte ein, die an Ihre Einsatzumgebung angepasst sind.

# Dieser Raspberry Pi Code wurde von newbiely.de entwickelt # Dieser Raspberry Pi Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. # Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: # https://newbiely.de/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()

Schnelle Schritte

  • Kopieren Sie den Code und speichern Sie ihn in einer Datei, zum Beispiel tcs3200_calibration.py
  • Führen Sie das Script aus:
PuTTY - Raspberry Pi
python3 tcs3200_calibration.py
  • Setzen Sie den Sensor verschiedenen Oberflächen aus: weißen Materialien (Druckerpapier), schwarzen Objekten, plus mehrfarbigen Gegenständen
  • Beobachten Sie, wie sich die Min/Max-Grenzen automatisch aktualisieren, wenn Extreme erkannt werden
  • Sobald sich die Werte stabilisieren (normalerweise 10-20 Sekunden), drücken Sie Ctrl+C zum Stoppen
  • Dokumentieren Sie alle sechs angezeigten Kalibrierungsparameter
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

Beispiel-Kalibrierungsparameter aus obiger Ausgabe extrahiert:

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

Raspberry Pi Code - RGB-Wert Messung

# Dieser Raspberry Pi Code wurde von newbiely.de entwickelt # Dieser Raspberry Pi Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. # Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: # https://newbiely.de/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()

Schnelle Schritte

  • Identifizieren Sie die Kalibrierungsvariablen am Code-Anfang:
red_min = 0 red_max = 0 green_min = 0 green_max = 0 blue_min = 0 blue_max = 0
  • Ersetzen Sie alle sechs Null-Platzhalter mit gemessenen Kalibrierungsdaten. Beispiel mit den Werten 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
  • Speichern Sie den aktualisierten Code in einer Datei, zum Beispiel tcs3200_sensor.py
  • Führen Sie das Script aus:
PuTTY - Raspberry Pi
python3 tcs3200_sensor.py
  • Platzieren Sie eine farbige Probe vor dem Sensor
  • Überprüfen Sie die RGB-Ausgabe im 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

Angezeigte RGB-Werte entsprechen der Standard-0-255-Skalierung. Reduzierte Pulsbreiten (die hellere Reflexionen anzeigen) erzeugen höhere RGB-Ausgaben; verlängerte Pulsbreiten (schwächere Reflexionen) ergeben niedrigere Werte.

Projektanwendungen

Mit funktionsfähiger RGB-Messung können Sie entwickeln:

  • Chromatisches Sortiersystem: Objekte nach Farbe kategorisieren (Rot/Grün/Blau-Differenzierung)
  • Farbverifikationsgerät: Farbkonsistenz zwischen Proben bestätigen
  • Farbiger Pfadfolger: Roboter, die entlang chromatischer Markierungen navigieren
  • Visuelle Qualitätsinspektion: Produktionsdefekte durch Farbanalyse erkennen
  • Farbgesteuerte Automatisierung: Aktionen ausführen, wenn spezifische Farbtöne erkannt werden

Video Tutorial

Wir erwägen die Erstellung von Video-Tutorials. Wenn Sie Video-Tutorials für wichtig halten, abonnieren Sie bitte unseren YouTube-Kanal , um uns zu motivieren, die Videos zu erstellen.

Verwandte Tutorials

※ UNSERE NACHRICHTEN

  • Sie können gerne den Link zu diesem Tutorial teilen. Bitte verwenden Sie jedoch unsere Inhalte nicht auf anderen Websites. Wir haben viel Mühe und Zeit in die Erstellung der Inhalte investiert, bitte respektieren Sie unsere Arbeit!