Arduino Nano - TCS3200D/TCS230 Kleurensensor

Deze uitgebreide handleiding laat u zien hoe u de TCS3200D/TCS230 kleurensensor aansluit op een Arduino Nano voor nauwkeurige kleurmetingen en het uitlezen van RGB-waarden. Beheers de kalibratieprocedures en ontwikkel kleurherkenningsmogelijkheden in uw projecten.

Leerdoelen:

Arduino Nano met TCS3200D TCS230 kleurherkenningssensor module tutorial

Hardware Benodigd

1×Official Arduino Nano
1×Alternatief: DIYables ATMEGA328P Nano Development Board
1×USB A naar Mini-B USB kabel
1×TCS3200D/TCS230 Kleurherkenningssensor Module
1×Breadboard (experimenteerprint)
1×Jumper draden
1×(Aanbevolen) Schroefklem Uitbreidingsboard voor Arduino Nano
1×(Aanbevolen) Breakout Uitbreidingsboard voor Arduino Nano
1×(Aanbevolen) Stromsplitter voor Arduino Nano

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

De TCS3200D/TCS230 sensor gebruikt een fotodiode-matrix die is georganiseerd in een 8×8 raster voor kleurbepaling via optische filtering. Binnen deze array van 64 elementen hebben 16 fotodiodes rode spectrale filters, nog eens 16 groene filters, 16 blauwe filters en de overige 16 fotodiodes werken zonder filter (heldere respons). Kleurmeting vindt plaats door specifieke setjes filters te activeren en de resulterende frequentiegemoduleerde vierkante-golf uitgang te analyseren.

Ingebouwde witte LED-arrays op standaard modules zorgen voor constante belichting van het meetobject, wat de meetstabiliteit behoudt ongeacht externe lichtomstandigheden en de prestaties verbetert in donkere omgevingen.

Pinout

Beschikbare aansluitingen op de TCS3200D/TCS230 sensorplaat:

  • VCC pin: Voedingsspanning invoer (+5V).
  • GND pin: Massa referentie (0V).
  • S0, S1 pinnen: Selector voor uitgangsfrequentieschaal.
  • S2, S3 pinnen: Selector voor kleurkanaalfilter.
  • OUT pin: Frequentiegemoduleerde vierkante-golf uitgang.
  • OE pin: Output enable invoer (ingeschakeld bij LOW). Standaardmodules zijn meestal intern aangesloten op GND; als deze niet verbonden is, sluit u deze handmatig aan op GND.
TCS3200 TCS230 kleurensensor module pinout diagram met VCC GND S0 S1 S2 S3 OUT pinnen

Hoe Werkt Het

Twee belangrijke instellingen bepalen het gedrag van de sensor: welk kleurkanaal geactiveerd wordt en welke uitgangssignaalsterkte wordt gegenereerd. Twee paren stuurpinnen regelen deze functies:

Frequentieschaalbesturing (S0 en S1 pinnen):

  • S0=LOW, S1=LOW: Energiezuinige stand (power down)
  • S0=LOW, S1=HIGH: Schaalfactor 2%
  • S0=HIGH, S1=LOW: Schaalfactor 20%
  • S0=HIGH, S1=HIGH: Schaalfactor 100% (volledige snelheid)

Keuze kleurkanaal (S2 en S3 pinnen):

  • S2=LOW, S3=LOW: Rode fotodiodes actief
  • S2=LOW, S3=HIGH: Blauwe fotodiodes actief
  • S2=HIGH, S3=LOW: Helder (clear) fotodiodes actief (geen filtering)
  • S2=HIGH, S3=HIGH: Groene fotodiodes actief

De OUT-pin levert een vierkante-golffrequentie van ruwweg 2 Hz tot 500 kHz. Hogere frequentie betekent meer lichtintensiteit – helderdere belichting genereert een hogere frequentie-uitgang. De Arduino-functie pulseIn() meet de pulsduur, die omgekeerd correleert met lichtsterkte — kortere pulsen duiden op sterker licht. Met kalibratie worden deze metingen omgezet in het gebruikelijke 0-255 RGB-formaat.

