Farbdetektor / Color Sensor (Bsp. TCS3200)
Bei dem Farbdetektor TCS3200 handelt es sich um einen Converter IC, der Farben in eine entsprechende Ausgangsfrequenz umwandelt. Der Ausgangsfrequenz ist proportional zur Lichtintensität und hat eine konstante Taktfrequenz (duty cycle) von 50%.
Auf der IC Oberfläche sind 64 Fotodioden in einem 8x8 Raster angeordnet. Vor den Fotodioden sind unterschiedliche Farbfilter angebracht die nur rotes, grünes oder blaues Licht passieren lassen. Aufgrund den Farbfiltern erkennen jeweils 16 Fotodioden den roten, grünen und blauen Farbanteil. Vor weiteren 16 Fotodioden ist kein Farbfilter installiert. Diese geben das ganze sichtbare Farbspektrum zurück.
Pinbelegung
| GND | Spannungsversorgung - |
| VCC | Spannungsversorgung +5V |
| OUT | Ausgangsfrequenz als Rechtecksignal |
| LED | Ausleuchtung ausschalten (LED auf GND legen) Bei offenem Ausgang sind die LED's eingeschalten |
| S0 | Ausgangsfrequenz skalieren (siehe Tabelle) |
| S1 | |
| S2 | Fotodioden auswählen (siehe Tabelle) |
| S3 |
| S0 | S1 | Ausgangsfrequenz Skalierung |
|---|---|---|
| L | L | Ausgang auf GND (aus) |
| L | H | 2% (Bsp. 200Hz) |
| H | L | 20% (Bsp. 2kHz) |
| H | H | 100% (Bsp. 10kHz) |
| S2 | S3 | aktive Fotodiode |
|---|---|---|
| L | L | Rot |
| L | H | Blau |
| H | H | Grün |
| H | L | Clear (Kein Filter) |
Programmcode
Mit zunehmender Farbintensität bzw. Helligkeit wird die Frequenz immer größer bzw. die Pulsweite immer geringer.
Mit dem Arduino Befehl pulseIn(Pin, HIGH) kann die Pulsdauer des HIGH Pegel in Millisekunden
gemessen werden. Die weitere Umrechnung in die Frequenz ist nicht notwendig, da die Pulsdauer bereits proportional
dazu ist.
#define S0 2
#define S1 3
#define S2 4
#define S3 5
#define OUT 6
#define LED 7
unsigned long all = 0; // ganze sichtbare Licht
unsigned long rt = 0; // Rotanteil
unsigned long gn = 0; // Grünanteil
unsigned long bl = 0; // Blauanteil
void setup() {
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(OUT, INPUT);
pinMode(LED, OUTPUT);
digitalWrite(LED,HIGH);
// Skalierung auf 2% stellen
digitalWrite(S0, LOW);
digitalWrite(S1, HIGH);
Serial.begin(9600);
}
void loop() {
// Photodioden für sämtliches Licht auslesen (Clear)
digitalWrite(S2, HIGH);
digitalWrite(S3, LOW);
delay(100);
// HIGH Puls Zeit messen
all = pulseIn(OUT, HIGH);
// Photodioden für rotes Licht auslesen
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
delay(100);
// HIGH Puls Zeit messen
rt = pulseIn(OUT, HIGH);
// Photodioden für Grünes Licht auslesen
digitalWrite(S2, HIGH);
digitalWrite(S3, HIGH);
delay(100);
// HIGH Puls Zeit messen
gn = pulseIn(OUT, LOW);
// Photodioden für blaues Licht auslesen
digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);
delay(100);
// HIGH Puls Zeit messen
bl = pulseIn(OUT, HIGH);
// Messwerte ausgeben
Serial.print("Summe: "); Serial.print(all);
Serial.print(" Rot: "); Serial.print(rt);
Serial.print(" Grün: "); Serial.print(gn);
Serial.print(" Blau: "); Serial.println(bl);
delay (500);
}