Arduino-Farbsensor-Prototyp – Objektfarben erkennen & anzeigen
Komponenten und Materialien
| Komponente | Anzahl | Hinweis |
|---|---|---|
| Arduino UNO | 1 | |
| RGB Diffused Common Anode | 1 | Common Cathode oder Anode – nutzt was ihr habt |
| Fotowiderstand (LDR / CdS Cell) | 1 | |
| Adafruit Standard LCD 16×2 Weiß auf Blau | 1 | Alles, was mit LiquidCrystal-Library funktioniert |
| Widerstand 10 kOhm | 2 | Für Taster & CdS-Zelle |
| Widerstand 100 Ohm | 3 | 150 Ohm für Rot, 2×100 Ohm für Grün/Blau der RGB-LED |
| SparkFun Taster 12 mm | 1 | |
| Jumper-Kabel (Standard) | 1 | |
| Steckbrett (Standard) | 1 |
Apps und Onlinedienste
- MLP Topology Workbench – Tool zum Neutrainieren neuronaler Netze für Neurona-Library auf Arduino.
Über dieses Projekt
Dies ist eine vereinfachte Version des vollständigen Artikels, damit der Nachbau leicht gelingt. Details im Blog. Rechts im Menü die Abschnitte, oder Code auf GitHub herunterladen. Erst Video anschauen, um zu sehen, worum es geht! :)
Projektüberblick
Ähnlich dem menschlichen Farbsehen und lichtbasiert umfasst das RGB-Modell über 16 Millionen Farben, angeordnet in einem 3D-Raum, wo ganzzahlige R-, G-, B-Werte (0–255) Koordinaten bilden. Farberkennung erfolgt mit lichtbezogenen Bauteilen und Machine Learning: Kombination aus RGB-LED und CdS-Zelle (Lichtsensor/LDR), beide vom Umgebungslicht isoliert. LED strahlt nacheinander Rot, Grün, Blau aus, CdS-Zelle misst reflektierte Intensität – so entsteht ein RGB-Muster des Objekts.
Multi-Layer Perceptron (MLP)
MLP ist eine Feedforward-Architektur künstlicher neuronaler Netze: Eingabelayer (nicht-neural), Hidden Layer(s), Ausgabelayer. Training per Backpropagation (überwachtes Lernen).

Für diesen Farbsensor: Netzwerk erhält 3 Eingänge (RGB), einen Hidden Layer mit 6 Neuronen und Ausgabelayer mit 10 Neuronen (10 Farben = 10 Klassen, binärer Output). Netz ist bereits trainiert und erkennt Farben. Trainingsdetails & Datensatz im Blog.
Farberkennung
Trainiertes MLP klassifiziert räumlich trennbare Muster – ideal hier. Beim Training bildet das Netz Hyperplanes im RGB-Raum (siehe Abb.), jede isolierte Region = eine Farbe. Neues RGB-Muster (3D-Punkt) fällt in Region → Klassenentscheidung.


Für gute Generalisierung muss Trainingsset (Farb-Beispiele mit Soll-Output aus dem 3D-Raum) präsentiert werden. Datensatz auf GitHub. Wer selbst trainieren will: Playground im Blog nutzen. Sonst zu Implementierungsdetails springen.
Generalisierung gilt nur im Domain-Bereich des Trainingsets – Min/Max-Werte jedes Farbkanals beachten! Muster außerhalb → unvorhersehbare Ausgabe.

Datensatz: 75 Instanzen, Werte 0–1 (ursprünglich 0–255, durch 255 geteilt). Wichtig: Nur ein Output-Neuron = 1, Rest = 0. Trainiertes Netz liefert Floats → Post-Processing:

Praktisch: Neuron mit größtem Output → 1, Rest → 0.
Elektronische Schaltung
Detektion passiert in der Schaltung, berechnet auf Atmega328 (Arduino). Verdrahtung siehe Schaltplan.


