Labortagebuch - Arduino - Raspberry Pi
30.10.2019 - Der RGB-Sensor TCS230

Der RGB-Sensor TCS230

Der TCS230/TCS3200 ist ein leistungsfähiger IC zur Farberkennung im RGB-Farbraum. Die auftreffende farbige Licht wird durch eine 8x8-Matrix von Fotodioden aufgenommen. Durch einen integrierten Strom-Frequenz-Wandler werden die detektierten Werte direkt in ein Rechteck-Signal umgewandelt, welches proportional zur erkannten Lichtwelle/Intensität ist. Der an den Ausgang des Sensors angeschlossene Mikrocontroller kann nun dieses Signal auswerten.Das hier verwendete fertige Modul enthält zusätzlich zum eigentlichen IC vier weiße Leuchtdioden, die das zu erkennende Objekt in einem gleichmäßigen Farbton erhellen.
Hinweis: Laut Datenblatt sollte der VCC-PIN mit einem 0,01-0,1µF Kondensator stabilisiert werden. Dieses wird in den folgenden Experimenten aber nicht berücksichtigt.
Bei genauerer Betrachtung des Sensor-Chips sieht man, dass die Foto-Dioden drei verschiedene Farbfilter besitzen. 16 davon haben je einen roten, grünen oder blauen Filter. 16 weitere Foto-Dioden besitzen gar keinen Filter. Alle diese 16 gleichen Foto-Dioden sind parallel geschaltet und mit den Kontroll-PINs S2 und S3 verbunden, mit denen ausgewählt werden kann, welche Farbe man erkennen will. Anhand der Tabellen kann man sehen, wie man die PINs auslesen muss, um die entsprechende Farbe zu erkennen.
Verkabelung des Sensors mit dem Arduino

Ausgabe auf dem seriellen Monitor
Lesen und Ausgabe der Farbfrequenzen auf dem seriellen Monitor
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8
int frequency = 0;
void setup() {
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(sensorOut, INPUT);
// Frequenz-Skalierung auf 20% setzen
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);
Serial.begin(9600);}

void loop() {
// Rotfilter-Dioden zum Lesen gesetzt
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
// Lesen der Ausgabe-Frequenz
frequency = pulseIn(sensorOut, LOW);
// Ausgabe des Wertes auf dem Serial-Monitor
Serial.print("R= ");
// Ausgabe des Buchstabens R (für rot)
Serial.print(frequency);
// Ausgabe des Wertes der Frequenz für rot
Serial.print(" ");
delay(1000);
// Grünfilter-Dioden zum Lesen gesetzt
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
// Lesen der Ausgabe-Frequenz
frequency = pulseIn(sensorOut, LOW);
// Ausgabe des Wertes auf dem Serial-Monitor
Serial.print("G= ");
// Ausgabe des Buchstabens G (für grün)
Serial.print(frequency);
// Ausgabe des Wertes der Frequenz für grün
Serial.print(" ");
delay(1000);
// Blaufilter-Dioden zum Lesen gesetzt
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
// Lesen der Ausgabe-Frequenz
frequency = pulseIn(sensorOut, LOW);
// Ausgabe des Wertes auf dem Serial-Monitor
Serial.print("B= ");
// Ausgabe des Buchstabens B (für blau)
Serial.print(frequency);
// Ausgabe des Wertes der Frequenz für blau
Serial.println(" ");
delay(1000);}
Verkabelung
Sensor
->
Arduino
S0
->
4
S1
->
5
S2
->
6
S3
->
7
OUT
->
8
UCC
->
5V
GND
->
GND
Tabelle 1
S0 S1 Ausgangsfrequenz-Skalierung
L L aus
L H 2%
H L 20%
H H 100%
Tabelle 2
S2 S3 Foto-Dioden-Typ
L L rot
L H blau
H L weiß (kein Filter)
H H grün
Unterscheidung zwischen verschiedenen Farben.
In diesem Sketch wird zwischen verschiedenen Farben unterschieden. Diese sind ROT, GRÜN und BLAU.
INFO
Dieser Sketch bildet die Frequenz-Werte auf die RGB-Werte ab (diese liegen zwischen 0 und 255). Wir nehmen an, das Maximum von Blau hat eine Frequenz von 59, bei einem größeren Abstand erhalten wir 223. So wird 59 der RGB-Wert 255 und 223 der RGB-Wert 0 zugeordnet. Dieses wird in der Arduino IDE durch die map-Funktion realisiert.
Um zwischen verschiedenen Farben unterscheiden zu können, gibt es drei Bedingungen:
Wenn R den maximalen Wert hat (RGB-Parameter), so hat das Objekt die Farbe rot.
Wenn G den maximalen Wert hat (RGB-Parameter), so hat das Objekt die Farbe grün.
Wenn B den maximalen Wert hat (RGB-Parameter), so hat das Objekt die Farbe blau.
Hinweis: Der Sensor kann auch andere Farben erkennen. Dazu sind aber mehrere Abfragen notwendig.

