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.
Pingback: Planung für 2015 – eure Meinung ist gefragt! | Makerblog.at
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
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.
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
wenn ein LCD-Bildschirm hinzufügen, die ihre Verbindungen und Programmierung wären?
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
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.
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
Nach 5 mm steigt die Fehlerkennungsrate, auch mit ultra-mattem Abschirmungsrohr.
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.
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.
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
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
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);
}
Was bedeutet der clear_Wert? Ist das Helligkeit?