Rotační enkodér KY-040 je rotační vstupní součástka, která při otáčení její osou poskytuje informaci o této rotaci a také jejím směru. Zároveň tento typ rotačního enkodéru obsahuje i tlačítko, které lze aktivovat stiskem celé osy enkodéru. V kombinaci s Arduino deskou tak lze tento enkodér typu KY-040 využít jako ovládací prvek pro všemožná zapojení, například jako ovladač pro pohyb v menu či jako digitální potenciometr pro řízení servomotorů. Velkou výhodou při srovnání s běžnými potenciometry je ten fakt, že tento rotační enkodér umožňuje zaznamenat celkem 30 pulzů za celou otáčku, avšak počet otáček není nijak omezen, můžeme tedy osou enkodéru otáčet donekonečna na obě strany.
Pro úspěšné zapojení s Arduino deskou je nutné propojit všech 5 pinů enkodéru. Připojíme CLK na pin 3, DT na pin 4, SW na pin 5, + na +5V a GND na zem. První tři piny mohou být samozřejmě po změně v programu zapojeny na jiné volné datové piny na Arduino desce.
Ukázkový kód obsahuje na začátku proměnné pro nastavení propojovacích pinů a dále proměnné pro uložení všech potřebných informací v průběhu práce s enkodérem. V podprogramu setup je nejprve nastavena komunikace přes sériovou linku a dále jsou nastaveny piny CLK a DT jako vstupní. Poté je nastaven pin SW pro tlačítko jako vstupní s pull up vnitřním odporem, kdy toto je nutné pro jeho správnou funkci a mohl by být také použit externí odpor, který by se zapojil mezi pin SW a napájení +5V. Jako poslední v podprogramu je načten aktuální stav pinu CLK pro první detekování otáček v programu. V následující nekonečné smyčce loop se nachází jako první načtení stavu pinu CLK a poté jeho kontrola, jestli se neliší od předchozího stavu. V případě, že je tato podmínka splněna, následuje kontrola stavu pinu DT. V případě, že pin DT je v jiném stavu, než pin CLK, tak se jedná o směr rotace ve směru hodin, tedy vpravo a tato informace je vytištěna po sériové lince společně s přičtením hodnoty 1 do proměnné udávající pozici enkodéru. V opačném případě, tedy že pin DT byl změněn dříve než pin CLK, se jedná o rotaci proti směru hodin, tedy vlevo. Následně je tedy opět tato informace vytištěna po sériové lince a z proměnné pozice enkodéru je odečtena hodnota 1. Po této kontrole směru je po sériové lince vytištěna informace o aktuální pozici enkodéru a poté je uložen stav pinu CLK jako reference pro detekci dalšího otáčení osy. Dále následuje ještě známá konstrukce načtení stavu pinu SW, který odpovídá tlačítku rotačního enkodéru KY-040 a v případě jeho stisku následuje vytištění informace o této aktivitě po sériové lince.
// Rotační enkodér KY-040 // proměnné pro nastavení propojovacích pinů int pinCLK = 3; int pinDT = 4; int pinSW = 5; // proměnné pro uložení pozice a stavů pro určení směru // a stavu tlačítka int poziceEnkod = 0; int stavPred; int stavCLK; int stavSW; void setup() { // komunikace přes sériovou linku rychlostí 9600 baud Serial.begin(9600); // nastavení propojovacích pinů jako vstupních pinMode(pinCLK, INPUT); pinMode(pinDT, INPUT); // nastavení propojovacího pinu pro tlačítko // jako vstupní s pull up odporem pinMode(pinSW, INPUT_PULLUP); // načtení aktuálního stavu pinu CLK pro porovnávání stavPred = digitalRead(pinCLK); } void loop() { // načtení stavu pinu CLK stavCLK = digitalRead(pinCLK); // pokud je stav CLK odlišný od předchozího měření, // víme, že osa byla otočena if (stavCLK != stavPred) { // pokud stav pinu DT neodpovídá stavu pinu CLK, // byl pin CLK změněn jako první a rotace byla // po směru hodin, tedy vpravo if (digitalRead(pinDT) != stavCLK) { // vytištění zprávy o směru rotace a přičtení // hodnoty 1 u počítadla pozice enkodéru Serial.print("Rotace vpravo => | "); poziceEnkod ++; } // v opačném případě, tedy pin DT byl změněn // jako první, se jedná o rotaci // proti směru hodin, tedy vlevo else { // vytištění zprávy o směru rotace a odečtení // hodnoty 1 u počítadla pozice enkodéru Serial.print("Rotace vlevo <= | "); poziceEnkod--; } // vytištění aktuální hodnoty pozice enkodéru Serial.print("Pozice enkoderu: "); Serial.println(poziceEnkod); } // uložení posledního stavu pinu CLK // jako reference pro další porovnávání stavPred = stavCLK; // načtení stavu pinu SW - tlačítko stavSW = digitalRead(pinSW); // v případě stisknutí vytiskni informaci // po sériové lince if (stavSW == 0) { Serial.println("Stisknuto tlacitko enkoderu!"); delay(500); } }
Po nahrání programu do Arduino desky a otáčení osou enkodéru společně se stiskem tlačítka dostaneme například tento výpis:
Rotace vpravo => | Pozice enkoderu: 0 Rotace vpravo => | Pozice enkoderu: 1 Rotace vpravo => | Pozice enkoderu: 2 Rotace vlevo <= | Pozice enkoderu: 1 Rotace vlevo <= | Pozice enkoderu: 0 Rotace vlevo <= | Pozice enkoderu: -1 Stisknuto tlacitko enkoderu! Rotace vlevo <= | Pozice enkoderu: -2
Jak již bylo zmíněno v úvodu, rotační enkodér KY-040 je velice jednoduše použitelná rotační vstupní součástka, která společně s Arduino deskou tvoří zajímavý ovládací prvek. Obsahuje totiž kombinaci digitálního potenciometru s nekonečným počtem otáček a mechanického tlačítka umístěného pod osou samotného enkodéru.
Seznam použitých komponent:
http://dratek.cz/arduino-vstupni-periferie/837-arduino-rotacni-enkoder.html
http://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html
http://dratek.cz/arduino-kabelaz-propoje-rozsireni/1063-arduino-vodice-samec-samec-40-kusu.html