Arduino - TCS3200D/TCS230 Farbsensor

Dieses Tutorial demonstriert die Anbindung eines TCS3200D/TCS230-Farberkennungssensors an Arduino, um RGB-Werte von verschiedenen Objekten zu messen und zu identifizieren. Sie werden Kalibrierungstechniken des Sensors und die Programmierung zur Farberkennung beherrschen.

Behandelte Themen:

Arduino mit TCS3200D/TCS230-Farberkennungssensor-Modul Tutorial

Erforderliche Hardware

1×Arduino Uno R3
1×USB 2.0 Kabel Typ A/B (für USB-A PC)
1×USB 2.0 Kabel Typ C/B (für USB-C PC)
1×TCS3200D/TCS230 Color Recognition Sensor Module
1×Verbindungskabel
1×(Empfohlen) Schraubklemmenblock-Shield für Arduino Uno
1×(Empfohlen) Breadboard-Shield für Arduino Uno
1×(Empfohlen) Gehäuse für Arduino Uno
1×(Empfohlen) Prototyping-Grundplatte & Breadboard-Kit für Arduino Uno

Oder Sie können die folgenden Kits kaufen:

1×DIYables STEM V3 Starter-Kit (Arduino enthalten)
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 TCS3200D/TCS230 Farbsensor

Aufbauend auf einem 8×8-Photodioden-Array identifiziert der TCS3200D/TCS230 Farben durch spezialisierte optische Filterung. Das 64-Dioden-Gitter umfasst 16 Photodioden mit rotem Filter, 16 Photodioden mit grünem Filter, 16 Photodioden mit blauem Filter und 16 ungefilterten Photodioden. Die Farberkennung erfolgt durch das Umschalten zwischen Filtertypen und die Analyse der Frequenzausgabe einer Rechteckwelle, die die Lichtintensität repräsentiert.

Integrierte weiße LEDs in den meisten Modulen sorgen für eine gleichmäßige Zielbeleuchtung, wodurch stabile Messwerte bei wechselnden Umgebungsbedingungen gewährleistet und die Leistung bei schlechten Lichtverhältnissen verbessert wird.

Pinbelegung

Die Anschlusspins des TCS3200D/TCS230-Moduls umfassen:

  • VCC-Pin: Stromversorgungsanschluss (+5V).
  • GND-Pin: Masseverbindung (0V).
  • S0, S1-Pins: Eingänge zur Steuerung der Frequenzskalierung.
  • S2, S3-Pins: Eingänge zur Auswahl des Farbfilters.
  • OUT-Pin: Frequenzausgang (Rechtecksignal).
  • OE-Pin: Steuerung der Ausgangsaktivierung (aktiv bei LOW). Die meisten kommerziellen Module verbinden diesen Pin intern mit Masse, wodurch externe Verdrahtung entfällt. Falls er nicht vorverbunden ist, verbinden Sie ihn manuell mit Masse.
TCS3200 TCS230 Farbsensor-Modul Pinbelegungsdiagramm, das VCC, GND, S0, S1, S2, S3 und OUT-Pins zeigt

Wie es funktioniert

Der Betrieb des Sensors erfordert die Konfiguration zweier zentraler Parameter: des aktiven Farbkanals und der Signalstärke. Steuerpin-Paare verwalten diese Einstellungen:

Ausgabeskalierung über S0 und S1:

  • Beide LOW: Power-down-Modus
  • S0 LOW, S1 HIGH: 2%-Frequenzskalierung
  • S0 HIGH, S1 LOW: 20%-Frequenzskalierung
  • Beide HIGH: Volle 100%-Skalierung

Filterauswahl über S2 und S3:

  • Beide LOW: Roter Kanal aktiv
  • S2 LOW, S3 HIGH: Blauer Kanal aktiv
  • S2 HIGH, S3 LOW: Kanal ohne Filterung (ungefiltert)
  • Beide HIGH: Grüner Kanal aktiv

Der OUT-Pin erzeugt Rechteckwellen-Signale im Bereich von ungefähr 2 Hz bis 500 kHz. Höhere Frequenzen deuten auf eine stärkere Lichtintensität für den ausgewählten Kanal hin. Die Messung der Pulsbreite mit pulseIn() zeigt die inverse Beziehung – kürzere Pulse bedeuten hellere Farben. Nach der Kalibrierung liefert die Umrechnung Standard-RGB-Werte.

Maximierung der Lesegenauigkeit

  • Halten Sie einen Abstand von 1–3 cm zwischen Sensor und Ziel ein, um eine konsistente Positionierung zu gewährleisten.
  • Aktivieren Sie die integrierten weißen LEDs für eine gleichmäßige Beleuchtung.
  • Beeinflussung durch Umgebungslicht minimieren, indem Sie den Sensor abschirmen, um eine höhere Präzision zu erreichen.