Der Programm-Code
Teil 1
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8
Teil 2
// Speichert die Frequenz, die von den Fotodioden erkannt wird
int redFrequency = 0;
int greenFrequency = 0;
int blueFrequency = 0;
// Speichert die Farben red, green und blue
int redColor = 0;
int greenColor = 0;
int blueColor = 0;

void setup() {
// Vereinbarung der Outputs
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
// Der sensorOut wird als Input gesetzt
pinMode(sensorOut, INPUT);
// Skalierung der Frequenz auf 20%
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);
// Der serielle Monitor wird aktivert
Serial.begin(9600);
Teil 3
void loop() {
// Die RED (R) Photodioden werden zum Lesen gesetzt
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
// Lesen der Output-Frequenz
redFrequency = pulseIn(sensorOut, LOW);
// Remaping the value of the RED (R) frequency from 0 to 255
redColor = map(redFrequency, 70, 120, 255,0);
// Ausgabe des RED (R) Wertes
Serial.print("R = ");
Serial.print(redColor);
delay(1000);
// Die GREEN (G) Photodioden werden zum Lesen gesetzt
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
// Lesen der Output-Frequenz
greenFrequency = pulseIn(sensorOut, LOW);
// Remaping the value of the GREEN (G) frequency from 0 to 255
greenColor = map(greenFrequency, 100,199, 255, 0);
// Ausgabe des GREEN (G) Wertes
Serial.print(" G = ");
Serial.print(greenColor);
delay(1000);
Teil 4
// Setting BLUE (B) filtered photodiodes to be read
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
// Lesen der Output-Frequenz
blueFrequency = pulseIn(sensorOut, LOW);
// Remaping the value of the BLUE (B) frequency from 0 to 255
blueColor = map(blueFrequency, 38, 84, 255, 0);
// Ausgabe des BLUE (B) Wertes
Serial.print(" B = ");
Serial.print(blueColor);
delay(1000);
// Überprüfe die gefunden Farbe
// und zeige diese auf dem Serial-Monitor an
if(redColor > greenColor && redColor > blueColor){
Serial.println(" - RED detected!"); if(greenColor > redColor && greenColor > blueColor)
{ Serial.println(" - GREEN detected!");
}
if(blueColor > redColor && blueColor > greenColor){
Serial.println(" - BLUE detected!");
}
}

Ausgabe auf dem seriellen Monitor
Hier noch eine Bemerkung zum Einsatz des Sensors: in der Mitte der Platine befindet sich ein Fotosensor mit 64 Dioden bzw. Pixel, davon 16 ohne Filter und jeweils 16 mit roten, blauen oder grünen Farbfiltern. Die vier 5mm LEDs dienen dazu, das zu scannende Objekt möglichst gleichmäßig und neutral zu beleuchten.
Praxistipp: zur Messung sollte man das Umgebungslicht bzw. Streulicht vermeiden, da dies die Ergebnisse verfälschen kann. Je nach Einsatzbereich ist es manchmal hilfreich, den Fotosensor mithilfe eines kleinen Röhrchens abzuschirmen, um konstante Werte zu erhalten. Die Ausgabe des ICs ist ein Rechtecksignal proportional zur jeweiligen Wellenlänge. S0 und S1 skalieren die Frequenz des Ausgangssignals, S2 und S3 dient zur Abfrage der R- / B- / G- und W-Werte.OE schaltet das Modul ein bzw. aus (enable active low)