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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 |
// 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); } |