Farberkennung mit dem TCS230/TCS3200-Sensor

Video: Live-Demonstration mit Farb-Indikatoren aus LEDs

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.

TCS230/TCS3200 als fertiges Arduino-Modul
Abb.: TCS230/TCS3200 als fertiges Arduino-Modul
TCS230/TCS3200-Chip in vergrößerter Darstellung
Abb.: TCS230/TCS3200-Chip in vergrößerter Darstellung

PIN-Belegung

PIN-Belegung des TCS3200
Abb.: PIN-Belegung des TCS3200
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 (+)

Funktionsweise

Funktionsweise des TCS230/TCS3200
Abb.: Funktionsweise des TCS230/TCS3200

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%

Ex. 1: Auslesen der Farbe und Ausgabe in serieller Konsole

Verwendete Bauteile

Aufbau

Aufbau der Schaltung
Abb.: Aufbau der Schaltung
Beispiel-Ausgabe in der seriellen Konsole
Abb.: Beispiel-Ausgabe in der seriellen Konsole

Sketch

#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);
}

Ex. 2: Anzeigen der detektierten Farbe mit entsprechender LED

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.

Verwendete Bauteile

Aufbau der Schaltung
Abb.: Aufbau der Schaltung

Sketch

#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