Arduino detektor barvy TCS230

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

Další podobné články