Arduino Kleurensensor Prototype - Objectkleurnamen Identificeren en Weergeven
Onderdelen en benodigdheden
| Onderdeel | Aantal |
|---|---|
| Arduino UNO | 1 |
| RGB Diffused Common Anode | 1 |
| Fotoweerstand (LDR/CdS Cel) | 1 |
| Adafruit Standaard LCD - 16x2 Wit op Blauw | 1 |
| Weerstand 10k ohm | 2 |
| Weerstand 100 ohm | 3 |
| SparkFun Drukknop 12mm | 1 |
| Draadbruggen (standaard) | 1 |
| Breadboard (standaard) | 1 |
Apps en online diensten
- MLP Topology Workbench - Tool gebruikt om neurale netwerken te herleren voor gebruik met Neurona-bibliotheek in Arduino.
Over dit project
Dit is een vereenvoudigde versie van het volledige artikel, voor de eenvoud, zodat de reproductie van dit project gemakkelijk kan worden gedaan. Check ook dit project op mijn blog voor meer implementatiedetails.
Dit artikel is verdeeld in de secties die in het rechtermenu staan. Als je naar technische details wilt springen, check de inhoudsopgave rechts, of download de code op de GitHub-repository. Voordat je verder leest, check de projectvideo om te zien waar dit project echt over gaat :)
Projectoverzicht
Vergelijkbaar met het kleurenzievermog van het menselijk oog, en ook gebaseerd op licht, omvat het RGB-model meer dan 16 miljoen kleuren, die gerangschikt zijn in een 3D-ruimte, waar gehele waarden van componenten R (Rood), G (Groen) en B (Blauw), variërend van 0 tot 255, coördinaten van deze ruimte vormen. Vanaf dit model werden kleurdetectie en -herkenning uitgevoerd met lichtgerelateerde elektronische componenten en machine learning mechanismen; het is essentieel de combinatie van een RGB-led en een CdS-cel (lichtsensor of LDR), beide . Deze componenten emitteren en voelen respectievelijk de intensiteit van elk licht (rood, groen en blauw) dat gereflecteerd werd van een object van een bepaalde kleur.
Multi-Layer Perceptron
Multi-Layer Perceptron (MLP) is een feedforward-architectuur van Kunstmatige Neurale Netwerken, met een input (niet-neurale) laag, verborgen lagen en een output-laag. Dit netwerk wordt getraind door het backpropagation-algoritme, wat supervised learning (leren door voorbeelden) uitvoert.
Voor deze kleurensensor ontvangt het neurale netwerk hierboven 3 inputs (RGB-waarden), heeft één verborgen laag met 6 neuronen en een output-laag met 10 neuronen - ter herinnering: de output-laag moet hetzelfde aantal klassen hebben (kleuren, in dit geval), voor een gebinariseerde output. Voor deze tutorial is het netwerk al getraind en in staat om kleuren te herkennen :). Meer details over trainingsstappen en de voorbeeld-dataset die ervoor gebruikt is, check de volledige post op mijn blog.
Kleurherkenning
Deze taak kan uitgevoerd worden met ons getrainde MLP-netwerk. Het stelt classificatie en herkenning van ruimtelijk scheidbare patronen toe - heel nuttig in dit geval. Tijdens de trainingsstap heeft het netwerk regio's in de RGB-kleurruimte afgebild, zoals geïllustreerd hieronder, zodat elke regio geïsoleerd door hypervlakken een kleur vertegenwoordigt. Daarom valt elk nieuw RGB-kleurpatroon (voorgesteld als een 3D-punt) in een bepaalde regio, en wordt geclassificeerd als de respectieve kleur.
Met het doel om generalisatie met een MLP te verkrijgen voor een goede herkenning van RGB-patronen, moet een trainingset (voorbeelden van kleuren met de gewenste output uit de 3D-ruimte hierboven) aan het netwerk worden gepresenteerd voor de trainingsstap. De trainingset die in dit project gebruikt is, is beschikbaar in de GitHub-repository van het project. Als je geïnteresseerd bent in neurale netwerken, lees dan deze sectie verder en check deze Playground die ik ontwikkelde, zodat je de dataset kunt gebruiken om het netwerk zelf te trainen en in de code te gebruiken :). Anders, ga door naar Implementatiedetails.
Generalisatie zal plaatsvinden in het domein dat de trainingset omvat, dus het is de moeite waard om aandacht te besteden aan de min- en max-waarden van elke component van de ruimte! Voer het netwerk niet met patronen buiten dit domein, anders is de output niet verwacht correct te werken.
De dataset (alle voorbeelden) bevat 75 instanties van kleurpatronen variërend van 0 tot 1. Initieel variërend van 0 tot 255, werden deze instanties hergerekend door simpelweg elke waarde door 255 te delen, zodat 0 ≤ x1, x2, x3 ≤ 1. Zoals te zien is in de dataset, is het belangrijk op te merken dat alleen één neuron in de output-laag 1 moet uitvoeren, terwijl de overige nul moeten uitvoeren. Omdat een getraind netwerk float-waarden uitvoert, vindt post-processing plaats als volgt:
waarbij yi de output is van de i-de neuron en max(y) de grootste outputwaarde is. In praktische termen geeft de neuron met de grootste output 1 als output en de overige 0. Simpelweg.
Elektronische Schakeling
Ontstaan uit objecten, vindt de gehele detectieprocedure plaats in de elektronische schakeling, die computationele activiteit omvat die draait op een Atmega328, aangesloten op Arduino-borden. Check de bedrading uit de schema's hieronder.
De code volgt het bovenstaande schema dat een common anode RGB-led gebruikt. Dat gezegd hebbende, check of je RGB-led ook een common anode is, anders keur gewoon de logica in de code om.
Een ander belangrijk detail is dat ik maar één weerstand met de RGB-led gebruik. Omdat er één kleur tegelijk aanstaat, plaatste ik de weerstand in de common anode, met een gemiddelde weerstand van de weerstanden die hadden moeten zitten bij de kathodes - het is lui, ik weet het en ik ben sorry! Toen ik projectonderdelen kocht, hadden ze niet alles wat ik nodig had - maar het is wel heel belangrijk om de juiste weerstanden met de kathodes te gebruiken om de geloofwaardigheid van de verzamelde RGB-waarden ten opzichte van RGB-waarden in de computer te garanderen. De manier hoe ik het deed is niet zo slecht, omdat de patronen niet vervormd zijn; ze zijn gewoon niet dezelfde kleuren die we op een computerscherm zien (en als een menselijk oog ziet).
Uit de schema's is de nabijheid tussen de RGB-led en de CdS-cel te zien. Dat is omdat ze geïsoleerd moeten zijn van omgevingslicht (een oude zwarte filmrol is het perfecte stukje), zodat kalibratie (uitgelegd in Programmeren) en herkenning uitgevoerd kunnen worden. Check de projectvideo om dergelijke componenten geïsoleerd van omgevingslicht te zien.
Kleurtheorie
Kleurperceptie uitgevoerd door de elektronische schakeling is gebaseerd op kleurtheorie-concepten. Omdat er geen lenzen (nog) betrokken zijn, moeten alleen objecten met ondoorzichtige (en matte) materialen overwogen worden, om te vermijden om te maken met spiegelende reflectie van de led. Diffuse reflectie aan de andere kant is de sleutel om kleurdetectie met licht uit te voeren. Van een invalsend licht, wordt het gereflecteerd in oneffen oppervlakken, niet creërend dat gloedende effect dat de functie van de CdS-cel bederft.
Terug naar de daadwerkelijke kleurtheorie, wanneer licht (van een bepaalde kleur) een object bereikt, wordt het gereflecteerd volgens eigenschappen van die objectkleur. Bijvoorbeeld, rood licht dat een geel object bereikt, wordt gereflecteerd volgens hoeveel rood er in de samenstelling van die gele kleur zit - onthoud, we praten over licht! - dus wordt verwacht dat veel rood licht gereflecteerd wordt, wat zinvol is als we denken aan de RGB-samenstelling van geel (essentieel rood en groen). Echter, wanneer blauw licht het gele object bereikt, wordt geen sterke reflectie verwacht door de lage aanwezigheid van blauw in de kleursamenstelling.
Overwegend een additief kleurensysteem, waarin wit en zwart respectievelijk aan- en afwezigheid van alle kleuren zijn (meer details hier), kunnen maximale en minimale reflecties van elk licht van de RGB-led die gekleurde objecten bereiken, gemeten worden (met de CdS-cel). Dat gezegd hebbende, is het mogelijk om de kalibratie in de elektronische componenten van de schakeling uit te voeren. Dit is een andere sleutel om geloofwaardigheid in detectie te krijgen, evenals om een stabiele detectie van patronen te garanderen (uitwijkers vermijden) - hier is een gouden tip: na het kalibreren, probeer (hard!) om noch de elektronische componenten (vooral wanneer ze op een breadboard staan), noch het stukje dat je gebruikt (je moet gebruiken) om componenten te isoleren van omgevingslicht, te bewegen of aan te raken.
US_plugins_acrobat_en_motion_education_colorTheory.pdfProgrammeren
Voor kalibratie en herkenning voert de kleurensensor drie iteraties uit, zodra een gekleurd object blootgesteld wordt aan de RGB-led en de CdS-cel. In de eerste iteratie raakt rood licht het object en wacht het programma tot de CdS-cel zijn meting stabiliseert; de analoge input wordt dan ingelezen en de reflectie van het rode licht wordt opgeslagen. Het programma herhaalt dit twee keer meer voor groen en blauw. De afbeelding in Kleurtheorie geeft een goede visuele uitleg van dit iteratieve proces.
Wat kalibratie betreft, wordt het bovengenoemde iteratieve proces tweemaal uitgevoerd: één keer voor zwarte kleur en één keer voor witte kleur. Zoals uitgelegd in Kleurtheorie, is dit voor de detectie van maximum en minimum - initieel van bijna nul tot bijna 1024, volgens de leesresolutie - reflecties van rood, groen en blauw licht, om een echte bereik te verkrijgen om correct te schalen naar intervallen [0, 255] (voor informatieve doeleinden) en [0, 1] (de daadwerkelijke input om het neurale netwerk te voeden).
De wachttijd om de meting van de lichtsensor te stabiliseren kan variëren per elektronisch component, dus het is goed om een goede vertraging te geven om een stabiele sensing te garanderen. In mijn geval gaf ik een vertraging van 500 milliseconden, maar het is de moeite waard om initieel een grotere waarde te gebruiken en deze dan te verminderen tot aan de grens van een niet-stabiel gedrag.
Bij detectie voeden de verzamelde RGB-waarden - variërend van 0 tot 1 - een MLP, wat de daadwerkelijke kleurherkenning uitvoert. Voor de MLP die op Arduino draait, gebruik ik Neurona - een bibliotheek die ik schreef om eenvoudig ANNs in Arduino te gebruiken, die geïnstalleerd kan worden vanuit Arduino IDE met de Library Manager. Check ook deze post voor meer details.
Zoals eerder vermeld, is het netwerk al getraind en klaar voor detectie in de projectcode. Het werd getraind met de Playground die ik ontwikkelde, waarbij de aangepaste gewichten in de code zijn ingesloten, zodat de Neurona-bibliotheek het netwerk klaarmaakt om te opereren.
Tests
Voor informatieve doeleinden werden enkele kleuren uit de dataset geëxtraheerd om herkenningstests uit te voeren:
Getallen buiten de figuur worden gebruikt voor identificatie en getallen binnen de figuur duiden op misclassificaties, refererend naar welke kleuren ervoor klassificeerd werden. Deze kleuren werden geprint op sulfietpapier met een inkjetprinter - check de kleine papiervierkantjes in de video aan het begin van deze post - dus de objecten bestaan uit ondoorzichtig materiaal, geschikt voor kleurdetectie.
Code
Kleurensensor prototype
De code om naar Arduino te sturen zit in de colorSensor-map. Zorg ervoor dat je elektronische schakeling is gebouwd volgens de gepresenteerde schema's en dat de Neurona-bibliotheek correct geïnstalleerd is (je kunt installeren via Arduino Library Manager).
https://github.com/moretticb/ColorSensor/
Schema's
Gebruik de drukknop volgens instructies op het LCD-display
Productieproces
- Slimme Plantenalarmer – DIY Sensor voor Optimale Hydratatie
- Bouw een Italiaanse Woordklok met Arduino Nano, NeoPixel, LCD en RTC
- Een eenvoudige obstakelsensor bouwen met Arduino – IR LED & Fotodiodo Tutorial
- Bouw een Betrouwbare Sigfox kWh Meter met Arduino MKR Fox 1200
- Bluetooth Temperatuurmeter met Arduino Nano
- Contactloos Gebaarslot: Veilige toegang met APDS-9960 en Arduino
- Arduino Nano Companion Kit – Essentiële Componenten & Hulpmiddelen voor DIY Electronica
- USB MIDI Adapter Kit voor Arduino Micro / Leonardo – Complete Onderdelenlijst
- Geïsoleerde analoge ingangsschakeling voor Arduino bouwen
- Precisie Reactietijd Test met Arduino UNO
- Weerstandskleurcodes – Uitgebreide Handleiding voor Waarde, Tolerantie en E-Series Standaarden