Arduino - TCS3200D/TCS230 Kleurensensor

Deze tutorial toont hoe u een TCS3200D/TCS230 kleurherkenningssensor koppelt aan een Arduino om RGB-waarden van verschillende objecten te meten en te identificeren. U leert sensor kalibratietechnieken en programmering voor kleurdetectie beheersen.

Behandelde onderwerpen:

Arduino met TCS3200D TCS230 kleurherkenningssensor module tutorial

Hardware benodigd

1×Arduino Uno R3
1×USB 2.0 kabel type A/B
1×TCS3200D/TCS230 Kleurherkenningssensor Module
1×Jumperdraden
1×(Aanbevolen) Schroefklem Block Shield voor Arduino Uno
1×(Aanbevolen) Breadboard-Shield voor Arduino Uno
1×(Aanbevolen) Behuizing voor Arduino Uno
1×(Aanbevolen) Prototyping Basisplaat & Breadboard Kit voor Arduino Uno

Of u kunt de volgende kits kopen:

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

De TCS3200D/TCS230 is opgebouwd rond een 8x8 fotodiodenmatrix en identificeert kleuren middels gespecialiseerde optische filtering. De 64-diodenmatrix bevat 16 rood-gefilterde fotodiodes, 16 groen-gefilterde, 16 blauw-gefilterde en 16 ongefilterde (heldere) fotodiodes. Kleurdetectie gebeurt door te schakelen tussen filtertypes en het analyseren van de uitgangsfrequentie in vierkante golven die de lichtintensiteit representeren.

De meeste modules bevatten geïntegreerde witte LED’s die voor consistente verlichting van het meetobject zorgen. Dit garandeert stabiele metingen bij wisselende omgevingslichtomstandigheden en verbetert de prestaties bij weinig licht.

Pinout

De aansluitpinnen op het TCS3200D/TCS230 module zijn:

  • VCC pin: Voedingsaansluiting (+5V).
  • GND pin: Massa (0V).
  • S0, S1 pinnen: Frequentieschaal-controle-ingangen.
  • S2, S3 pinnen: Kleurfilter selectiepinnen.
  • OUT pin: Frequentie-uitgang (vierkante golf).
  • OE pin: Output enable bediening (actief bij LOW). Bij de meeste commerciële modules is deze pin intern verbonden met GND, waardoor externe bekabeling overbodig is. Is dit niet het geval, verbind de pin dan handmatig met GND.
TCS3200 TCS230 kleurensensormodule pinout diagram met VCC GND S0 S1 S2 S3 OUT pinnen

Hoe het werkt

Om de sensor te bedienen moet u twee belangrijke parameters instellen: het actieve kleurkanaal en de signaalsterkte. Deze instellingen worden geregeld door pinparen:

Uitgangsschaal via S0 en S1:

  • Beide LOW: power-down modus
  • S0 LOW, S1 HIGH: 2% frequentieschaal
  • S0 HIGH, S1 LOW: 20% frequentieschaal
  • Beide HIGH: Volledige 100% schaal

Filterselectie via S2 en S3:

  • Beide LOW: Rood kanaal actief
  • S2 LOW, S3 HIGH: Blauw kanaal actief
  • S2 HIGH, S3 LOW: Helder kanaal (ongefilterd)
  • Beide HIGH: Groen kanaal actief

De OUT pin genereert vierkante golf signalen met een frequentie tussen ca. 2 Hz en 500 kHz. Hogere frequenties geven een sterkere lichtintensiteit van het geselecteerde kanaal aan. Met de Arduino-functie pulseIn() kan de pulsbreedte gemeten worden, die omgekeerd evenredig is: kortere pulsen betekenen helderdere kleuren. Na kalibratie worden de waarden omgezet naar de standaard RGB-schaal.

Maximaliseren van uitleesnauwkeurigheid

  • Houd 1-3 cm afstand tussen sensor en doelobject, en zorg voor consistente positionering.
  • Activeer de ingebouwde witte LED’s voor uniforme belichting.
  • Verminder omgevingslichtinterferentie door de sensor af te schermen voor meer precisie.

Aansluitschema

Aansluitschema voor TCS3200 kleurensensor en Arduino:

