Read the TCS3200 color sensor with an Arduino

FunduinoLast updated on

Rot, Grün und Blau erkennen und mit drei LEDs anzeigen

Der TCS3200 misst, wie viel Rot, Grün und Blau im Licht steckt, das auf ihn fällt. Anders als viele andere Sensoren liefert er dabei keine Zahl, sondern ein Signal, dessen Frequenz sich mit der Farbe ändert – der Arduino misst also eine Zeit und schließt daraus auf die Farbe.

In dieser Anleitung baust du den Sensor mit drei LEDs auf: Hältst du ein rotes, grünes oder blaues Papier darunter, leuchtet die passende LED. Genau so arbeiten auch Sortiermaschinen, die Bauteile nach Farbe trennen.

Platine des Farbsensors TCS3200 mit vier weißen LEDs um den Sensorchip
Das Farbsensor-Modul TCS3200 mit seinen vier weißen LEDs
Steckplatine mit Arduino, Farbsensor und drei farbigen LEDs
Der Testaufbau mit Farbsensor und drei LEDs
1 / 2

Material

Für dieses Projekt brauchst du:

  • 1× Mikrocontroller mit passendem USB-Kabel
  • 1× Steckbrett
  • 1× Farbsensor-Modul TCS3200 (GY-31)
  • 1× rote, 1× grüne und 1× blaue LED
  • 3× Vorwiderstand 220 Ohm
  • Steckkabel männlich/männlich und männlich/weiblich
  • Farbige Papierstücke in Rot, Grün und Blau zum Testen

Wie der TCS3200 Farben erkennt

In der Mitte des Moduls sitzt ein kleines Quadrat aus Fotodioden. Sie sind in vier Gruppen aufgeteilt: mit rotem, mit grünem, mit blauem Filter und ganz ohne Filter. Je nachdem, welche Gruppe gerade aktiv ist, misst der Sensor den Anteil dieser einen Farbe im auftreffenden Licht.

Drumherum liegen vier weiße LEDs, die das Messobjekt gleichmäßig ausleuchten – ohne sie wären die Werte stark von der Raumbeleuchtung abhängig.

Der Sensor gibt sein Ergebnis nicht als Zahl aus, sondern als Rechtecksignal: Je mehr von der gemessenen Farbe vorhanden ist, desto schneller schwingt es. Der Arduino misst mit dem Befehl pulseIn, wie lang ein einzelner Impuls dauert. Ein kleiner Wert bedeutet also viel von dieser Farbe.

Eingesetzt wird so ein Sensor zum Beispiel in Sortiermaschinen.

Platine des Farbsensors TCS3200 mit vier weißen LEDs um den Sensorchip
Das Farbsensor-Modul TCS3200 mit seinen vier weißen LEDs

Aufbau und Verkabelung

Verkabele den Farbsensor so mit dem Arduino:

  • VCC → 5V
  • GND → GND
  • S0 → Pin 8
  • S1 → Pin 9
  • S2 → Pin 12
  • S3 → Pin 11
  • OUT → Pin 10
  • OE → GND

Die drei LEDs kommen mit je einem 220-Ohm-Vorwiderstand an diese Pins:

  • rote LED → Pin 2
  • grüne LED → Pin 3
  • blaue LED → Pin 4

Auf dem verbreiteten Modul GY-31 gibt es zusätzlich einen Anschluss mit der Aufschrift LED. Verbinde ihn mit Pin 13 des Mikrocontrollers, sonst bleiben die vier weißen Beleuchtungs-LEDs dunkel und die Messwerte schwanken stark.

Steckplatine mit Arduino, Farbsensor und drei farbigen LEDs
Der Testaufbau mit Farbsensor und drei LEDs

Die Steuerpins S0 bis S3

S0 bis S3 sind Eingänge des Sensors, die der Arduino ansteuert – im Sketch sind sie deshalb als OUTPUT festgelegt. Nur OUT ist ein Ausgang des Sensors und damit für den Arduino ein INPUT.

  • S0 und S1 stellen ein, wie schnell der Sensor sein Signal ausgibt. Beide auf HIGH bedeutet volle Geschwindigkeit – die empfindlichste Einstellung.
  • S2 und S3 wählen aus, welcher Farbfilter gerade gemessen wird: LOW/LOW ergibt Rot, LOW/HIGH ergibt Blau, HIGH/HIGH ergibt Grün.

Der Sketch schaltet deshalb in der Funktion color() dreimal hintereinander um und misst jedes Mal die Länge eines Impulses.

Tabelle der S2/S3-Kombinationen und der zugehörigen Farbfilter
Die Farbmatrix des TCS3200: S2 und S3 wählen aus, welcher Farbfilter gerade gemessen wird

Farben erkennen und LEDs schalten