Code nutzt Common Anode RGB-LED. Prüfen, ob eure LED auch Common Anode ist, sonst Logik im Code invertieren!
Wichtig: Ich nutze nur einen Vorwiderstand an der Common Anode (Mittelwert der eigentlichen Kathoden-Widerstände) – „faul“, aber Muster werden nicht verzerrt, nur Farbwerte verschoben. Besser: korrekte Widerstände an jeder Kathode für Farbtreue.
RGB-LED und CdS-Zelle liegen benachbart – müssen vom Umgebungslicht isoliert sein (alter Schwarzfilm-Dosen ideal). Kalibrierung (s. Programmierung) und Erkennung brauchen das. Video anschauen für Isolierung!
Farbtheorie
Keine Linsen → nur undurchsichtige, matte Objekte nutzen, Spiegelung (Glanz) vermeiden. Diffuse Reflexion ist Schlüssel.
Licht (bestimmte Farbe) trifft Objekt → Reflexion laut Farbzusammensetzung. Rotlicht auf Gelb → stark reflektiert (Gelb = Rot+Grün). Blaulicht auf Gelb → schwach reflektiert (wenig Blau).

Additives Farbsystem: Weiß = alle Farben, Schwarz = keine. CdS-Zelle misst Max/Min-Reflexion je LED-Farbe → Kalibrierung möglich. Goldener Tipp: Nach Kalibrierung Komponenten (besonders auf Steckbrett) und Isolierstück NICHT mehr bewegen/berühren – sonst Drift/Outlier.
Programmierung
Kalibrierung & Erkennung: 3 Iterationen pro Messung (Rot, Grün, Blau). Je Iteration: LED-Farbe an, auf CdS-Stabilisierung warten, Analogwert lesen, Reflexion speichern. Farbtheorie-Bild visualisiert den Prozess.
Kalibrierung: Iterationsprozess 2× – einmal für Schwarz, einmal für Weiß. Erfasst Min/Max-Reflexion (nah 0 bis nah 1024) → Reskalierung auf [0,255] (Info) und [0,1] (Netzwerk-Input).
Wartezeit für Lichtsensor-Stabilisierung variiert pro Bauteil → großzügigen Delay wählen (ich: 500 ms), dann reduzieren bis Grenze instabilen Verhaltens.
Erkennung: Gemessene RGB (0–1) → MLP → Farberkennung. MLP auf Arduino via Neurona – Library von mir für ANNs auf Arduino, per Library Manager installierbar. Details im Blogpost.
Netz ist vortrainiert, Gewichte in Code eingebettet – Neurona macht es sofort betriebsbereit.
Tests
Einige Farben aus Datensatz zum Test extrahiert:

Zahlen außerhalb = IDs, innen = Fehlklassifikationen (welche Farbe stattdessen erkannt). Auf Normalpapier (Tintenstrahl) gedruckt – opakes Material, gut für Erkennung. Video zeigt Papierquadrate.
Code
Farbsensor-Prototyp
Code im Ordner colorSensor. Schaltung laut Schaltplan aufbauen, Neurona-Library installieren (Library Manager).
https://github.com/moretticb/ColorSensor/
Schaltpläne
Taster gemäß LCD-Anweisung nutzen

Herstellungsprozess
- Widerstand-Farbcodes – Umfassender Leitfaden zum Dekodieren von Wert, Toleranz und E-Reihen-Standards
- Smart Thirst Alert: DIY Pflanzen-Alarm für optimale Bewässerung
- Italienische Word Clock mit Arduino Nano, NeoPixel, LCD & RTC
- Einfachen Hindernissensor mit Arduino bauen – IR-LED & Photodiode Tutorial
- Zuverlässiger Sigfox-kWh-Zähler mit Arduino MKR Fox 1200
- Bluetooth-Temperaturmonitor mit Arduino Nano
- Berührungsloses Gesten-Schloss: Sicherer Zugang mit APDS-9960 & Arduino
- Arduino Nano Begleiter-Set – Essentielle Bauteile & Werkzeuge für DIY-Elektronik
- Isolierter Analogeingang für Arduino: Spannung/Strom galvanisch trennen
- Präziser Reaktionszeit-Test mit Arduino UNO