Das RGB Sensor Modul von Adafruit ist mit dem TCS34725 Farbsensor ausgestattet und ermöglicht die einfache Bestimmung von RGB-Farbwerten eines Objektes – z.B. wie in diesem Projekt eines m&m (Skittles oder Smarties gehen aber auch :)

Der TCS34725 wird von der ams AG in der Steiermark entwickelt, einem der führenden Sensor-Hersteller weltweit. Adafruit hat den Sensor um einen 3.3V-Regulator und eine LED erweitert.

Verfügbar ist das Modul z.B. hier bei Amazon.de.

Das Modul benötigt neben der Stromversorgung nur den Anschluss an die beiden I2C Pins des Arduino (a4 und A5 beim UNO R3). Eine detaillierte Anleitung gibt es bei Adafruit, die TCS34725-Library zur Kommunikation mit dem Sensor auf Github.

Hier das Video mit Erklärung des Aufbaus und des Arduino Sketch:

Ich habe versucht den Arduino Sketch so gut wie möglich zu dokumentieren. Bitte beachtet, dass die gemessenen RGB-Werte auch vom Raumlicht etc. beeinflusst sein können. Diese Werte auch die Schwellenwerte zur Farbbestimmung müsst ihr eventuell an die eigenen Gegebenheiten anpassen. Fragen bitte einfach in die Kommentare posten.

Der Arduino Sketch zum Projekt:

// Libraries einbinden
#include "Servo.h"
#include "Wire.h"
#include "Adafruit_TCS34725.h"
 
// Servo-Positionen in Grad für Farben, bitte anpassen
const int redPos = 160;
const int orangePos = 130;
const int yellowPos = 100;
const int greenPos = 70;
const int bluePos = 30;
const int nonePos = 0; // Kein Objekt erkannt
 
// Servo-Objekt initialisieren
Servo myservo;
 
// Color Sensor-Objekt initialisieren
// Parameter siehe: https://learn.adafruit.com/adafruit-color-sensors/program-it
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_1X);
 
// setup() wird einmal beim Start des Arduino ausgeführt
void setup() {
 
 // Serielle Kommunikation zur Ausgabe der Wert im seriellen Monitor
 Serial.begin(9600);
 Serial.println("Makerblog.at - MuMs Color Sensor");
 
 // Überprüfen, ob Color Sensor sich auch zurückmeldet
 if (tcs.begin()) {
 // Alles OK
 Serial.println("Sensor gefunden");
 } else {
 // Kein Sensor gefunden. Programm an dieser Stelle einfrieren
 Serial.println("TCS34725 nicht gefunden ... Ablauf gestoppt!");
 while (1); // Halt!
 } 
 
 // Der Servo hängt am PWM-Pin 3 
 myservo.attach(3);
 // Servo in Grundstellung fahren
 myservo.write(0);
 delay(1000);
 
}
 
// loop() wird wiederholt, solange der Arduino läuft
void loop() {
 
 // Der Sensor liefert Werte für R, G, B und einen Clear-Wert zurück
 uint16_t clearcol, red, green, blue;
 float average, r, g, b;
 delay(100); // Farbmessung dauert c. 50ms 
 tcs.getRawData(&red, &green, &blue, &clearcol);
 
 // Mein Versuch einer Farbbestimmung für 
 // die 5 M&M-Farben Rot, Grün, Blau, Orange und Gelb
 
 // Durchschnitt von RGB ermitteln
 average = (red+green+blue)/3;
 // Farbwerte durch Durchschnitt, 
 // alle Werte bewegen sich jetzt rund um 1 
 r = red/average;
 g = green/average;
 b = blue/average;
 
 // Clear-Wert und r,g,b seriell ausgeben zur Kontrolle
 // r,g und b sollten sich ca. zwischen 0,5 und 1,5 
 // bewegen. Sieht der Sensor rot, dann sollte r deutlich über 1.0
 // liegen, g und b zwischen 0.5 und 1.0 usw.
 Serial.print("\tClear:"); Serial.print(clearcol);
 Serial.print("\tRed:"); Serial.print(r);
 Serial.print("\tGreen:"); Serial.print(g);
 Serial.print("\tBlue:"); Serial.print(b);
 
 // Versuch der Farbfeststellung anhand der r,g,b-Werte.
 // Am besten mit Rot, Grün, Blau anfangen die die Schwellenwerte
 // mit der seriellen Ausgabe entsprechend anpassen
 if ((r > 1.4) && (g < 0.9) && (b < 0.9)) {
 Serial.print("\tROT");
 myservo.write(redPos);
 }
 else if ((r < 0.95) && (g > 1.4) && (b < 0.9)) {
 Serial.print("\tGRUEN");
 myservo.write(greenPos);
 }
 else if ((r < 0.8) && (g < 1.2) && (b > 1.2)) {
 Serial.print("\tBLAU");
 myservo.write(bluePos);
 }
 // Gelb und Orange sind etwas tricky, aber nach etwas
 // Herumprobieren haben sich bei mir diese Werte als
 // gut erwiesen
 else if ((r > 1.15) && (g > 1.15) && (b < 0.7)) {
 Serial.print("\tGELB");
 myservo.write(yellowPos);
 }
 else if ((r > 1.4) && (g < 1.0) && (b < 0.7)) {
 Serial.print("\tORANGE");
 myservo.write(orangePos);
 } 
 // Wenn keine Regel greift, dann ehrlich sein
 else {
 Serial.print("\tNICHT ERKANNT"); 
 // myservo.write(nonePos);
 }
 
 
 // Zeilenwechsel ausgeben
 Serial.println("");
 
 // Wartezeit anpassen für serielles Debugging
 delay(100);
 
}

