W dzisiejszym wpisie zajmiemy się czujnikiem TCS3200 jest to moduł dzięki, któremu możemy identyfikować kolory. Jak zawsze wszystkich zastosowań nie w sposób wymienić ale te, które przychodzą na myśl to segregowanie przedmiotów w zależności od koloru w internecie można znaleźć filmiki gdzie ludzie sortują klocki lego kolorami albo odczytywanie kolorów przez syntezator mowy. Można zmieniać podświetlenie w zależności od koloru otoczenia itp itd…
Przejdźmy do omówienia modułu oraz znajdującego się w jego sercu czujnika.
Moduł posiada 4 białe diody led, które doświetlają przedmiot by więcej światła odbitego dotarło do naszego czujnika. Sam czujnik znajduje się w centrum modułu i jest otoczony przez walcowatą obudowę, która ogranicza światło docierające z innych kierunków. Po 2 stronach znajdują się na gotowo wlutowane piny od zasilania, wejścia i wyjścia do obsługi modułu.
Sam czujnik widoczny na poniższym zdjęciu składa się z tablicy światłoczułych punktów 8×8. 16 fotodiod posiada filtry w kolorach czerwonym , niebieskim, oraz zielonym pozostałe 16 nie posiada filtru.
Wiemy, że znane nam barwy można uzyskać z pomieszania 3 kolorów czerwonego, niebieskiego i zielonego w odpowiednich proporcjach. W popularnej skali RGB poszczególne barwy są wypadkowymi tych składowych, a ich wariacje przedstawiamy w przedziałach od 0 do 255. Kolor czerwony przedstawia się następująco: R=255, G=0, B=0,
kolor żółty: R=255, G=255, B=0
Inne kolory możemy sprawdzić sobie narzędziem dostępnym pod tym linkiem: https://www.rapidtables.com/web/color/RGB_Color.html
Naszym zadaniem będzie otrzymać dane z czujnika dla każdego kanału z osobna i połączyć je w całość otrzymując kolor. Niestety nie jest to takie klarowne jak w powyższej skali RGB i będziemy musieli sami zbadać wartości jakie daje czujnik dla interesujących nas kolorów.
LINK DO VIDEO INSTRUKCJI NA NASZYM KANALE YOU TUBE pamiętajcie żeby kliknąć subskrybuj!
Wyprowadzenia:
- Vcc – wykorzystujemy jedno z 2 złączy do podłączenia + zasilania w przedziale od 2.7V do 5.5V
- GND – podpinamy – zasilania do jednego z 2 złączy
- S0, S1 – piny do wyboru skalowania częstotliwości wyjściowej
- S2, S3 – piny do wyboru z jakiego typu fotodiod korzystamy
- OUT – wyjście na którym generowana jest fala prostokątna
- LED – stan niski włącza prace czujnika
Poniższe tabelki przedstawiają jaki stan należy ustawić L- dla niski i H dla wysoki aby otrzymać poszczególne wartości:
TABELA 1
TABELA 2
Poniżej schemat podłączenia TCS3200 do Arduino wykorzystany w naszym tutorialu.
- OUT <-> 2 Arduino
- S0 <-> 3 Arduino
- S1 <-> 4 Arduino
- S2 <-> 5 Arduino
- S3 <-> 6 Arduino
- VCC <-> 5V
- GND <-> GND
Kod programu Arduino IDE
Zanim zaczniemy pisać kod pozwalający określić wybrane przez nas kolory zapoznajmy się z dwoma funkcjami, z których będziemy korzystać.
1 z funkcji to pulseIn() – jest to funkcja, która pozwala nam zbadać okres pomiędzy stanami wysokimi i niskimi na wybranym pinie Arduino. Wartość podaje w milisekundach. Jest to dla nas istotne ponieważ czujnik właśnie przebiegiem prostokątnym zwraca nam zmierzone wartości.
Wygląda to następująco:
Funkcja potrzebuje nastepujące argumenty: pulseIn(pin, HIGH albo LOW)
pin – podajemy nr pinu Arduino gdzie dokonujemy pomiaru
HIGH lub LOW – określa czy mierzymy trwanie stanu niskiego czy wysokiego.
2 funkcja, którą wykorzystamy to funkcja map() , pozwala ona zmapować wartości z jednego zakresu na inny podany. Dajmy na to mamy odczyt z czujnika w postaci liczby 50 i mieści się on w skali od 1 do 100, potrzebujemy operować na wartościach od 1 do 10 – funkcja zwróci nam wynik 5 dla takiego zadania.
Jej budowa przedstawia się następująco map( wartość, stareOD, stareDO, noweOD, noweDO)
czyli w naszym przykładzie było by to map(50, 1, 10, 1, 10)
Będzie to przydatne dla tych, którzy chcieli by spróbować przenieść swoje pomiary do skali RGB co jak przekonacie się sami będzie bardzo trudne.
Przejdźmy do kodowania!
//definiujemy sobie stałe i przypisujemy numery pinów arduino
#define S0 3
#define S1 4
#define S2 5
#define S3 6
#define sensorOut 2
int odczyt = 0;
void setup() {
// definiujemy czy pin jest wejściem czy wyjściem
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(sensorOut, INPUT);
//ustawiamy skalowanie na 20% zgodnie z Tabela 1 - powszechnie stosowane dla Arduino
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);
Serial.begin(9600); //inicjalizujemy monitor portu szeregowego
}
void loop() {
//ustawiamy odczyt na fotodiody CZERWONE zgodnie z Tabela 2
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
odczyt = pulseIn(sensorOut, LOW); // czytamy co zwraca czujnik
//odczyt = map(odczyt, -60, 137, 0, 255); - sprawdzamy rozstrzał //pomiarów i skalujemy do RGB (dla chętnych)
Serial.print("R= ");
Serial.print(odczyt);
Serial.print(" ");
delay(200);
//ustawiamy odczyt na fotodiody ZIELONE zgodnie z Tabela 2
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
odczyt = pulseIn(sensorOut, LOW); // czytamy co zwraca czujnik
//odczyt = map(odczyt, -60, 137, 0, 255); - sprawdzamy rozstrzał //pomiarów i skalujemy do RGB (dla chętnych)
Serial.print("G= ");
Serial.print(odczyt);
Serial.print(" ");
delay(200);
//ustawiamy odczyt na fotodiody NIEBIESKIE zgodnie z Tabela 2
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
odczyt = pulseIn(sensorOut, LOW); // czytamy co zwraca czujnik
//odczyt = map(odczyt, -60, 137, 0, 255); - sprawdzamy rozstrzał //pomiarów i skalujemy do RGB (dla chętnych)
Serial.print("B= ");
Serial.print(odczyt);
Serial.println(" ");
delay(200);
}
Powyższy kod wypisuje nam w serial monitorze wyniki pomiaru dla każdego rodzaju fotodiod. W efekcie u siebie otrzymałem następujące wyniki.
R między 95 a 101, G między 109 a 115 oraz B między 81 i 82. Są to wyniki dla położonego na czujniku fioletowego etui na okulary.
Teraz należało by zanotować ten wynik gdzieś na boku i opisać go jako kolor fioletowy etui. Pamiętajmy, że wystarczy że światło będzie inaczej padać i już wskazania będą się różnić. Gdy lekko oddalimy przedmiot również. W takiej sytuacji można dokonać większą liczbę pomiarów i zapisać przedziały dla danego koloru odczytywanego z różnej odległości.
Teraz pokażę wam swoją konstrukcję z rolki po papierze toaletowym z białym środkiem walca. Czujnik został umieszczony w 1/4 rolki dzięki czemu mieszczą się kable a pomiar koloru odbywa się z równej odległości.
Dzięki temu pomiary okazały się w miarę powtarzalne. Wpływ na wysokość otrzymanych wyników będzie miał również materiał z jakiego jest zrobiona rzecz, czy jest śliski i odbija dużo światła czy chropowaty i pochłania oraz czy kolor na przedmiocie jest równomierny.
Po tym jak zanotujemy wyniki dla kolorów jakie nas interesują można zmodyfikować nasz program tak aby wypisywał kolor naszego przedmiotu.
Zastosujemy do tego celu warunek if.
//definiujemy sobie stałe i przypisujemy numery pinów arduino
#define S0 3
#define S1 4
#define S2 5
#define S3 6
#define sensorOut 2
int odczyt = 0;
void setup() {
// definiujemy czy pin jest wejściem czy wyjściem
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(sensorOut, INPUT);
//ustawiamy skalowanie na 20% zgodnie z Tabela 1 - powszechnie stosowane dla Arduino
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);
Serial.begin(9600); //inicjalizujemy monitor portu szeregowego
}
void loop() {
//ustawiamy odczyt na fotodiody CZERWONE zgodnie z Tabela 2
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
int odczytR = pulseIn(sensorOut, LOW); // czytamy co zwraca czujnik
//odczyt = map(odczyt, -60, 137, 0, 255); - sprawdzamy rozstrzał pomiarów i skalujemy do RGB (dla chętnych)
Serial.print("R= ");
Serial.print(odczytR);
Serial.print(" ");
delay(200);
//ustawiamy odczyt na fotodiody ZIELONE zgodnie z Tabela 2
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
int odczytG = pulseIn(sensorOut, LOW); // czytamy co zwraca czujnik
//odczyt = map(odczyt, -60, 137, 0, 255); - sprawdzamy rozstrzał pomiarów i skalujemy do RGB (dla chętnych)
Serial.print("G= ");
Serial.print(odczytG);
Serial.print(" ");
delay(200);
//ustawiamy odczyt na fotodiody NIEBIESKIE zgodnie z Tabela 2
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
int odczytB = pulseIn(sensorOut, LOW); // czytamy co zwraca czujnik
//odczyt = map(odczyt, -60, 137, 0, 255); - sprawdzamy rozstrzał pomiarów i skalujemy do RGB (dla chętnych)
Serial.print("B= ");
Serial.print(odczytB);
Serial.println(" ");
delay(200);
if( odczytR > 94 && odczytR < 117 && odczytG > 105 && odczytG < 120 && odczytB > 76 && odczytB < 90){
Serial.println("Wykryty kolor to FIOLETOWY");
delay(1000);
}
else if( odczytR > 56 && odczytR < 62 && odczytG > 65 && odczytG < 80 && odczytB > 54 && odczytB < 60){
Serial.println("Wykryty kolor to RÓŻOWY");
delay(1000);
} else { Serial.println("kolor nieznany!");}
}
W tym przypadku tworzymy zmienne int dla każdego rodzaju kanału pomiaru osobno i porównujemy czy mieszczą się w zakresie jaki ustaliliśmy w poprzednim kroku.
W kolejnych ifach możemy umieszczać następne warunki i poszerzać nasz program o rozpoznawanie coraz to nowych barw. Na zadanie domowe możemy rozszerzyć nasz układ o diodę RGB i zmieniać jej kolor w zależności od wykrytego koloru. A może wy macie jakieś świeże pomysły na wykorzystanie tego czujnika?
Na pytania i uwagi czekamy w komentarzach.
Jak zawsze zachęcam do zakupu części w naszym sklepie internetowym, kupując u nas zawsze możecie liczyć na wsparcie i obsługę na najwyższym poziomie.
Obserwujcie naszego Facebooka, zawsze informujemy tam o pojawieniu się nowego wpisu oraz udostępniamy ciekawe projekty innych osób
Czujnik kupicie w naszym sklepie tutaj:
Czujnik wykrywania kolorów barw TCS3200
I najważniejsze subskrybujcie nasz kanał na YouTube! >>KLIK<< aby oglądać materiały Video do wpisów na tym blogu.
Powodzenia!
1 Comments
Zostaw komentarz
Krzysztof
Są to dosyć małe i niepozorne moduły, jednak stanowią podstawę do szybkiego i efektywnego prototypowania, produkcji urządzeń, a może nawet do nauki i eksperymentowania. Stoją za tym firmy, które tworzą i nieustannie rozbudowują projekty modułów dodatkowych.