Sensor de color TCS34725 para Arduino

FunduinoÚltima actualización el

Farben erkennen und die erkannte Farbe mit einer RGB-LED anzeigen

Der TCS34725 misst, wie viel Rot, Grün und Blau im Licht steckt, das auf ihn fällt. Eine weiße LED auf dem Modul leuchtet das Messobjekt dabei gleichmäßig aus, damit die Werte vergleichbar bleiben.

In dieser Anleitung liest du die Farbwerte am Seriellen Monitor mit und lässt dir anzeigen, welche Farbe der Sensor erkannt hat. Im letzten Schritt erweiterst du den Aufbau um eine RGB-LED, die die erkannte Farbe direkt sichtbar macht.

Kleine Platine mit dem Farbsensor TCS34725 und weißer LED
Das Farbsensor-Modul TCS34725
Farbsensor-Modul mit einem farbigen Papierstreifen darüber
Ein farbiger Streifen wird über den Farbsensor gehalten
1 / 2

Material

Für den Grundaufbau brauchst du:

  • 1× Arduino UNO R3 mit passendem USB-Kabel
  • 1× Farbsensor-Modul TCS34725
  • 4× Steckkabel männlich/weiblich
  • Farbige Papierstreifen in Rot, Grün und Blau zum Testen

Für die Erweiterung im letzten Schritt kommen dazu:

  • 1× RGB-LED mit gemeinsamer Kathode oder eine RGB-LED auf Platine
  • 3× Vorwiderstand 220 Ohm (entfällt bei der Variante auf Platine)
  • 1× Breadboard

Der RGB-Farbraum

Der RGB-Farbraum besteht aus den drei Grundfarben Rot, Grün und Blau. Fast alle Farben lassen sich durch Mischen dieser drei erzeugen. Jede Grundfarbe hat 256 Helligkeitsstufen: 0 bedeutet aus, 255 bedeutet volle Helligkeit.

Beispiele:

  • Rot: 255, 0, 0
  • Grün: 0, 255, 0
  • Blau: 0, 0, 255
  • Gelb: 255, 255, 0
  • Schwarz: 0, 0, 0
  • Weiß: 255, 255, 255

Farbtabelle mit RGB-Werten

Drei überlappende Kreise in Rot, Grün und Blau
Additive Farbmischung im RGB-Farbraum (Quelle: Wikimedia Commons, Synthese+.svg)

Der Sensor und sein Anschluss

Der TCS34725 unterscheidet die Anteile von Rot, Grün und Blau im auftreffenden Licht. Auf dem Modul sitzt zusätzlich eine weiße LED, die das Messobjekt gleichmäßig ausleuchtet – sie wird im Sketch nur für die Messung eingeschaltet.

Angeschlossen wird der Sensor über den I2C-Bus:

  • VCC → 5V
  • GND → GND
  • SDA → A4
  • SCL → A5

Das Modul nutzt einen Grove-Stecker. Wenn dir kein Grove-Shield zur Verfügung steht, verbindest du die vier Adern einfach mit Steckkabeln und schließt sie direkt am Mikrocontroller an.

Kleine Platine mit dem Farbsensor TCS34725 und weißer LED
Das Farbsensor-Modul TCS34725
Grove-Stecker mit vier farbigen Adern und ihrer Zuordnung
Belegung des Grove-Steckers
1 / 2

Bibliothek installieren

Öffne in der Arduino IDE den Bibliotheksverwalter über Sketch → Bibliothek einbinden → Bibliotheken verwalten und suche nach Adafruit TCS34725.

Nach dem Klick auf „Installieren“ fragt die IDE, ob auch die benötigten Abhängigkeiten installiert werden sollen. Bestätige das mit „Install all“.

Bibliotheksverwalter der Arduino IDE mit der Adafruit-TCS34725-Bibliothek
Die Bibliothek „Adafruit TCS34725“ im Bibliotheksverwalter

Farbwerte im Seriellen Monitor anzeigen

Lade den Sketch hoch und öffne den Seriellen Monitor mit 9600 Baud. Dort erscheinen die drei Farbwerte nebeneinander. Hältst du einen roten, grünen oder blauen Streifen über den Sensor, meldet das Programm zusätzlich, welche Farbe es erkannt hat.

Die gemessenen Werte hängen stark von der Umgebungshelligkeit ab. Beobachte deine eigenen Zahlen im Seriellen Monitor und passe den Grenzwert – im Beispiel 100 – an deinen Aufbau an. Halte das Messobjekt immer ungefähr gleich weit vom Sensor entfernt, sonst schwanken die Werte zusätzlich.

Schaltplan mit Arduino und Farbsensor
Aufbau ohne RGB-LED: nur der Farbsensor am I2C-Bus
Farbsensor-Modul mit einem farbigen Papierstreifen darüber
Ein farbiger Streifen wird über den Farbsensor gehalten
1 / 2
Sketch 1: Farbwerte im Seriellen Monitor anzeigen
#include "Adafruit_TCS34725.h"

/*
  TCS34725_INTEGRATIONTIME
  Laengere Zeiten erhoehen die Empfindlichkeit, besonders bei schwachem Licht.
  Moegliche Werte: 2_4MS, 50MS, 101MS, 154MS, 700MS
  -----
  TCS34725_GAIN
  Empfindlichkeit einstellen: 1X, 4X, 16X, 60X
*/
Adafruit_TCS34725 RGBSensor = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);

