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:

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

}
Code-Sprache: Arduino (arduino)

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.

15 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 at 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

    Reply
  • 23. September 2015 at 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.

    Reply
  • 18. Juli 2016 at 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

    Reply
  • 7. Juni 2017 at 1:34
    Permalink

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

    Reply
  • 9. Juni 2017 at 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

    Reply
    • 13. Juni 2017 at 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.

      Reply
      • 29. Juni 2017 at 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

        Reply
        • 22. August 2018 at 9:54
          Permalink

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

          Reply
  • 25. Oktober 2018 at 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.

    Reply
  • 25. Oktober 2018 at 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.

    Reply
  • 28. Dezember 2019 at 12:15
    Permalink

    Hallo,
    danke für das ausführliche Video. Was ich daraus aber nicht entnehmen konnte: für was kann man das in der Praxis einsetzen (außer dass man die RGB-Werte erhält)?

    LG
    Willi

    Reply
    • 15. Mai 2021 at 9:40
      Permalink

      Moin! Sei kreativ :-)! Also ich bau damit gerade ein fahrerloses Transportsystem (FTS/AGV) und nutze die Farben um dem System einfache Task geben zu können. Stop…/Entladen…/Weiter…/Links…/Rechts…/ usw. Funktioniert auch schon recht gut allerdings kommt jetzt noch der Übertrag in die Praxis :-)! Viele Grüße aus Stuttgart ! Andreas

      Reply
  • 24. Februar 2021 at 14:26
    Permalink

    Mein Sensor wird scheinbar nicht gefunden bzw ich bekomme andauernd die selben Werte dh. R3.00 G3.00 B3.00 ich vermute dass der Sensor nicht gefunden wird oder nicht startet kann mir jemand eventuell helfen oder mir sagen was ich falsch mache?
    Außerdem bin ich mir unsicher ob ich die Pins noch Ansteuer muss im Setup siehe Code.
    Danke im Voraus.
    Mein Code folgt:

    #include „Adafruit_TCS34725.h“
    #include „Wire.h“
    Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_1X);

    void setup() {
    //pinMode(A4,INPUT);
    //pinMode(A5,INPUT);
    Serial.begin(9600);
    Serial.println(„Makerblog.at – MuMs Color Sensor“);
    if (tcs.begin()) {
    Serial.println(„Sensor gefunden“);
    }

    }
    void loop() {
    uint16_t clear, red, green, blue;
    float average, r, g, b;
    delay(100);
    tcs.getRawData(&red, &green, &blue, &clear);
    average = (red+green+blue)/3;
    r = red/average;
    g = green/average;
    b = blue/average;
    Serial.print(„\tClear:“); Serial.print(clear);
    Serial.print(„\tRed:“); Serial.print(r);
    Serial.print(„\tGreen:“); Serial.print(g);
    Serial.print(„\tBlue:“); Serial.print(b);

    }

    Reply
  • 25. Mai 2022 at 18:43
    Permalink

    Was bedeutet der clear_Wert? Ist das Helligkeit?

    Reply

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.