Arduino detektor barvy je zajímavý modul, kterým lze detekovat barvy v jeho těsné blízkosti. Na modulu se nachází senzor TCS230, který je složen z velkého množství fotodiod s různými barevnými filtry, a čtyři bílé LED diody pro osvícení zkoumaného předmětu. Díky této kombinaci je tedy možné zjistit barvu zkoumaného předmětu, kdy po osvitu bílými LED diodami se světlo odrazí zpět do senzoru TCS230 a ten dokáže po konfiguraci uživatelem na svém výstupu vygenerovat frekvenci výskytu barevných složek RGB. Pokud tedy například přiložíme červený předmět, odražené světlo bude obsahovat nejvíce červenou složku, ta vygeneruje nejvíce proudu skrze fotodiody s červeným filtrem, který je následně převeden na frekvenci. Přičemž u tohoto senzoru platí pravidlo: čím vyšší výskyt dané barvy, tím nižší je jeho frekvence na výstupu.
Pro úspěšné propojení detektoru barvy s Arduino deskou je nutné zapojit celkem 7 propojovacích pinů. Propojíme S0 s pinem D4, S1 s pinem D5, GND se zemí Arduina, S3 s pinem D7, S2 s pinem D6, OUT s pinem D8 a VCC s 5V na Arduinu. Jako napájecí napětí lze využít také 3,3V, ale sníží se tím svit bílých LED diod, což může vést k nižší přesnosti detekce barev. Také lze použít pro datové piny (S0-S3, OUT) jiné volné, ale tuto volbu je nutné provést také v ukázkovém kódu.
Ukázkový kód na svém začátku obsahuje nastavení propojovacích pinů modulu s detektorem. V podprogramu setup nejprve nastavíme všechny S piny jako výstupní a pin OUT jako vstupní a poté zahájíme komunikaci s detektorem barev. Jako poslední ještě nastavíme komunikaci po sériové lince. Nekonečná smyčka loop obsahuje jako první vytvoření proměnných pro ukládání naměřených frekvencí a poté následuje měření tří základních složek barev – R (červená), G (zelená) a B (modrá). Pro každou barvu je nutné použít specifickou kombinaci výstupů S0-S3 a po krátké pauze 50 milisekund můžeme načíst aktuálně měřenou barvu do proměnné pomocí funkce pulseIn. Po změření všech tří barev si vytiskneme změřené frekvence a následně můžeme detekovat podle naměřených dat různé barvy. Já jsem se svým senzorem vyzkoušel zmíněné tři barvy, tedy červenou, zelenou a modrou a zjistil jsem, že spolehlivě poznám jednotlivé barvy, pokud je jejich frekvence nižší než 60. Pokud tedy budete chtít detekovat více barev, stačí si je napoprvé změřit, zjistit, jakých frekvencí dosahují jednotlivé složky a z těchto údajů vytvořit další detekční podmínku. Já jsem pro ukázku vyzkoušel žlutou barvu, která je složena hlavně z červené a zelené složky. Na konci programu se nachází už pouze ukončení tištěného řádku a volitelná pauza pro přehledné čtení výsledků.
// Detektory barvy // nastavení propojovacích pinů modulu #define pinS0 4 #define pinS1 5 #define pinS2 6 #define pinS3 7 #define pinOut 8 void setup() { // nastavení propojovacích pinů S jako výstupních pinMode(pinS0, OUTPUT); pinMode(pinS1, OUTPUT); pinMode(pinS2, OUTPUT); pinMode(pinS3, OUTPUT); // nastavení pinu OUT jako vstupního pinMode(pinOut, INPUT); // inicializace detektoru barev digitalWrite(pinS0,HIGH); digitalWrite(pinS1,LOW); // komunikace přes sériovou linku rychlostí 9600 baud Serial.begin(9600); } void loop() { // proměnné pro uložení frekvencí barev int frekvenceCervena, frekvenceZelena, frekvenceModra; // nastavení měření červené barvy digitalWrite(pinS2,LOW); digitalWrite(pinS3,LOW); // krátká pauza pro přesné měření delay(50); // načtení frekvence červené barvy frekvenceCervena = pulseIn(pinOut, LOW); // nastavení měření zelené barvy digitalWrite(pinS2,HIGH); digitalWrite(pinS3,HIGH); // krátká pauza pro přesné měření delay(50); // načtení frekvence zelené barvy frekvenceZelena = pulseIn(pinOut, LOW); // nastavení měření modré barvy digitalWrite(pinS2,LOW); digitalWrite(pinS3,HIGH); // krátká pauza pro přesné měření delay(50); // načtení frekvence modré barvy frekvenceModra = pulseIn(pinOut, LOW); // vytištění načtených frekvencí po sériové lince Serial.print("R: "); Serial.print(frekvenceCervena); Serial.print(" | G: "); Serial.print(frekvenceZelena); Serial.print(" | B: "); Serial.print(frekvenceModra); // pokud je detekována nějaká z barev, vytiskneme // informaci po sériové lince if (frekvenceCervena < 60) { Serial.print(" | Detekce cervene. "); } if (frekvenceZelena < 60) { Serial.print(" | Detekce zelene. "); } if (frekvenceModra < 60) { Serial.print(" | Detekce modre. "); } // detekce vlastní barvy složené z různých složek if (frekvenceCervena < 60 & frekvenceZelena < 60 ) { Serial.print(" | Detekce zlute. "); } // ukončení řádku Serial.println(); // volitelná pauza pro přehledné čtení výsledků delay(850); }
Po nahrání ukázkového programu do Arduino desky s připojeným detektorem barev dostaneme například tento výpis:
R: 33 | G: 159 | B: 113 | Detekce cervene. R: 70 | G: 46 | B: 70 | Detekce zelene. R: 68 | G: 130 | B: 55 | Detekce modre. R: 37 | G: 19 | B: 38 | Detekce cervene. | Detekce zelene. | Detekce modre. | Detekce zlute.
Arduino detektor barvy je možné využít v různých zařízeních jako například třídičce barevných předmětů či různých herních zařízeních. Je však důležité upozornit, že na přesnost detekce má velký vliv síla a složení barev osvětlení okolního prostředí, vzdálenost zkoumaného předmětu (doporučena vzdálenost do 1 centimetru) a také povrch zkoumaného předmětu.
Seznam použitých komponent:
http://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html
http://dratek.cz/arduino/890-arduino-detektor-barvy-1420662593.html