void setup()
{
  Serial.begin(9600);
  delay(1000);

  // Farbsensor starten
  if (RGBSensor.begin())
  {
    Serial.println("Sensor gefunden!");
  }
  // Wenn der Sensor nicht gefunden wurde
  else
  {
    Serial.println("Sensor nicht gefunden");
    // Programm anhalten
    while (1);
  }
}

void loop()
{
  // Variablen fuer die Farben
  float rot, gruen, blau;

  // Beleuchtungs-LED des Moduls einschalten
  RGBSensor.setInterrupt(false);
  delay(60);

  // Daten erfassen
  RGBSensor.getRGB(&rot, &gruen, &blau);

  // Beleuchtungs-LED wieder ausschalten
  RGBSensor.setInterrupt(true);

  // Farbwerte anzeigen
  Serial.print("rot:\t");
  Serial.print(int(rot));
  Serial.print("\tgruen:\t");
  Serial.print(int(gruen));
  Serial.print("\tblau:\t");
  Serial.println(int(blau));

  // Grenzwert, ab dem die entsprechende Farbe als erkannt gilt.
  // Im Beispiel 100 - mit Hilfe der Anzeige im Seriellen Monitor anpassen.
  if (rot > 100)   Serial.println("roter Streifen");
  if (gruen > 100) Serial.println("gruener Streifen");
  if (blau > 100)  Serial.println("blauer Streifen");

  delay(500);
}

Erweiterung: Farbwerte mit einer RGB-LED sichtbar machen

Jetzt erweiterst du die Schaltung um eine RGB-LED. Hältst du einen farbigen Streifen über den Sensor, leuchtet die LED in der erkannten Farbe.

Die drei Anschlüsse der LED kommen an die Pins 6 (Rot), 5 (Grün) und 4 (Blau), der gemeinsame Anschluss an GND. Jeder der drei Farbanschlüsse braucht einen eigenen Vorwiderstand von 220 Ohm – es sei denn, du verwendest eine RGB-LED auf Platine, auf der die Widerstände bereits sitzen.

Der Sketch geht von einer RGB-LED mit gemeinsamer Kathode aus: HIGH schaltet eine Farbe ein. Bei einer LED mit gemeinsamer Anode ist es genau umgekehrt – dann gehört der gemeinsame Anschluss an 5V und HIGH und LOW tauschen ihre Bedeutung.

Schaltplan mit Arduino, Farbsensor und RGB-LED
Erweiterter Aufbau mit RGB-LED an den Pins 4, 5 und 6
Sketch 2: Farbwerte mit einer RGB-LED sichtbar machen
#include "Adafruit_TCS34725.h"

/*
  TCS34725_INTEGRATIONTIME
  Laengere Zeiten erhoehen die Empfindlichkeit, besonders bei schwachem Licht.
  Moegliche Werte: 2_4MS, 50MS, 101MS, 154MS, 700MS
  -----
  TCS34725_GAIN
  Empfindlichkeit einstellen: 1X, 4X, 16X, 60X
*/
Adafruit_TCS34725 RGBSensor = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);

// Pins der RGB-LED
int roteLED = 6;
int grueneLED = 5;
int blaueLED = 4;

void setup()
{
  Serial.begin(9600);
  delay(1000);

  pinMode(roteLED, OUTPUT);
  pinMode(grueneLED, OUTPUT);
  pinMode(blaueLED, OUTPUT);

  // Farbsensor starten
  if (RGBSensor.begin())
  {
    Serial.println("Sensor gefunden!");
  }
  // Wenn der Sensor nicht gefunden wurde
  else
  {
    Serial.println("Sensor nicht gefunden");
    // Programm anhalten
    while (1);
  }
}

void loop()
{
  // Variablen fuer die Farben
  float rot, gruen, blau;

  // Beleuchtungs-LED des Moduls einschalten
  RGBSensor.setInterrupt(false);
  delay(60);

  // Daten erfassen
  RGBSensor.getRGB(&rot, &gruen, &blau);

  // Beleuchtungs-LED wieder ausschalten
  RGBSensor.setInterrupt(true);

  // Farbwerte anzeigen
  Serial.print("rot:\t");
  Serial.print(int(rot));
  Serial.print("\tgruen:\t");
  Serial.print(int(gruen));
  Serial.print("\tblau:\t");
  Serial.println(int(blau));

  // Jeden Kanal einzeln schalten: ueber dem Grenzwert an, darunter aus.
  // Grenzwert mit Hilfe der Anzeige im Seriellen Monitor anpassen.
  if (rot > 100)
  {
    digitalWrite(roteLED, HIGH);
    Serial.println("roter Streifen");
  }
  else digitalWrite(roteLED, LOW);

  if (gruen > 100)
  {
    digitalWrite(grueneLED, HIGH);
    Serial.println("gruener Streifen");
  }
  else digitalWrite(grueneLED, LOW);

  if (blau > 100)
  {
    digitalWrite(blaueLED, HIGH);
    Serial.println("blauer Streifen");
  }
  else digitalWrite(blaueLED, LOW);

  delay(500);
}
Calificar la guía

Comentarios

Haz una pregunta o comparte tu experiencia

Schreib uns, wenn etwas nicht funktioniert. Nenne dabei dein Board und die Fehlermeldung.

Revisamos cada comentario antes de publicarlo. Tu dirección de correo electrónico permanece con nosotros.