Optimale Precisie Bereiken

  • Houd de sensor 1–3 cm van het meetobject op een stabiele hoek.
  • Maak gebruik van de geïntegreerde witte LED-verlichting voor constante belichting.
  • Bescherm de sensor tegen wisselend omgevingslicht om meetconsistentie te verbeteren.

Bedradingsschema

Bedrading van TCS3200 kleurensensor naar Arduino Nano:

TCS3200 Color SensorArduino Nano
VCC5V
GNDGND
S0D4
S1D3
S2D6
S3D5
OUTD7
Arduino Nano en TCS3200 kleuren sensor bedrading schema met verbinding tussen pinnen

This image is created using Fritzing. Click to enlarge image

Arduino Nano Code - Pulsbreedte Kalibratie

Kalibratie verwijdert omgevingsinvloeden uit de ruwe metingen. Variabelen zoals LED-uitgangssterkte, afstand tot doel, materiaalreflectiviteit en kamerlicht beïnvloeden de waarden. Zie dit als systematische fouten die gemeten moeten worden. De kalibratieroutine identificeert minimum- en maximumwaarden van pulsbreedtes voor alle kleurkanalen, en stelt hiermee referentiegrenzen vast om ruwe data nauwkeurig te vertalen naar 0-255 RGB-waarden die passen bij uw omgeving.

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

  • Laad de kalibratieschets in de Arduino IDE
  • Verbind Arduino Nano via USB en upload met de Upload knop
  • Open de Serial Monitor om real-time Min/Max waarden te volgen
  • Richt de sensor op verschillende oppervlakken: witte materialen (zoals printerpapier), zwarte objecten en kleurrijke items
  • Observeer hoe Min/Max-waarden automatisch worden bijgewerkt bij het detecteren van uitersten
  • Zodra waarden stabiel zijn (meestal na 10-20 seconden), noteer alle zes kalibratieparameters
COM6
Send
=== TCS3200 Kalibratie === Richt de sensor op verschillende objecten (wit, zwart, kleuren). Min en Max waarden worden automatisch bijgehouden. Wanneer waarden stabiel lijken, noteer ze voor de volgende 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 kalibratieparameters uit bovenstaande output:

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

Arduino Nano Code - RGB Waarde Meting

/* * Deze Arduino Nano code is ontwikkeld door newbiely.nl * Deze Arduino Nano code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/arduino-nano/arduino-nano-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 kalibratievariabelen aan het begin van de code:
int redMin = 0; // Rode minimum pulsbreedte int redMax = 0; // Rode maximum pulsbreedte int greenMin = 0; // Groene minimum pulsbreedte int greenMax = 0; // Groene maximum pulsbreedte int blueMin = 0; // Blauwe minimum pulsbreedte int blueMax = 0; // Blauwe maximum pulsbreedte
  • Vervang alle zes nullen door de gemeten kalibratiegegevens. Voorbeeld met de waarden 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 bijgewerkte code naar Arduino Nano
  • Plaats gekleurd voorbeeldmateriaal voor de sensor
  • Controleer de RGB-uitvoer via 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 weergegeven RGB-waarden zijn conform de standaard 0-255 schaal. Kortere pulsbreedtes (helderdere reflecties) genereren hogere RGB-waarden; langere pulsbreedtes (zwakkere reflecties) resulteren in lagere waarden.

Projecttoepassingen

Met een werkende RGB-meetfunctionaliteit kunt u projecten ontwikkelen zoals:

  • Chromatisch sorteersysteem: Objecten categoriseren op kleur (onderscheid tussen rood/groen/blauw)
  • Kleurverificatieapparaat: Controleren van kleurconsistentie tussen monsters
  • Kleurgebaseerde routevolger: Robots die navigeren langs gekleurde markers
  • Visuele kwaliteitsinspectie: Productiefouten detecteren via kleuranalyses
  • Kleurgestuurde automatisering: Acties uitvoeren als specifieke kleuren worden 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.

Bekijk onze video-tutorial voor een visuele begeleiding bij dit project! De video biedt extra inzichten en verduidelijkt de praktische aansluiting en programmering.

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!