Arduino Nano ESP32 - TCS3200D/TCS230 Farbsensor

In diesem Tutorial werden wir untersuchen, wie man den TCS3200D/TCS230-Farb-Sensor an den Arduino Nano ESP32 anschließt, um eine genaue Farberkennung und Messung der RGB-Werte zu ermöglichen.

Was du erreichen wirst:

Arduino Nano ESP32 mit TCS3200D/TCS230 Farbsensor-Modul Tutorial

Erforderliche Hardware

1×Arduino Nano ESP32
1×USB-Kabel Typ-A zu Typ-C (für USB-A PC)
1×USB-Kabel Typ-C zu Typ-C (für USB-C PC)
1×TCS3200D/TCS230 Color Recognition Sensor Module
1×Breadboard
1×Verbindungskabel
1×(Empfohlen) Schraubklemmen-Erweiterungsboard für Arduino Nano
1×(Empfohlen) Breakout-Erweiterungsboard für Arduino Nano
1×(Empfohlen) Stromverteiler für Arduino Nano ESP32

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 TCS3200D/TCS230 Farbsensor

Der TCS3200D/TCS230 verwendet ein strukturiertes Array aus 64 Fotodioden in einer 8×8-Konfiguration zur optischen Farberkennung. Das Array besteht aus 16 Fotodioden mit roten optischen Filtern, 16 mit grünen Filtern, 16 mit blauen Filtern und 16 ohne Filter (klar). Die Farberkennung erfolgt durch das Aktivieren bestimmter Filtergruppen und durch die Analyse der Frequenz der Ausgangswellenform.

Standard-TCS3200D-Sensormodule verfügen über weiße LED-Arrays, die eine konstante Ausleuchtung des Messziels gewährleisten, stabile Messwerte bei unterschiedlichen Beleuchtungsumgebungen liefern und den Betrieb bei schlecht beleuchteten Bedingungen ermöglichen.

Pinbelegung

Anschlussklemmen am TCS3200D/TCS230-Sensor-Modul:

  • VCC-Pin: Positive Spannungsversorgung (+5V).
  • GND-Pin: Massebezug (0V).
  • S0, S1-Pins: Pins zur Konfiguration der Frequenzskalierung.
  • S2, S3-Pins: Pins zur Aktivierung des Farbfilters.
  • OUT-Pin: Frequenzkodierter Rechteckausgang.
  • OE-Pin: Aktivierungs-Pin des Ausgangs (aktiv bei LOW). Standardmodule verbinden dies intern fest mit GND. Falls es schwebt, manuell mit GND verbinden.
TCS3200/TCS230 Farbsensor-Modul Pinbelegungsdiagramm, das VCC, GND, S0, S1, S2, S3 und OUT-Anschlüsse zeigt.

Wie es funktioniert

Die Funktion des Sensors hängt von zwei konfigurierbaren Parametern ab: Welchen Farbfilter soll aktiviert werden und welchen Ausgangsfrequenzbereich soll verwendet werden. Zwei Steuerpin-Paare steuern diese Einstellungen:

Frequenzskalierungskonfiguration (S0- und S1-Pins):

  • S0=NIEDRIG, S1=NIEDRIG: Sensor ausgeschaltet
  • S0=NIEDRIG, S1=HOCH: 2% Ausgabeskalierung
  • S0=HOCH, S1=NIEDRIG: 20% Ausgabeskalierung
  • S0=HOCH, S1=HOCH: 100% Ausgabeskalierung (volle Frequenz)

Farbfilter-Aktivierung (S2- und S3-Pins):

  • S2=NIEDRIG, S3=NIEDRIG: rotes Photodioden-Array aktiv
  • S2=NIEDRIG, S3=HOCH: blaues Photodioden-Array aktiv
  • S2=HOCH, S3=NIEDRIG: klares Photodioden-Array aktiv (ungefiltert)
  • S2=HOCH, S3=HOCH: grünes Photodioden-Array aktiv

Der OUT-Pin erzeugt Rechteckwellensignale im ungefähren Bereich von 2 Hz bis 500 kHz. Eine erhöhte Lichtintensität führt zu einer höheren Frequenzausgabe. Der pulseIn()-Befehl von Arduino misst die Pulsdauer, die eine inverse Beziehung aufweist — hellere Beleuchtung führt zu kürzeren Pulsdauern. Durch Kalibrierung werden diese Pulsmesswerte in die vertraute 0-255 RGB-Notation umgewandelt.

Maximierung der Messgenauigkeit

  • Stellen Sie einen festen Abstand zwischen Sensor und Objekt her (optimal: 1–3 cm) mit stabiler Winkelposition.
  • Aktivieren Sie die integrierte weiße LED-Beleuchtung für reproduzierbare Ergebnisse.
  • Schirmen Sie das System vor schwankenden externen Lichtquellen ab, um die Genauigkeit zu verbessern.

Verdrahtungsdiagramm

Schließe den TCS3200-Farbsensor gemäß dieser Konfiguration an den Arduino Nano ESP32 an:

TCS3200 Color SensorArduino Nano ESP32
VCC5V
GNDGND
S0D4
S1D3
S2D6
S3D5
OUTD7
Arduino Nano ESP32 und TCS3200-Farbsensor-Verdrahtungsdiagramm

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

Arduino Nano ESP32 Code - Sensor Kalibrierung

Kalibrierung neutralisiert Umweltfaktoren, die die Sensorleistung beeinflussen. Variablen wie LED-Intensität, Objektnähe, Oberflächenbeschaffenheit und Umgebungsbeleuchtung beeinflussen alle Rohmesswerte. Dieser Kalibrierungsworkflow bestimmt die minimalen und maximalen Impulsdauern für jeden Farbkanal, erstellt Referenzgrenzen, die die Rohmesswerte des Sensors in standardisierte RGB-Werte von 0 bis 255 übersetzen, optimiert für Ihre Einsatzbedingungen.

