Fotoelektrický snímač otáček je vstupní modul pro Arduino. Tento snímač je původně používaný v tiskárnách od firmy Hewlett Packard, kde slouží pro detekci polohy tiskové hlavy. Uvnitř snímače najdeme optickou bránu, která díky dvěma snímačům dokáže detekovat nejen průchod předmětu, ale i směr průchodu.
Součástí balení je kromě senzoru i nerezové kolečko, které slouží jako otočný čtený element. Je ale nutné ho správně upevnit s ohledem na průchod senzorem. Pro napájení je možné použít 3,3 nebo 5 Voltů z Arduina.
Pro úspěšné propojení senzoru proudu a Arduino desky propojíme celkem 4 vodiče. Připojíme „+“ na 5V Arduina, „-„ na GND, O1 na pin D2 a O2 na pin D3. Pro datové piny je nutné použít piny, které umí funkci přerušení (anglicky interrupt), kdy u Arduino UNO jsou to piny D2 a D3. Více informací najdete zde https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/.
Ukázkový kód obsahuje na svém začátku nastavení čísel propojovacích pinů a vytvoření proměnných pro běh programu.
Ve funkci setup zahájíme komunikaci po sériové lince a poté nastavíme oba datové piny jako vstupní. V posledním kroku nastavíme přerušovací piny tak, aby každý reagoval na správnou změnu a zavolal příslušnou funkci.
Nekonečná smyčka loop v prvním kroku vždy nahraje poslední přečtený stavu pinu O1 do proměnné předchozí stav a poté porovná starou hodnotu a aktuální pozici. Pokud došlo ke změně pozice, vypíšeme novou pozici po sériové lince a uložíme si aktuální pozici jako starou hodnotu, aby nedocházelo k tištění pozice každý běh smyčky.
Funkce nactiO1 je zavolána vždy při přerušení pinu O2. V této funkci načteme stav pinu O1 a poté kontrolujeme, jestli nedošlo ke změně stavu oproti předchozí uložené hodnotě. Pokud ke změně došlo, tak podle stavu pinu O2 buď přičteme nebo odečteme jedničku z proměnné pozice.
Funkce nactiO2 je zavolána vždy při přerušení pinu O1. V této funkci pouze načteme stav pinu O2 do proměnné.
// Fotoelektrický snímač otáček HP // navody.dratek.cz // nastavení čísel propojovacích pinů #define pinO1 2 #define pinO2 3 // proměnné pro běh programu int pozice = 0; int predchoziStav = LOW; int staraHodnota = 0; int stavO1 = LOW; int stavO2 = LOW; void setup() { // zahájení komunikace po sériové lince Serial.begin(9600); // nastavení vstupních pinů pinMode(pinO1, INPUT); pinMode(pinO2, INPUT); // nastavení přerušovacích rutin pro oba piny attachInterrupt(digitalPinToInterrupt(pinO1), nactiO2, FALLING); attachInterrupt(digitalPinToInterrupt(pinO2), nactiO1, CHANGE); } void loop() { // uložení stavu pinu 01 jako předchozí hodnoty predchoziStav = stavO1; // porovnání staré hodnoty a aktuální pozice, // pokud se liší, vytiskneme aktuální pozici if (pozice != staraHodnota) { Serial.println(pozice, DEC); // uložení aktuální pozice do proměnné, // aby docházelo k tištění pouze při změně staraHodnota = pozice; } } void nactiO1() { // načtení stavu pinu O1 stavO1 = digitalRead(pinO1); // kontrola stavu oproti předchozímu měření if ((predchoziStav == LOW) & (stavO1 == HIGH)) { // pokud došlo ke změně, tak podle stavu O2 // přičteme nebo odečteme pozici if (stavO2 == LOW) { pozice--; } else { pozice++; } } } void nactiO2() { // načtení stavu pinu O2 do proměnné stavO2 = digitalRead(pinO2); }
Po nahrání ukázkového kódu do Arduino desky s připojeným snímačem otáček si můžete vyzkoušet pohyb předmětu z jedné či druhé strany snímače a dostanete například tento výsledek:
-3 -2 -1 0 -1 -2 -3
Fotoelektrický snímač otáček je zajímavá ukázka, jak lze snímat otáčky včetně informace o směru pomocí jednoduché kombinace dvou snímačů. Uvedený ukázkový program slouží hlavně pro otestování samotného senzoru, protože například následná kalibrace v zařízení či měření rychlosti už záleží na umístění a provedení otočného elementu. Tento snímač pak lze použít v různých zařízeních, kde potřebujeme snímat otáčky pomocí foto elementů bez ovlivňování samotného zařízení.
Seznam použitých komponent:
https://dratek.cz/arduino/7763-seeeduino-v4.2-arduino-uno-kompatibilni.html
https://dratek.cz/arduino/1296-fotoelektricky-snimac-otacek-hewlett-packard.html