Lade den Sketch hoch und öffne den Seriellen Monitor mit 9600 Baud. Dort erscheinen die drei Messwerte nebeneinander. Halte nacheinander ein rotes, grünes und blaues Papier unter den Sensor – die passende LED leuchtet auf und der Monitor nennt die erkannte Farbe.

Der Sketch vergleicht die drei Werte untereinander – der kleinste gewinnt. Für Rot gilt zusätzlich die Bedingung, dass der Wert unter 20 liegen muss. Erkennt dein Aufbau Rot nie oder immer, ist dieser Schwellenwert der erste Punkt, an dem du drehen solltest: Lies deine eigenen Zahlen im Seriellen Monitor ab und passe ihn an.

Serieller Monitor mit den Messwerten für Rot, Grün und Blau
Die Farbwerte im Seriellen Monitor
Farbsensor über blauem Papier, blaue LED leuchtet
Blauer Untergrund erkannt – die blaue LED leuchtet
Farbsensor über grünem Papier, grüne LED leuchtet
Grüner Untergrund erkannt – die grüne LED leuchtet
Farbsensor über rotem Papier, rote LED leuchtet
Roter Untergrund erkannt – die rote LED leuchtet
1 / 4
Sketch: Farben erkennen und LEDs schalten
const int s0 = 8;   // Verbindung der Farbsensorkontakte mit dem Arduino festlegen
const int s1 = 9;
const int s2 = 12;
const int s3 = 11;
const int out = 10;

int roteLED = 2;    // Verbindung der LEDs mit dem Arduino festlegen
int grueneLED = 3;
int blaueLED = 4;

int rot = 0;        // Variablen fuer die drei Messwerte
int gruen = 0;
int blau = 0;

void setup()
{
  Serial.begin(9600);   // Serielle Kommunikation starten

  // s0 bis s3 sind Eingaenge DES SENSORS. Der Arduino gibt darauf aus,
  // deshalb sind sie hier OUTPUT. out ist der Ausgang des Sensors,
  // den der Arduino liest, deshalb INPUT.
  pinMode(s0, OUTPUT);
  pinMode(s1, OUTPUT);
  pinMode(s2, OUTPUT);
  pinMode(s3, OUTPUT);
  pinMode(out, INPUT);

  pinMode(roteLED, OUTPUT);   // Die LEDs werden als Ausgang festgelegt
  pinMode(grueneLED, OUTPUT);
  pinMode(blaueLED, OUTPUT);

  // s0 und s1 stellen die Ausgangsfrequenz des Sensors ein.
  // HIGH/HIGH bedeutet 100 Prozent - das ist die empfindlichste Einstellung.
  digitalWrite(s0, HIGH);
  digitalWrite(s1, HIGH);
}

void loop()
{
  color();   // Diese Funktion steht am Ende des Sketches

  Serial.print(" Wert Rot: ");
  Serial.print(rot);
  Serial.print(" Wert Gruen: ");
  Serial.print(gruen);
  Serial.print(" Wert Blau: ");
  Serial.print(blau);

  // Je kuerzer der gemessene Impuls, desto mehr von dieser Farbe ist vorhanden.
  // Der kleinste der drei Werte gewinnt.
  if (rot < blau && rot < gruen && rot < 20)
  {
    Serial.println(" - (Rote Farbe)");
    digitalWrite(roteLED, HIGH);
    digitalWrite(grueneLED, LOW);
    digitalWrite(blaueLED, LOW);
  }
  else if (blau < rot && blau < gruen)
  {
    Serial.println(" - (Blaue Farbe)");
    digitalWrite(roteLED, LOW);
    digitalWrite(grueneLED, LOW);
    digitalWrite(blaueLED, HIGH);
  }
  else if (gruen < rot && gruen < blau)
  {
    Serial.println(" - (Gruene Farbe)");
    digitalWrite(roteLED, LOW);
    digitalWrite(grueneLED, HIGH);
    digitalWrite(blaueLED, LOW);
  }
  else
  {
    Serial.println();
  }

  delay(300);
}

// Hier werden die Werte vom Farbsensor ausgelesen.
// s2 und s3 waehlen aus, welcher Farbfilter gerade gemessen wird.
void color()
{
  digitalWrite(s2, LOW);    // s2 LOW, s3 LOW  -> roter Filter
  digitalWrite(s3, LOW);
  rot = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);

  digitalWrite(s3, HIGH);   // s2 LOW, s3 HIGH -> blauer Filter
  blau = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);

  digitalWrite(s2, HIGH);   // s2 HIGH, s3 HIGH -> gruener Filter
  gruen = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
}
Rate the instructions

Comments

Ask a question or share an experience

Contact us if something doesn’t work. Please include your board and the error message.

We review every comment before publication. Your email address remains with us.