Diese Methode der Farbbestimmung ist etwas „patschert“, auf die Schnelle ist mir aber keine bessere eingefallen und für lediglich 5 Farben funktioniert es auch ganz gut.

Das Bild mit den im Projekt verwendeten Farbfeldern könnt ihr hier downloaden. Einfach in vernünftiger Größe ausdrucken und ausschneiden.

[Update] Auf der Website des Sensor-Herstellers habe ich mittlerweile ein Paper gefunden, das eine Umwandlung der RGB-Werte in einen HSL-Wert vorschlägt. HSL-Werte sind leichter in eine gängige Farbbezeichnung umzusetzen als RGB-Farbkombinationen. Im Artikel gibt es auch etwas BASIC Sourcecode für die Umrechnung, vielleicht will den ja jemand für den Arduino umsetzen.

11 thoughts on “Farben erkennen mit dem RGB Sensor TCS34725 und dem Arduino

  • Pingback: Planung für 2015 – eure Meinung ist gefragt! | Makerblog.at

  • 1. März 2015 um 12:15
    Permalink

    Hallo Adi Dax,

    sehr schöner Beitrag und gutes Video dazu!
    Ich habe im Moment ein ähnliches Projekt hier liegen.

    Dabei muss ich verschiedene Servos ansteuern, je nachdem welche Farbe vom Sensor erkannt wurde. Die Einbindung des Adafruit Sensors funktioniert ja wirklich leicht. Ich hatte mich im Voraus nicht genug erkundigt und hab einen Sensor von Atlas Scientific gewählt (https://www.sparkfun.com/products/11195). Damit komme ich leider gar nicht klar.
    Eventuell Erfahrungen mit diesem Sensor?

    Viele Grüße
    Marc

    Antworten
  • 23. September 2015 um 14:18
    Permalink

    Hallo,
    diesen Blog habe ich als Anregung für ein eigenes Projekt benutzt. Mit dem RGB-Farbschieber eines Grafikprogrammes 24 Farben gemischt und auf Fotopapier ausgedruckt. Diese Proben mit dem Sensor gemessen. Für die Farberkennung wird im Programm R/B und R/G verwendet.
    Über die virtuelle COM-Schnittstelle werden die RGB-Werte (RGB-Werte des Grafikprogrammes bei der Probenerstellung) zum PC übergeben. Mit einem in Processing erstellten Programm erfolgt die RGB-Ausgabe als farbige Fläche und Text.

    Antworten
  • 18. Juli 2016 um 14:36
    Permalink

    Hallo
    kann man mit dem farbsensor nur Rot grün Blau und Gelb detektieren oder ginge zb auch Rosa oder Braun wenn Ja
    Wie bekomme ich die RGB Werte mit dem Seriellen Monitor funktioniert das nicht so
    MFG Alfons

    Antworten
  • 7. Juni 2017 um 1:34
    Permalink

    wenn ein LCD-Bildschirm hinzufügen, die ihre Verbindungen und Programmierung wären?

    Antworten
  • 9. Juni 2017 um 13:28
    Permalink

    Hallo,

    ich bin neu in diesem Gebiet und fand dein Video sehr interessant, deshalb hab ich mir ein Arduino Uno und den Farbsensor gekauft. Mein Problem ist, der Sensor wird nicht erkannt, egal ob mit dem Sketch oder ein Beispiel Sketch. Woran kann es liegen?

    Bei deinem Aufbau hab ich nur den Sensor angschlossen und beim Sketch die Servo Funktionen auskommentiert.

    Ich hoffe du kannst mir helfen, ich komme seit einer Woche nicht weiter.

    LG Tuan

    Antworten
    • 13. Juni 2017 um 11:40
      Permalink

      Hallo Tuan, mail mir mal ein (möglichst gutes) Foto vom Aufbau deines Projekts und den Arduino SKetch in deiner Version. Das kriegen wir schon hin.

      Antworten
      • 29. Juni 2017 um 14:19
        Permalink

        Hallo,

        mein Problem hat sich erledigt, trotzdem danke. Eine andere Frage, wie groß ist den die Reichweite des Sensors? Im Datasheet steht es nicht genau erklärt oder ich verstehe es einfach nicht. Hoffe du kannst mir helfen, danke!

        LG Tuan

        Antworten
        • 22. August 2018 um 9:54
          Permalink

          Nach 5 mm steigt die Fehlerkennungsrate, auch mit ultra-mattem Abschirmungsrohr.

          Antworten
  • 25. Oktober 2018 um 9:31
    Permalink

    Hello, I’m doing on a project that use TCS34725 to recognize colors. I accidentally saw your video on Youtube, and it’s very nice, thanks for making this awesome video. But I’m struggling with detecting orange, I made a range of color measurement but it works with red, blue, yellow and soft green, if dark green, it can not be detected. and orange, it’s impossible. Can you help me?
    Thanks.
    ah, let me show you my code, and hope you can give me an Advice.

    Antworten
  • 25. Oktober 2018 um 13:42
    Permalink

    Hallo,
    plane noch den „Einstieg“. Möchte aber vorher schon wissen, ob sich die Abtastfläche des Farbsensors (evtl. mit einer Linse) focussieren lässt. Ich würde kleine farbige Flächen von ca. 3x3mm Größe abtasten wollen…
    Grüße und danke
    E.K.

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload the CAPTCHA.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.