Mit dem Farberkennungssensor TCS230/TCS3200 können Farben im sichtbaren Licht-Spektrum (~340nm bis ~1000nm) erkannt werden und damit kann man z.B. über einen Mikrocontroller (z.B. Arduino) weitere Schaltungen steuern.
PIN | Typ | Beschreibung |
---|---|---|
GND (4) | Masseanschluss | |
OE (3) | In | Aktivierung für Ausgangsfrequenz (aktiv: LOW) |
OUT (6) | Out | Ausgabefrequenz |
S0, S1 (1, 2) | In | Steuerung der Ausgabefrequenz-Skalierung |
S2, S3 (7, 8) | In | Steuerung der Typen der Foto-Dioden |
VDD (5) | Stromversorgung (+) |
Der TCS230/TCS3200 ist ein leistungsfähiger IC zur Farberkennung. Die zu erkennende Farbe (genauer: das
farbige Licht) wird durch eine 8x8-Matrix von Foto-Dioden aufgenommen. Durch einen integrierten
Strom-Frequenz-Wandler werden die detektierten Werte direkt in ein Rechtecks-Signal umgewandelt, welches
proportional zur erkannten Lichtwelle/intensität. 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 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. Dies
ist in den folgenden Experimenten nicht berücksichtigt.
Bei genauerer Betrachtung des Sensor-Chips kann man sehen, dass die Foto-Dioden drei verschiedene Farbfilter
besitzen. 16 davon haben je einen roten, grünen oder blauen Filter. 16 Foto-Dioden haben 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 erkannt werden soll. Anhand der folgenden Tabelle kann man erkennen,
wie man die PINs auslesen muss, um welche Farbe zu erkennen.
S2 | S3 | Foto-Dioden-Typ |
---|---|---|
L | L | rot |
L | H | blau |
H | L | weiß (kein Filter) |
H | H | grün |
Der Sensor hat noch zwei weitere Kontroll-PINs: S0 und S1. Diese werden für die Skalierung der Ausgangsfrequenz benutzt. Diese Skalierungsfunktion wird für die Optimierung für bestimmte Frequenz-Zähler oder Mikroconrtoller verwendet:
S0 | S1 | Ausgangsfrequenz-Skalierung |
---|---|---|
L | L | aus |
L | H | 2% |
H | L | 20% |
H | H | 100% |
#define SENSOR_S0 5
#define SENSOR_S1 4
#define SENSOR_S2 7
#define SENSOR_S3 6
#define SENSOR_OUT 8
int frequency = 0;
void setup()
{
pinMode(SENSOR_S0, OUTPUT);
pinMode(SENSOR_S1, OUTPUT);
pinMode(SENSOR_S2, OUTPUT);
pinMode(SENSOR_S3, OUTPUT);
pinMode(SENSOR_OUT, INPUT);
// Setting frequency-scaling to 20%
digitalWrite(SENSOR_S0, HIGH);
digitalWrite(SENSOR_S1, LOW);
Serial.begin(9600);
}
void loop()
{
// Setting RED filtered photodiodes to be read
digitalWrite(SENSOR_S2, LOW);
digitalWrite(SENSOR_S3, LOW);
frequency = pulseIn(SENSOR_OUT, LOW); // Reading the output frequency
// Printing RED value on the serial monitor
Serial.print("R=");
Serial.print(frequency);
Serial.print(" ");
delay(100);
// Setting GREEN filtered photodiodes to be read
digitalWrite(SENSOR_S2, HIGH);
digitalWrite(SENSOR_S3, HIGH);
frequency = pulseIn(SENSOR_OUT, LOW);
// Printing GREEN value on the serial monitor
Serial.print("G=");
Serial.print(frequency);
Serial.print(" ");
delay(100);
// Setting BLUE filtered photodiodes to be read
digitalWrite(SENSOR_S2, LOW);
digitalWrite(SENSOR_S3, HIGH);
frequency = pulseIn(SENSOR_OUT, LOW);
// Printing BLUE value on the serial monitor
Serial.print("B=");
Serial.print(frequency);
Serial.println(" ");
delay(100);
}
In diesem Experiement wird die Farbe nicht nur ausgelesen, sondern auch als LED angezeigt, allerdings nur
als Primärfarben oder primäre Mischfarben ohne Helligkeitsabstufungen.
Um ein bestmögliches Ergebnis zu erhalten sollten die "threshold"-Werte in den "ColorComponents" auf den
verwendeten Sensor angepasst werden. Außerdem sollte der Betrieb der Schaltung in möglichst dunkler Umgebung
erfolgen. Am besten man packt den Sensor in ein lichtabschottende Box.
#define SENSOR_S0 5
#define SENSOR_S1 4
#define SENSOR_S2 7
#define SENSOR_S3 6
#define SENSOR_OUT 8
struct ColorComponent {
byte ledPin;
byte pinS2Setup;
byte pinS3Setup;
unsigned int frequency;
byte threshold;
};
// initial values of the RGB color components (Note: all LED pins have to be PWM capable)
ColorComponent col[] = {
{ 9, LOW, LOW, 0, 35}, // red
{ 10, HIGH, HIGH, 0, 42}, // green
{ 11, LOW, HIGH, 0, 25}, // blue
};
void setup()
{
pinMode(SENSOR_S0, OUTPUT);
pinMode(SENSOR_S1, OUTPUT);
pinMode(SENSOR_S2, OUTPUT);
pinMode(SENSOR_S3, OUTPUT);
pinMode(SENSOR_OUT, INPUT);
for(byte i=0; i<3; i++) {
pinMode(col[i].ledPin, OUTPUT);
}
// Setting frequency-scaling
digitalWrite(SENSOR_S0, HIGH);
digitalWrite(SENSOR_S1, HIGH);
}
void loop()
{
for(byte i=0; i<3; i++) {
readColorBrightness(&col[i]);
showLed(&col[i]);
}
delay(500);
}
void readColorBrightness(ColorComponent* color)
{
// Setting RED filtered photodiodes to be read
digitalWrite(SENSOR_S2, color->pinS2Setup);
digitalWrite(SENSOR_S3, color->pinS3Setup);
color->frequency = pulseIn(SENSOR_OUT, LOW); // Reading the output frequency
}
void showLed(ColorComponent* color)
{
if (color->frequency < color->threshold) {
digitalWrite(color->ledPin, HIGH);
} else {
digitalWrite(color->ledPin, LOW);
}
}
zurück