Verdrahtungsdiagramm

Verbindungsschema für den TCS3200-Farbsensor und das Arduino-Board:

TCS3200 Color SensorArduino
VCC5V
GNDGND
S0Pin 4
S1Pin 3
S2Pin 6
S3Pin 5
OUTPin 7
Arduino- und TCS3200-Farbsensor-Verdrahtungsdiagramm, das die Verbindung zwischen den Pins zeigt.

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

Arduino-Code - Sensor-Kalibrierung mittels Pulsbreite

Die Umweltkalibrierung ist essenziell, da der Rohsensor-Ausgang durch mehrere Faktoren variiert: die Intensität der integrierten LED, die Zielentfernung, die Reflexionseigenschaften der Oberfläche und die Umgebungsbeleuchtung. Betrachten Sie diese Variablen als Messstörungen. Die Kalibrierung quantifiziert diese Beeinflussung, indem sie für jeden Farbkanal Minimal- und Maximalwerte festlegt, was eine genaue Umrechnung auf die 0–255-RGB-Skala für Ihre spezifische Einrichtung ermöglicht.

/* * Dieser Arduino Code wurde von newbiely.de entwickelt * Dieser Arduino 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/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; }

Schnelle Schritte

  • Öffnen Sie den Kalibrierungscode in der Arduino-IDE.
  • Laden Sie den Kalibrierungscode auf Ihr Arduino-Board hoch, indem Sie die Hochladen-Schaltfläche verwenden.
  • Starten Sie den Serial Monitor, um Live-Messwerte mit Min-/Max-Verfolgung anzuzeigen.
  • Scannen Sie mit dem Sensor verschiedene Objekte: weiße Flächen (Papier), schwarze Gegenstände und eine Auswahl farbiger Objekte.
  • Beobachten Sie automatische Min-/Max-Wertaktualisierungen, während Extreme erfasst werden.
  • Wenn sich die Werte stabilisieren (typischerweise 10–20 Sekunden), notieren Sie alle sechs Kalibrierungskonstanten.
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  

Beispielsweise würden Ihre Kalibrierungswerte aus der obigen Ausgabe stammen:

  • RotMin = 42, RotMax = 210
  • GrünMin = 55, GrünMax = 185
  • BlauMin = 60, BlauMax = 172

Arduino-Code - RGB-Farbwerte auslesen

/* * Dieser Arduino Code wurde von newbiely.de entwickelt * Dieser Arduino 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/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; }

Schnelle Schritte

  • Lokalisieren Sie die Deklarationen der Kalibrierungsvariablen am Anfang des Codes:

The content to translate is missing. Please provide the English text you want translated.

int redMin = 0; // Minimale Pulsbreite für Rot

int redMax = 0; // Maximale Pulsbreite Rot

int greenMin = 0; // Grüne Mindestpulsbreite

int greenMax = 0; // Maximale Pulsbreite für Grün

int blueMin = 0; // blaue minimale Pulsbreite

int blueMax = 0; // Maximale Pulsbreite des Blaukanals

Please provide the English text you want translated (inside the code block).

  • Aktualisieren Sie ALLE sechs Nullwerte mit Kalibrierungsdaten aus der vorherigen Übung. Beispieltransformation (unter Verwendung der Kalibrierungsergebnisse redMin = 42, redMax = 210, greenMin = 55, greenMax = 185, blueMin = 60, blueMax = 172):

Bitte geben Sie den zu übersetzenden Text ein.

int rotMin = 42;

int rotMax = 210;

int gruenMin = 55;

int gruenMax = 185;

int blauMin = 60;

int blauMax = 172;

Please provide the English content to translate.

  • Lade den modifizierten Code auf den Arduino hoch
  • Platziere ein farbiges Ziel vor dem Sensor
  • Überwache die RGB-Ausgabe im seriellen Monitor
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  

Die RGB-Werte sind nun dem Standardbereich 0-255 zugeordnet. Niedrigere Pulsbreiten (mehr Licht) erzeugen höhere RGB-Werte, und größere Pulsbreiten (weniger Licht) erzeugen niedrigere RGB-Werte.

Anwendungen

Nun, da Sie RGB-Werte lesen können, können Sie Projekte wie:

  • Farbsortierer: Objekte nach Farbe sortieren (Rot, Grün, Blau)
  • Farbabgleichsspiel: Prüfe, ob zwei Objekte dieselbe Farbe haben
  • Linienfolger-Roboter: Folge farbigen Linien auf dem Boden
  • Qualitätskontrolle: Defekte Produkte anhand der Farbe erkennen
  • Farbaktivierter Alarm: Löse einen Summer oder eine LED aus, wenn eine bestimmte Farbe erkannt wird

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!