/* * Dieser Arduino Nano ESP32 Code wurde von newbiely.de entwickelt * Dieser Arduino Nano ESP32 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-nano-esp32/arduino-nano-esp32-tcs3200d-tcs230-color-sensor */ // Define color sensor pins #define PIN_S0 D4 // The Arduino Nano ESP32 pin connected to the S0 of the color module #define PIN_S1 D3 // The Arduino Nano ESP32 pin connected to the S1 of the color module #define PIN_S2 D6 // The Arduino Nano ESP32 pin connected to the S2 of the color module #define PIN_S3 D5 // The Arduino Nano ESP32 pin connected to the S3 of the color module #define PIN_sensorOut D7 // The Arduino Nano ESP32 pin 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; }

Schnelle Schritte

Um mit dem Arduino Nano ESP32 zu beginnen, befolgen Sie diese Schritte:

  • Wenn Sie neu bei Arduino Nano ESP32 sind, sehen Sie sich das Tutorial dazu an: wie man die Umgebung für Arduino Nano ESP32 in der Arduino IDE einrichtet.
  • Verdrahten Sie die Komponenten gemäß dem Schaltplan.
  • Schließen Sie das Arduino Nano ESP32-Board mit einem USB-Kabel an Ihren Computer an.
  • Starten Sie die Arduino IDE auf Ihrem Computer.
  • Wählen Sie das Arduino Nano ESP32-Board und seinen entsprechenden COM-Port aus.
  • Kopieren Sie den Kalibrierungscode und fügen Sie ihn in die Arduino IDE ein.
  • Klicken Sie auf die Hochladen-Schaltfläche, um den Code zu kompilieren und hochzuladen.
  • Öffnen Sie den Seriellen Monitor, um den Kalibrierungsfortschritt zu beobachten.
  • Richten Sie den Sensor auf unterschiedlich farbige Oberflächen: weiße Materialien (Papier), schwarze Oberflächen und verschiedene farbige Objekte.
  • Überwachen Sie die Min- und Max-Werte, während sie sich in Echtzeit aktualisieren.
  • Wenn die Werte stabil werden (in der Regel 10–20 Sekunden), notieren Sie alle sechs Kalibrierungswerte.
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  

Kalibrierparameter aus der Beispielausgabe extrahiert:

  • RotMin = 42, rotMax = 210
  • GruenMin = 55, gruenMax = 185
  • BlauMin = 60, blauMax = 172

Arduino Nano ESP32 Code - RGB-Farbwerte auslesen

/* * Dieser Arduino Nano ESP32 Code wurde von newbiely.de entwickelt * Dieser Arduino Nano ESP32 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-nano-esp32/arduino-nano-esp32-tcs3200d-tcs230-color-sensor */ // Define color sensor pins #define PIN_S0 D4 // The Arduino Nano ESP32 pin connected to the S0 of the color module #define PIN_S1 D3 // The Arduino Nano ESP32 pin connected to the S1 of the color module #define PIN_S2 D6 // The Arduino Nano ESP32 pin connected to the S2 of the color module #define PIN_S3 D5 // The Arduino Nano ESP32 pin connected to the S3 of the color module #define PIN_sensorOut D7 // The Arduino Nano ESP32 pin 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; }

Schnelle Schritte

  • Finde die Deklarationen der Kalibrierungsvariablen nahe dem Anfang des Codes:

Please provide the English text to translate.

int redMin = 0; // Minimale Pulsbreite des Rotkanals

int redMax = 0; // rote maximale Pulsbreite

int greenMin = 0; // grüne minimale Pulsweite

int greenMax = 0; // grüne maximale Pulsbreite

int blueMin = 0; // blaue Mindestpulsbreite

int blueMax = 0; // Maximale Pulsbreite des blauen Kanals

Bitte geben Sie den Text zum Übersetzen an.

  • Geben Sie Ihre aufgezeichneten Kalibrierwerte anstelle von Nullen ein. Beispielhafte Ersetzung mit redMin = 42, redMax = 210, greenMin = 55, greenMax = 185, blueMin = 60, blueMax = 172:

Bitte den englischen Text zum Übersetzen bereitstellen.

int rotMin = 42;

int rotMax = 210;

int gruenMin = 55;

int gruenMax = 185;

int blauMin = 60;

int blauMax = 172;

No content provided inside the code block to translate.

  • Lade den aktualisierten Code auf den Arduino Nano ESP32 hoch.
  • Platziere vor dem Sensor ein farbiges Ziel.
  • Öffne den Serial Monitor, um RGB-Messwerte anzuzeigen.
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-Ausgabewerte entsprechen der Standard-Skala von 0 bis 255. Kürzere Pulsbreiten (starke Reflexionen) führen zu höheren RGB-Werten; längere Pulsbreiten (schwache Reflexionen) führen zu niedrigeren Werten.

Projektanträge

Mit funktionsfähigem RGB-Farbsensor können Sie Folgendes bauen:

  • Automatisierter Farbsortierer: Gegenstände basierend auf chromatischen Eigenschaften klassifizieren (Rot-, Grün- und Blau-Kategorisierung)
  • Farbvergleichswerkzeug: Farbkonstanz über mehrere Proben hinweg überprüfen
  • Farbgesteuerte Navigation: Roboter, die farbige Pfade folgen
  • Fertigungsprüfung: Produktfehler durch Farbabweichungen identifizieren
  • Farbbasierte Steuerung: Bestimmte Verhaltensweisen auslösen, wenn bestimmte Farben erscheinen

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!