Infračervený optický senzor má velice rozmanité možnosti použití. Jeho hlavní funkcí je detekce přiblížení tělesa k senzoru, ať už se jedná o překážku robota, papír v tiskárně či měření otáček kola. Tento infračervený optický senzor funguje, jak už z názvu vyplývá, za pomoci dvojice součástek, a to infračervené diody a optického přijímače, v tomto případě fototranzistoru.
Při bližším pohledu na samotný senzor na modulu si můžeme všimnout, že tyto dvě součástky jsou odděleny plastovou přepážkou, bez které by senzor trvale detekoval přiblížení. Celá jeho funkce totiž spočívá v tom, že infračervená dioda vyšle světelný pulz, který se odrazí od případné překážky zpět a je zachycen optickým detektorem. Podle množství dopadajícího světla se pak adekvátně otevře tranzistor a díky operačnímu zesilovači umístěnému na modulu můžeme na výstupu měřit analogové napětí v rozmezí 0 – 5 V. Je však důležité zdůraznit, že tento optický senzor má maximální detekovatelnou vzdálenost okolo 20 cm. Nejpřesnější je pak zhruba na 5 cm, přičemž rozdělení výstupního napětí neodpovídá lineárně vzdálenosti, poloviční napětí například odpovídá zhruba 3 cm.
Tento modul s infračerveným optickým senzorem má čtyři propojovací piny. Propojení s Arduinem je jednoduché a uvedené na obrázku níže. Stačí tedy připojit Vcc na napájecí napětí v rozpětí 3,3 – 5 V, Gnd na zem a dále nám zbývají piny A0 a D0. Tyto slouží pro získání informací od senzoru. Pin A0 poskytuje analogovu hodnotu napětí, je tedy připojen do analogového vstupu A0 na Arduinu. Pin D0 pak poskytuje digitální hodnotu, kdy práh sepnutí si volíme trimrem umístěným na modulu. V případě vzdálené překážky je digitální výstup D0 roven napájecímu napětí a při detekci spadne na Gnd. Tento výstup je výhodný v tom případě, kdy nepotřebujeme měřit vzdálenost dynamicky, ale stačí nám vědět pouze informaci „sepnuto/nesepnuto“.
Ukázkový kód pro zapojení a vyzkoušení infračerveného optického senzoru obsahuje jako první inicializaci datových pinů a proměnnou pro čtení hodnoty napětí. V podprogramu setup nejprve nastavíme komunikaci po sériové lince s rychlostí 9600 baud, dále nastavíme oba piny jako vstupní a také zapojíme digitální vstup D0 na pinu 2 jako vstup pro přerušení. Toto přerušení má tvar: číslo přerušovacího pinu (pro nás 0, případně 1 pro pin 3), název podprogramu obsahujícího příkazy, které se mají provést a na posledním místě typ detekce. Tato detekce má čtyři různá nastavení: LOW pro detekci logické nuly (Gnd), CHANGE pro detekci změny z jedné úrovně do druhé, RISING pro detekci náběžné hrany (log0 na log1) a jako poslední FALLING pro detekci klesající hrany (log1 na log0). Vzhledem k chování modulu, kdy v případě detekce přiblížení je nastavena log0, jsem použil v příkladu detekci klesající hrany FALLING.
V loop smyčce se nachází příkazy, které nejprve do proměnné „analog“ nahrají příslušnou hodnotu napětí v rozsahu 0-1023, kdy 0 odpovídá Gnd. Následuje ještě zmíněný podprogram „prerus“, který pro názornost vytiskne po sériové lince zprávu o detekci pohybu.
// Infračervený optický senzor // čísla pinu připojeného digitálního // a analogového vstupu const int d0 = 2; const int a0 = A0; // proměnná pro čtení napětí analogového vstupu int analog = 0; void setup() { // komunikace přes sériovou linku rychlostí 9600 baud Serial.begin(9600); // inicializace obou vstupů pinMode(d0, INPUT); pinMode(a0, INPUT); // nastavení přerušení na pin 2 (int0) // při klesající hraně (log1->log0) se vykoná program prerus attachInterrupt(0, prerus, FALLING); } void loop(){ // načtení hodnoty analogového vstupu analog = analogRead(a0); Serial.print("Analogova hodnota: "); Serial.println(analog); // vyčkej 1 s kvůli zbytečnému množství tisknutých znaků delay(1000); } void prerus(){ // pokud je aktivován digitální vstup, // vykonej následující Serial.println("Detekce pohybu!"); delay(1000); }
Po nahrání programu do Arduino desky si můžeme otevřít Sériový monitor a sledovat výstupní hodnotu analogového vstupu. A také můžeme otestovat digitální výstup při přiblížení překážky kolmo k modulu.
Tabulka rozložení přerušovacích pinů:
Deska |
Digitální piny pro přerušení |
Uno, Nano, Mini (Atmega 328) |
2, 3 |
Mega, Mega2560, MegaADK |
2, 3, 18, 19, 20, 21 |
Micro, Leonardo (Atmega 32u4) |
0, 1, 2, 3, 7 |
Zero, MKR1000 |
Všechny digitální piny, kromě 4 |
Due |
Všechny digitální piny |
Seznam použitých komponent:
http://dratek.cz/arduino/1142-arduino-infracerveny-opticky-sezor-1449929310.html
http://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html
http://dratek.cz/arduino/844-arduino-nepajive-pole.html
http://dratek.cz/arduino-kabelaz-propoje-rozsireni/1063-arduino-vodice-samec-samec-40-kusu.html