Arduino UNO R4 - TCS3200D/TCS230 Farbsensor

Diese Anleitung zeigt Ihnen, wie Sie Arduino UNO R4 und das TCS3200D/TCS230 Farberkennungs-Sensormodul verwenden, um RGB-Werte von Objekten zu kalibrieren und abzulesen und Farben zu erkennen.

Arduino UNO R4 mit TCS3200D TCS230 Farberkennungs-Sensormodul Tutorial

Über den TCS3200D/TCS230 Farbsensor

Der TCS3200D/TCS230 ist ein Farberkennungs-Sensormodul, das ein 8x8-Array von Photodioden verwendet. Sechzehn Photodioden haben rote Filter, 16 haben grüne Filter, 16 haben blaue Filter und 16 sind klar (kein Filter). Das Modul wandelt Lichtintensität in ein Rechteckwellen-Frequenzsignal um. Durch das Umschalten der Farbfilter und die Messung der Ausgangsfrequenz (oder Pulsbreite) können wir die RGB-Werte eines Objekts ermitteln.

Viele Module enthalten weiße LEDs zur Beleuchtung des Ziels. Das macht die Messungen konsistenter und hilft dem Sensor, Farben zuverlässig zu erkennen, auch bei schwachem Licht.

Pinbelegung

Das TCS3200D/TCS230 Farbsensormodul hat typischerweise diese Pins:

  • VCC Pin: Verbinden Sie diesen Pin mit VCC (5V).
  • GND Pin: Verbinden Sie diesen Pin mit GND (0V).
  • S0, S1 Pins: Auswahl der Ausgangsfrequenzskalierung.
  • S2, S3 Pins: Auswahl des Farbfilters.
  • OUT Pin: Rechteckwellen-Frequenzausgang.
  • OE Pin: Output Enable (aktiv LOW). Die meisten Module verbinden diesen Pin bereits intern mit GND, daher müssen Sie ihn nicht verkabeln. Falls Ihres das nicht tut, verbinden Sie ihn mit GND.
TCS3200 TCS230 Farbsensormodul Pinbelegungsdiagramm mit VCC GND S0 S1 S2 S3 OUT Pins

Funktionsweise

Der Sensor muss über zwei Dinge informiert werden: welchen Farbkanal er messen soll und wie stark das Ausgangssignal sein soll. Zwei Paare von Steuer-Pins handhaben dies:

  • S0 und S1 steuern die Ausgangsfrequenzskalierung:
  • S0 = LOW, S1 = LOW: Ausschalten
  • S0 = LOW, S1 = HIGH: 2% Skalierung
  • S0 = HIGH, S1 = LOW: 20% Skalierung
  • S0 = HIGH, S1 = HIGH: 100% Skalierung
  • S2 und S3 wählen den Farbfilter:
  • S2 = LOW, S3 = LOW: Rotfilter
  • S2 = LOW, S3 = HIGH: Blaufilter
  • S2 = HIGH, S3 = LOW: Klar (kein Filter)
  • S2 = HIGH, S3 = HIGH: Grünfilter

Der OUT Pin gibt eine Rechteckwelle aus (typischerweise 2 Hz bis 500 kHz). Die Frequenz ist proportional zur Intensität der gewählten Farbe, während die Pulsbreite umgekehrt proportional ist. Wir können die Pulsbreite mit pulseIn() messen und sie dann nach der Kalibrierung in RGB-Werte umwandeln.

Tipps für stabile Messungen

  • Platzieren Sie den Sensor 1-3 cm vom Objekt entfernt und halten Sie den Winkel konstant.
  • Verwenden Sie die integrierten weißen LEDs für stabile Beleuchtung.
  • Schirmen Sie den Sensor vor Änderungen des Umgebungslichts ab für genauere Ergebnisse.

Schaltplan

Dieses Bild zeigt, wie Sie den TCS3200 Farbsensor an Arduino UNO R4 anschließen:

TCS3200 FarbsensorArduino UNO R4
VCC5V
GNDGND
S0Pin 4
S1Pin 3
S2Pin 6
S3Pin 5
OUTPin 7
Arduino UNO R4 und TCS3200 Farbsensor Schaltplan zeigt Verbindung zwischen Pins

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

Siehe Der beste Weg, den Arduino Uno R4 und andere Komponenten mit Strom zu versorgen.

Arduino UNO R4 Code - Kalibrierung (Pulsbreite)

Eine Kalibrierung ist erforderlich, da die rohen Messwerte des Sensors von der Umgebung beeinflusst werden. Faktoren wie LED-Helligkeit, Entfernung, Oberflächenreflexion und Umgebungslicht verändern die gemessenen Werte. Sie können sich diese Einflüsse als "Rauschen" vorstellen. Der erste Kalibrierungsschritt hilft Ihnen, diesen Rauschbereich zu messen (Minimum und Maximum für jede Farbe), damit Sie dessen Einfluss subtrahieren und die Messungen auf korrekte 0–255 RGB-Werte für Ihr Setup abbilden können.

/* * Dieser Arduino UNO R4 Code wurde von newbiely.de entwickelt * Dieser Arduino UNO R4 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-uno-r4/arduino-uno-r4-tcs3200d-tcs230-color-sensor */ // Define color sensor pins #define S0 4 #define S1 3 #define S2 6 #define S3 5 #define 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(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); // Set Pulse Width scaling to 20% digitalWrite(S0, HIGH); digitalWrite(S1, LOW); // Set Sensor output as input pinMode(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 current readings Serial.print("Red PW = "); Serial.print(redPW); Serial.print(" - Green PW = "); Serial.print(greenPW); Serial.print(" - Blue PW = "); Serial.println(bluePW); // Print current min/max 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("------------------------------------------"); } // Function to read Red Pulse Widths int getRedPW() { // Set sensor to read Red only digitalWrite(S2, LOW); digitalWrite(S3, LOW); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; } // Function to read Green Pulse Widths int getGreenPW() { // Set sensor to read Green only digitalWrite(S2, HIGH); digitalWrite(S3, HIGH); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; } // Function to read Blue Pulse Widths int getBluePW() { // Set sensor to read Blue only digitalWrite(S2, LOW); digitalWrite(S3, HIGH); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; }

