Wykrywanie koloru z Arduino
Przykład pokazuje, w jaki sposób możemy wykrywać kolor wykorzystując moduł czujnika koloru w połączeniu z mikrokontrolerem Arduino.
W przykładzie wykorzystano następujące elementy:
- Arduino Uno
-
Moduł czujnik koloru, przetwornik światło - częstotliwość TCS3200D
- Przewody połączeniowe
Podłączenie czujnika z Arduino:
Połączenie z Arduino odbywa się w następujący sposób:
Moduł TCS3200D | Pin Arduino |
---|---|
VCC | 5 V |
GND | GND |
OUT | 2 |
S0 | 3 |
S1 | 4 |
S2 | 5 |
S3 | 6 |
Schemat podłączenia modułu z Arduino Uno.
Program do Arduino
W przykładzie został wykorzystany następujący kod:
int s0 = 3, s1 = 4, s2 = 5, s3 = 6; //piny modułu połączone z Arduino int out = 2; //pin 2 Arduino i OUT od czujnika int flag = 0; byte counter = 0; byte countR = 0, countG = 0, countB = 0; void setup() { Serial.begin(9600); //inicjalizacja monitora szeregowego pinMode(s0, OUTPUT); //ustawienie pinów jako wyjścia pinMode(s1, OUTPUT); pinMode(s2, OUTPUT); pinMode(s3, OUTPUT); } void TCS() { flag = 0; digitalWrite(s1, HIGH); digitalWrite(s0, HIGH); digitalWrite(s2, LOW); digitalWrite(s3, LOW); attachInterrupt(0, ISR_INTO, LOW); timer0_init(); } void ISR_INTO() { counter++; } void timer0_init(void) { TCCR2A = 0x00; TCCR2B = 0x07; //częstotliwość zegara - 1024 TCNT2 = 100; //przepełnienie 10 ms TIMSK2 = 0x01; //pozwolenie na przerwanie } int i = 0; ISR(TIMER2_OVF_vect) //timer 2, 10ms przepełnienie 10ms. funkcja przerwanie wewnętrzengo przepełnienia { TCNT2 = 100; flag++; if (flag == 1) //pobranie i wyświetlenie na ekranie składowych RGB { countR = counter; Serial.print("red="); Serial.print(countR, DEC); Serial.print("tt"); digitalWrite(s2, HIGH); digitalWrite(s3, HIGH); } else if (flag == 2) { countG = counter; Serial.print("green="); Serial.print(countG, DEC); Serial.print("t"); digitalWrite(s2, LOW); digitalWrite(s3, HIGH); } else if (flag == 3) { countB = counter; Serial.print("blue="); Serial.print(countB, DEC); Serial.print("t"); Serial.println("n"); digitalWrite(s2, LOW); digitalWrite(s3, LOW); } else if (flag == 4) { flag = 0; } counter = 0; } void loop() //główna pętla programu { TCS(); delay(500); while (1); }
Program pokazuje wartość składowych RGB dla rozpoznanego koloru. Wynik pracy programu możemy zaobserwować poniżej:
Zrzut ekranu szeregowego monitora.