ESP32 - TCS3200D/TCS230 Kleurensensor

Deze handleiding begeleidt u bij het aansluiten van een TCS3200D/TCS230 kleurensensor op een ESP32 voor accurate RGB-kleurdetectie en -meting. Leer hoe u de sensor kalibreert en de ESP32 programmeert om kleurwaarden van objecten te lezen.

Wat u leert:

ESP32 met TCS3200D TCS230 kleurherkenningssensor module tutorial

Hardware Benodigd

1×ESP32 ESP-WROOM-32 Ontwikkelingsmodule
1×(Alternatief) ESP32 Uno-form board
1×(Alternatief) ESP32 S3 Uno-form board
1×USB-kabel Type-C
1×TCS3200D/TCS230 Kleurherkenningssensor Module
1×Breadboard (experimenteerprint)
1×Jumperdraden
1×(Aanbevolen) Schroefklem Uitbreidingsboard voor ESP32
1×(Aanbevolen) Breakout Expansion Board for ESP32
1×(Aanbevolen) Stromsplitter voor ESP32

Of u kunt de volgende kits kopen:

1×DIYables ESP32 Starterskit (ESP32 inbegrepen)
1×DIYables Sensorkit (30 sensoren/displays)
1×DIYables Sensorkit (18 sensoren/displays)
Openbaarmaking: Sommige van de links in deze sectie zijn Amazon-affiliate links. We kunnen een commissie ontvangen voor aankopen die via deze links worden gedaan, zonder extra kosten voor u. We waarderen uw steun.

Over de TCS3200D/TCS230 Kleurensensor

De TCS3200D/TCS230 gebruikt een matrix van 64 fotodiodes in een 8×8 opstelling voor kleuridentificatie. Deze array bestaat uit 16 fotodiodes met rode optische filters, 16 met groene filters, 16 met blauwe filters en 16 zonder filters (clear). De sensor werkt door een specifieke filter te selecteren en de gedetecteerde lichtintensiteit om te zetten in een frequentiegemoduleerd vierkantgolf-signaal.

De meeste sensormodules bevatten geïntegreerde witte LED-verlichting, die zorgt voor consistente metingen door een gecontroleerde lichtbron te bieden onafhankelijk van de omgevingslichtomstandigheden.

Pinout

De TCS3200D/TCS230 sensormodule biedt deze aansluitpunten:

  • VCC pin: Verbind met 3.3V of 5V voeding
  • GND pin: Verbind met aarde (0V)
  • S0, S1 pinnen: Instellingen voor frequentieschaalverdeling van de output
  • S2, S3 pinnen: Selecteren het actieve kleurfilter
  • OUT pin: Vierkantgolf frequentie-uitgangssignaal
  • OE pin: Output enable (actief LOW). Vaak intern verbonden met GND op commerciële modules. Indien blootliggend, verbind met GND.
TCS3200 TCS230 kleurensensor module pinout diagram met VCC GND S0 S1 S2 S3 OUT pinnen

Hoe het Werkt

De werking van de sensor hangt af van twee configureerbare parameters: de actieve kleurfilter en de sterkte van het uitgangssignaal. Twee paar besturingspinnen bepalen deze instellingen:

S0/S1 pinnen configureren frequentieschaalverdeling van de uitgang:

  • S0=LOW, S1=LOW: Sensor uitgeschakeld
  • S0=LOW, S1=HIGH: Output op 2% van basisfrequentie
  • S0=HIGH, S1=LOW: Output op 20% van basisfrequentie
  • S0=HIGH, S1=HIGH: Output op 100% van basisfrequentie

S2/S3 pinnen selecteren het actieve kleurfilter:

  • S2=LOW, S3=LOW: Rode filter actief
  • S2=LOW, S3=HIGH: Blauwe filter actief
  • S2=HIGH, S3=LOW: Geen filter (clear/onbewerkt)
  • S2=HIGH, S3=HIGH: Groene filter actief

De OUT pin geeft een frequentie-uitgangssignaal tussen ongeveer 2 Hz en 500 kHz. De frequentiegrootte correleert met lichtintensiteit — meer licht betekent een hogere frequentie. Met de functie pulseIn() kan de pulsduur worden gemeten; een kortere pulsduur betekent helderder licht. Na kalibratie worden deze metingen omgezet naar standaard 0-255 RGB-waarden.

Optimaliseren van Meetstabiliteit

  • Plaats de sensor 1-3 cm van het doeloppervlak met een vaste oriëntatie.
  • Zet de ingebouwde witte LEDs aan voor gestandaardiseerde verlichting.
  • Vermijd invallend extern licht om meetvariabiliteit te verminderen.

Bekabelingsschema

Aansluitschema ESP32 naar TCS3200 kleurensensor:

TCS3200 KleurensensorESP32
VCC3.3V
GNDGND
S0GPIO 17
S1GPIO 16
S2GPIO 18
S3GPIO 5
OUTGPIO 19
ESP32 en TCS3200 kleurensensor bekabelingsschema toont pin verbindingen

This image is created using Fritzing. Click to enlarge image