Schnelle Schritte

Befolgen Sie diese Anweisungen Schritt für Schritt:

  • Falls Sie zum ersten Mal Arduino Uno R4 WiFi/Minima verwenden, lesen Sie das Tutorial über die Einrichtung der Umgebung für Arduino Uno R4 WiFi/Minima in der Arduino IDE.
  • Verbinden Sie das Arduino Uno R4 Board mit dem Farbsensor gemäß dem bereitgestellten Diagramm.
  • Verbinden Sie das Arduino Uno R4 Board mit Ihrem Computer über ein USB-Kabel.
  • Starten Sie die Arduino IDE auf Ihrem Computer.
  • Wählen Sie das entsprechende Arduino Uno R4 Board (z.B. Arduino Uno R4 WiFi) und COM-Port aus.
  • Kopieren Sie den obigen Code und öffnen Sie ihn in der Arduino IDE.
  • Klicken Sie auf die Upload Schaltfläche in der Arduino IDE, um den Code auf Arduino UNO R4 hochzuladen.
  • Öffnen Sie den Serial Monitor. Sie werden kontinuierliche Messungen zusammen mit Min- und Max-Werten sehen.
  • Bewegen Sie den Sensor über verschiedene Objekte: ein weißes Objekt (wie Papier), ein schwarzes Objekt und optional einige farbige Objekte.
  • Beobachten Sie, wie sich die Min- und Max-Zeilen automatisch aktualisieren, während der Sensor die Extreme verfolgt.
  • Wenn die Min- und Max-Werte aufhören sich zu ändern (normalerweise nach 10-20 Sekunden), sind das Ihre Kalibrierungswerte - notieren Sie sie sich.
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  

Zum Beispiel, aus der obigen Ausgabe wären Ihre Kalibrierungswerte:

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

Arduino UNO R4 Code - RGB-Werte lesen

/* * Dieser Arduino UNO R4 Code wurde von newbiely.de entwickelt * Dieser Arduino UNO R4 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-uno-r4/arduino-uno-r4-tcs3200d-tcs230-color-sensor */ // Define color sensor pins #define S0 4 #define S1 3 #define S2 6 #define S3 5 #define sensorOut 7 // Calibration Values // *Get these from the Calibration Sketch 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 RGB values int redValue = 0; int greenValue = 0; int blueValue = 0; void setup() { // Set S0 - S3 as outputs pinMode(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); // Set Pulse Width scaling to 20% digitalWrite(S0, HIGH); digitalWrite(S1, LOW); // Set Sensor output as input pinMode(sensorOut, INPUT); // Setup Serial Monitor Serial.begin(9600); } void loop() { // Read Red Pulse Width redPW = getRedPW(); // Map to value from 0-255 redValue = map(redPW, redMin, redMax, 255, 0); // Delay to stabilize sensor delay(200); // Read Green Pulse Width greenPW = getGreenPW(); // Map to value from 0-255 greenValue = map(greenPW, greenMin, greenMax, 255, 0); // Delay to stabilize sensor delay(200); // Read Blue Pulse Width 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(S2, LOW); digitalWrite(S3, LOW); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; } // Function to read Green Pulse Widths int getGreenPW() { // Set sensor to read Green only digitalWrite(S2, HIGH); digitalWrite(S3, HIGH); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; } // Function to read Blue Pulse Widths int getBluePW() { // Set sensor to read Blue only digitalWrite(S2, LOW); digitalWrite(S3, HIGH); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; }

Schnelle Schritte

  • Finden Sie im obigen Code diese Zeilen am Anfang:
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
  • Ersetzen Sie ALLE sechs 0-Werte mit Ihren Kalibrierungszahlen aus dem vorherigen Schritt. Wenn Ihre Kalibrierung beispielsweise redMin = 42, redMax = 210, greenMin = 55, greenMax = 185, blueMin = 60, blueMax = 172 ergeben hat, ändern Sie die Zeilen zu:
int redMin = 42; int redMax = 210; int greenMin = 55; int greenMax = 185; int blueMin = 60; int blueMax = 172;
  • Laden Sie den Code auf Arduino UNO R4 hoch.
  • Platzieren Sie ein farbiges Objekt vor den Sensor.
  • Überprüfen Sie das Ergebnis im Serial 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 jetzt auf den Standard-Bereich von 0-255 abgebildet. Niedrigere Pulsbreiten (mehr Licht) erzeugen höhere RGB-Werte, und höhere Pulsbreiten (weniger Licht) erzeugen niedrigere RGB-Werte.

Anwendungen

Jetzt, da Sie RGB-Werte lesen können, können Sie Projekte wie diese erstellen:

  • Farbsortierer: Sortieren Sie Objekte nach Farbe (rot, grün, blau)
  • Farbzuordnungsspiel: Prüfen Sie, ob zwei Objekte die gleiche Farbe haben
  • Linienfolger-Roboter: Folgen Sie farbigen Linien auf dem Boden
  • Qualitätskontrolle: Erkennen Sie defekte Produkte anhand der Farbe
  • Farbaktivierter Alarm: Lösen Sie einen Buzzer 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.

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