
Mit dem Farbsensor TCS34725 und einem Arduino lässt sich sehr einfach die Farbe von Gegenständen ermitteln. Den Sensor erhält man auf Amazon um ca. 7 Euro.

Auf diesem ist eine weiße LED und mehrere Photodioden mit Bandpass-Farbfiltern untergebracht. Der Sensor liefert Intensitäten der für rotes, grünes und blaues Licht sensiblen Photodioden bzw. einer Photodiode ohne Filter. Mit diesen Werten lässt sich dann bestimmen, welchen färbigen Gegenstand man vor den Sensor hält.
Mein Programm ist an diese Seite hier angelehnt: https://www.makerblog.at/2015/01/farben-erkennen-mit-dem-rgb-sensor-tcs34725-und-dem-arduino/
Der simple Schaltplan:





Testen kann man den Farbsensor zum Beispiel mit bunten Süßigkeiten. Die Farben Rot, Grün und Blau erkennt er relativ sicher, bei Orange und Gelb tut er sich aber schwer. Zu eng liegen da die RGB-Werte der unterschiedlichen Farben beisammen. Da bedarf es wohl noch etwas Feinabstimmung bei der Software…












Hier noch das Youtube-Video:
Arduino-Code:
// Libraries einbinden
#include "Wire.h"
#include "Adafruit_TCS34725.h"
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display. ACHTUNG: Adresse kann auch 0x3F sein !!!
// Anschlüsse:
// GND - GND
// VCC - 5V
// SDA - ANALOG Pin 4
// SCL - ANALOG pin 5
// 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 =========
// ===========================
// setup() wird einmal beim Start des Arduino ausgeführt
void setup()
{
// Serielle Kommunikation zur Ausgabe der Wert im seriellen Monitor
Serial.begin(9600);
lcd.begin(); // initialize the lcd
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Farbsensor");
lcd.setCursor(0,1);
lcd.print("Version 1.0");
delay(3000);
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(" ");
// Ü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!
}
}
// ===========================
// ======= LOOP =========
// ===========================
// 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 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
// relative Farbanteile
// alle Werte ergeben in Summe 1
r = 1.0 * red / (red + green + blue);
g = 1.0 * green / (red + green + blue);
b = 1.0 * blue / (red + green + blue);
// Clear-Wert und r,g,b seriell ausgeben zur Kontrolle
Serial.print("\tClear:");
Serial.print(clearcol);
Serial.print("\tRed:");
Serial.print(r);
Serial.print("\tGreen:");
Serial.print(g);
Serial.print("\tBlue:");
Serial.print(b);
if ((r > 0.5) && (g < 0.25) && (b < 0.25))
{
Serial.print("\tROT");
lcd.setCursor(0,0);
lcd.print(r,2);
lcd.print(" ");
lcd.print(g,2);
lcd.print(" ");
lcd.print(b,2);
lcd.setCursor(0,1);
lcd.print("ROT ");
}
else if ((r < 0.35) && (g > 0.45) && (b < 0.3))
{
Serial.print("\tGRUEN");
lcd.setCursor(0,0);
lcd.print(r,2);
lcd.print(" ");
lcd.print(g,2);
lcd.print(" ");
lcd.print(b,2);
lcd.setCursor(0,1);
lcd.print("GRUEN ");
}
else if ((r < 0.2) && (g < 0.35) && (b > 0.5))
{
Serial.print("\tBLAU");
lcd.setCursor(0,0);
lcd.print(r,2);
lcd.print(" ");
lcd.print(g,2);
lcd.print(" ");
lcd.print(b,2);
lcd.setCursor(0,1);
lcd.print("BLAU ");
}
// Gelb und Orange sind etwas tricky, aber nach etwas
// Herumprobieren haben sich bei mir diese Werte als
// gut erwiesen
else if ((r > 0.35) && (g > 0.4) && (b < 0.2))
{
Serial.print("\tGELB");
lcd.setCursor(0,0);
lcd.print(r,2);
lcd.print(" ");
lcd.print(g,2);
lcd.print(" ");
lcd.print(b,2);
lcd.setCursor(0,1);
lcd.print("GELB ");
}
else if ((r > 0.4) && (g > 0.22) && (b < 0.2))
{
Serial.print("\tORANGE");
lcd.setCursor(0,0);
lcd.print(r,2);
lcd.print(" ");
lcd.print(g,2);
lcd.print(" ");
lcd.print(b,2);
lcd.setCursor(0,1);
lcd.print("ORANGE ");
}
// Wenn keine Regel greift, dann ehrlich sein
else
{
Serial.print("\tNICHT ERKANNT");
lcd.setCursor(0,0);
lcd.print(r,2);
lcd.print(" ");
lcd.print(g,2);
lcd.print(" ");
lcd.print(b,2);
lcd.setCursor(0,1);
lcd.print("NICHT ERKANNT ");
}
// Zeilenwechsel ausgeben
Serial.println("");
// Wartezeit anpassen für serielles Debugging
delay(100);
}
