Arduino UNO R4 - TCS3200D/TCS230 Kleursensor

Deze handleiding laat u zien hoe u Arduino UNO R4 en de TCS3200D/TCS230 kleurherkenningssensor gebruikt om RGB-waarden van objecten te kalibreren en uit te lezen en kleuren te detecteren.

Arduino UNO R4 with TCS3200D TCS230 color recognition sensor module tutorial

Over de TCS3200D/TCS230 Kleursensor

De TCS3200D/TCS230 is een kleurherkenningssensor die een 8x8 array van fotodiodes gebruikt. Zestien fotodiodes hebben rode filters, 16 hebben groene filters, 16 hebben blauwe filters, en 16 zijn helder (geen filter). De module zet lichtintensiteit om naar een blokgolf-frequentiesignaal. Door de kleurfilters te schakelen en de uitvoerfrequentie (of pulsbreedte) te meten, kunnen we de RGB-waarden van een object schatten.

Veel modules bevatten witte LEDs om het doel te verlichten. Dit maakt de metingen consistenter en helpt de sensor betrouwbaar kleuren te detecteren, zelfs bij weinig licht.

Pinout

De TCS3200D/TCS230 kleursensormodule heeft doorgaans deze pinnen:

  • VCC-pin: Sluit deze pin aan op VCC (5V).
  • GND-pin: Sluit deze pin aan op GND (0V).
  • S0, S1 pinnen: Uitvoerfrequentie schaling selectie.
  • S2, S3 pinnen: Kleurfilter selectie.
  • OUT-pin: Blokgolf-frequentie uitvoer.
  • OE-pin: Output enable (actief LOW). De meeste modules sluiten deze pin al intern aan op GND, dus u hoeft deze niet te bedraden. Als de uwe dat niet doet, sluit deze dan aan op GND.
TCS3200 TCS230 color sensor module pinout diagram showing VCC GND S0 S1 S2 S3 OUT pins

Hoe Het Werkt

De sensor moet twee dingen weten: welk kleurkanaal moet worden gemeten, en hoe sterk het uitvoersignaal moet zijn. Twee paren besturingspinnen regelen dit:

  • S0 en S1 besturen de uitvoerfrequentie schaling:
  • S0 = LOW, S1 = LOW: Uitschakelen
  • S0 = LOW, S1 = HIGH: 2% schaling
  • S0 = HIGH, S1 = LOW: 20% schaling
  • S0 = HIGH, S1 = HIGH: 100% schaling
  • S2 en S3 selecteren het kleurfilter:
  • S2 = LOW, S3 = LOW: Rood filter
  • S2 = LOW, S3 = HIGH: Blauw filter
  • S2 = HIGH, S3 = LOW: Helder (geen filter)
  • S2 = HIGH, S3 = HIGH: Groen filter

De OUT-pin geeft een blokgolf uit (doorgaans 2 Hz tot 500 kHz). De frequentie is evenredig met de intensiteit van de geselecteerde kleur, terwijl de pulsbreedte omgekeerd evenredig is. We kunnen de pulsbreedte meten met pulseIn() en deze dan na kalibratie omzetten naar RGB-waarden.

Tips voor Stabiele Metingen

  • Plaats de sensor 1-3 cm van het object en houd de hoek consistent.
  • Gebruik de ingebouwde witte LEDs voor stabiele verlichting.
  • Bescherm de sensor tegen veranderingen in omgevingslicht voor nauwkeurigere resultaten.

Bedradingsschema

Deze afbeelding toont hoe u de TCS3200 kleursensor aansluit op Arduino UNO R4:

TCS3200 KleursensorArduino UNO R4
VCC5V
GNDGND
S0Pin 4
S1Pin 3
S2Pin 6
S3Pin 5
OUTPin 7
Arduino UNO R4 and TCS3200 color sensor wiring diagram showing connection between pins

This image is created using Fritzing. Click to enlarge image

Zie De beste manier om Arduino Uno R4 en andere componenten van stroom te voorzien.

Arduino UNO R4 Code - Kalibratie (Pulsbreedte)

Kalibratie is nodig omdat de ruwe metingen van de sensor worden beïnvloed door de omgeving. Factoren zoals LED-helderheid, afstand, oppervlakreflectiviteit en omgevingslicht veranderen de gemeten waarden. U kunt deze effecten beschouwen als "ruis." De eerste kalibratiestap helpt u dat ruisbereik (minimum en maximum voor elke kleur) te meten, zodat u de invloed ervan kunt aftrekken en metingen kunt toewijzen aan correcte 0–255 RGB-waarden voor uw opstelling.

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

Snelle Stappen

Volg deze instructies stap voor stap:

  • Als dit de eerste keer is dat u de Arduino Uno R4 WiFi/Minima gebruikt, raadpleeg dan de handleiding over het instellen van de omgeving voor Arduino Uno R4 WiFi/Minima in de Arduino IDE.
  • Sluit de Arduino Uno R4 board aan op de kleursensor volgens het meegeleverde schema.
  • Sluit de Arduino Uno R4 board aan op uw computer met een USB-kabel.
  • Start de Arduino IDE op uw computer.
  • Selecteer de juiste Arduino Uno R4 board (bijv., Arduino Uno R4 WiFi) en COM-poort.
  • Kopieer de code hierboven en open deze in Arduino IDE.
  • Klik op de Upload knop in Arduino IDE om de code naar Arduino UNO R4 te uploaden.
  • Open de Serial Monitor. U ziet continue metingen samen met Min en Max waarden.
  • Beweeg de sensor over verschillende objecten: een wit object (zoals papier), een zwart object, en optioneel enkele gekleurde objecten.
  • Bekijk hoe de Min en Max rijen automatisch bijwerken terwijl de sensor de extremen bijhoudt.
  • Wanneer de Min en Max waarden stoppen met veranderen (meestal na 10-20 seconden), zijn dat uw kalibratiewaarden - noteer ze.
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  

Bijvoorbeeld, van de uitvoer hierboven zouden uw kalibratiewaarden zijn:

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

Arduino UNO R4 Code - RGB-waarden Uitlezen

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

Snelle Stappen

  • In de code hierboven, vind deze regels bovenaan:
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
  • Vervang ALLE zes 0 waarden door uw kalibratienummers van de vorige stap. Bijvoorbeeld, als uw kalibratie u redMin = 42, redMax = 210, greenMin = 55, greenMax = 185, blueMin = 60, blueMax = 172 gaf, verander de regels naar:
int redMin = 42; int redMax = 210; int greenMin = 55; int greenMax = 185; int blueMin = 60; int blueMax = 172;
  • Upload de code naar Arduino UNO R4.
  • Plaats een gekleurd object voor de sensor.
  • Controleer het resultaat op 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 toegewezen aan het standaard 0-255 bereik. Lagere pulsbreedtes (meer licht) produceren hogere RGB-waarden, en hogere pulsbreedtes (minder licht) produceren lagere RGB-waarden.

Toepassingen

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

  • Kleursorteerder: Sorteer objecten op kleur (rood, groen, blauw)
  • Kleur matching spel: Controleer of twee objecten dezelfde kleur hebben
  • Lijnvolger robot: Volg gekleurde lijnen op de vloer
  • Kwaliteitscontrole: Detecteer defecte producten aan de hand van kleur
  • Kleur-geactiveerd alarm: Activeer een zoemer of LED wanneer een specifieke kleur wordt gedetecteerd

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.

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