Als u niet weet hoe u ESP32 en andere componenten van stroom moet voorzien, vindt u instructies in de volgende tutorial: Hoe ESP32 van stroom te voorzien.

ESP32 Code - Sensor Kalibratie via Pulsbreedte

Kalibratie compenseert omgevingsvariabelen die ruwe sensormetingen beïnvloeden: variaties in LED-helderheid, afstand tot het object, verschillen in oppervlakreflectiviteit en omgevingslicht. Deze factoren zorgen voor meetfouten die gekwantificeerd moeten worden. Het kalibratieproces registreert minimale en maximale pulsbreedtes voor elk kleurkanaal, waarmee grenzen worden ingesteld voor een accurate 0–255 RGB-mapping in uw specifieke omgeving.

/* * Deze ESP32 code is ontwikkeld door newbiely.nl * Deze ESP32 code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/esp32/esp32-tcs3200d-tcs230-color-sensor */ // Define color sensor pins #define PIN_S0 17 // The ESP32 pin connected to the S0 of the color module #define PIN_S1 16 // The ESP32 pin connected to the S1 of the color module #define PIN_S2 18 // The ESP32 pin connected to the S2 of the color module #define PIN_S3 5 // The ESP32 pin connected to the S3 of the color module #define PIN_sensorOut 19 // The 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; }

Snelle Stappen

  • Als dit de eerste keer is dat u de ESP32 gebruikt, bekijk dan hoe u de ESP32 omgeving instelt in Arduino IDE.
  • Kopieer de kalibratiecode in Arduino IDE
  • Klik op de Upload-knop in Arduino IDE om de code naar ESP32 te uploaden
  • Open de Seriële Monitor (baudrate op 9600 instellen)
  • Richt de sensor op verschillende gekleurde objecten: wit papier, zwart oppervlak en diverse kleuren
  • Houd de Min/Max waarden in de gaten terwijl ze automatisch worden bijgewerkt
  • Zodra de waarden stabiel zijn (10-20 seconden), noteer dan alle zes kalibratiewaarden
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  

Voorbeeld kalibratieresultaten uit de output:

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

ESP32 Code - RGB Kleurwaarden Lezen

/* * Deze ESP32 code is ontwikkeld door newbiely.nl * Deze ESP32 code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/esp32/esp32-tcs3200d-tcs230-color-sensor */ // Define color sensor pins #define PIN_S0 17 // The ESP32 pin connected to the S0 of the color module #define PIN_S1 16 // The ESP32 pin connected to the S1 of the color module #define PIN_S2 18 // The ESP32 pin connected to the S2 of the color module #define PIN_S3 5 // The ESP32 pin connected to the S3 of the color module #define PIN_sensorOut 19 // The 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; }

Snelle Stappen

  • Zoek de kalibratieconstanten bovenaan in de code:
int redMin = 0; // Minimum pulsbreedte rood int redMax = 0; // Maximum pulsbreedte rood int greenMin = 0; // Minimum pulsbreedte groen int greenMax = 0; // Maximum pulsbreedte groen int blueMin = 0; // Minimum pulsbreedte blauw int blueMax = 0; // Maximum pulsbreedte blauw
  • Vervang alle zes nullen door uw daadwerkelijke kalibratiewaarden. Bijvoorbeeld (met redMin = 42, redMax = 210, greenMin = 55, greenMax = 185, blueMin = 60, blueMax = 172):
int redMin = 42; int redMax = 210; int greenMin = 55; int greenMax = 185; int blueMin = 60; int blueMax = 172;
  • Kopieer de bovenstaande code en open deze in Arduino IDE
  • Klik op de Upload-knop in Arduino IDE om de code naar ESP32 te uploaden
  • Plaats een gekleurd object voor de sensor
  • Bekijk het resultaat op de Seriële 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  

De uitvoer toont nu standaard 0-255 RGB-waarden. Kortere pulsbreedtes (helderder licht) leveren hogere RGB-waarden; langere pulsbreedtes (donkerdere omstandigheden) lagere waarden.

Project Toepassingen

Met de mogelijkheid om RGB-waarden functioneel te lezen, kunt u deze projectideeën verkennen:

  • Gekleurde automatische sortering: Items categoriseren op kleurtoon (rood, groen, blauw identificatie)
  • Kleurvergelijkingssysteem: Controleer of kleuren van objecten overeenkomen
  • Chromatisch lijnvolg-robotica: Robots bouwen die gekleurde paden volgen
  • Kwaliteitscontrole in productie: Defecte eenheden identificeren via kleurafwijkingen
  • Kleurgestuurde activering: Buzzers of indicatoren activeren bij detectie van specifieke kleuren

Video Tutorial

We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.

Bekijk onze video-tutorial voor een visuele begeleiding bij dit project! De video biedt extra inzichten en helpt bij het begrijpen van de stappen en code.

Gerelateerde Tutorials

※ ONZE BERICHTEN

  • U bent welkom om de link naar deze tutorial te delen. Gebruik onze inhoud echter niet op andere websites. We hebben veel moeite en tijd gestoken in het maken van de inhoud, respecteer alstublieft ons werk!