TCS3200 Color SensorArduino
VCC5V
GNDGND
S0Pin 4
S1Pin 3
S2Pin 6
S3Pin 5
OUTPin 7
Arduino en TCS3200 kleurensensor aansluitdiagram met pinverbindingen

This image is created using Fritzing. Click to enlarge image

Arduino Code - Sensor Kalibratie via Pulsbreedte

Omgevingskalibratie is essentieel omdat de ruwe sensoroutput varieert met meerdere factoren: lichtintensiteit van ingebouwde LED’s, afstand tot het doel, eigenschappen van het oppervlak en omgevingsverlichting. Beschouw deze variabelen als meetruis. Kalibratie kwantificeert deze interferentie door minimum- en maximumwaarden per kanaal te bepalen, zodat een accurate omzetting naar de standaard 0–255 RGB-schaal mogelijk wordt voor uw specifieke opstelling.

/* * Deze Arduino code is ontwikkeld door newbiely.nl * Deze Arduino code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/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; }

Snelle Stappen

  • Open de kalibratiecode in de Arduino IDE
  • Upload deze naar uw Arduino board met de Upload knop
  • Start de Serial Monitor om live uitlezingen te bekijken met Min/Max tracking
  • Scan diverse objecten met de sensor: witte oppervlakken (papier), zwarte objecten, en verschillende gekleurde voorwerpen
  • Observeer automatische updates van Min/Max-waarden bij het registreren van extremen
  • Wanneer de waarden stabiliseren (meestal na 10-20 seconden), noteer dan alle zes kalibratieconstanten
COM6
Send
=== TCS3200 Calibratie === Richt de sensor op verschillende objecten (wit, zwart, kleuren). Min en Max waarden worden automatisch bijgehouden. Wanneer de waarden stabiel lijken, noteer deze voor de volgende code. ------------------------------------------ Rode PW = 42 - Groene PW = 55 - Blauwe PW = 60 Min -> R:42 G:55 B:60 Max -> R:42 G:55 B:60 ------------------------------------------ Rode PW = 210 - Groene PW = 185 - Blauwe PW = 172 Min -> R:42 G:55 B:60 Max -> R:210 G:185 B:172 ------------------------------------------ Rode PW = 44 - Groene PW = 57 - Blauwe PW = 61 Min -> R:42 G:55 B:60 Max -> R:210 G:185 B:172 ------------------------------------------
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Uit bovenstaande output zijn uw kalibratiewaarden bijvoorbeeld:

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

Arduino Code - RGB Kleurwaarden uitlezen

/* * Deze Arduino code is ontwikkeld door newbiely.nl * Deze Arduino code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/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; }

Snelle Stappen

  • Zoek de kalibratievariabelen declaraties aan het begin van de code:
int redMin = 0; // Rode minimale pulsbreedte int redMax = 0; // Rode maximale pulsbreedte int greenMin = 0; // Groene minimale pulsbreedte int greenMax = 0; // Groene maximale pulsbreedte int blueMin = 0; // Blauwe minimale pulsbreedte int blueMax = 0; // Blauwe maximale pulsbreedte
  • Vervang ALLE zes nullen door de kalibratiewaarden uit de vorige oefening. Voorbeeldtoewijzing (met de kalibratieresultaten 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;
  • Upload de aangepaste code naar de Arduino
  • Plaats een gekleurd doelobject voor de sensor
  • Bekijk de RGB-uitvoer in de 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  

De RGB-waarden zijn nu gemapt op de standaard 0-255 schaal. Lagere pulsbreedtes (meer licht) leiden tot hogere RGB-waarden, hogere pulsbreedtes (minder licht) tot lagere RGB-waarden.

Toepassingen

Nu u RGB-waarden kunt uitlezen, kunt u projecten bouwen zoals:

  • Kleurensorteerder: Sorteer objecten op basis van kleur (rood, groen, blauw)
  • Kleurenmatch-spel: Controleer of twee objecten dezelfde kleur hebben
  • Lijnvolger robot: Volg gekleurde lijnen op de vloer
  • Kwaliteitscontrole: Detecteer defecte producten op basis van kleur
  • Kleurgestuurde alarm: Activeer een buzzer of LED bij detectie van een specifieke kleur

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.

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!