LAKI PINGVINI<>
102018<><>

Rotary Encoder

Zaokret bez kraja

Rotary encoder je uređaj koji umnogome podseća na potenciometar, ali, osim fizičke sličnosti, sa njim nema nikakvih drugih dodirnih tačaka. Kao i u slučaju potenciometra i enkoder ima svoju primenu svuda oko nas. Jedna od čestih primena je na radio-uređajima u automobilima gde preko njega povećavamo i smanjujemo zvuk, a pritiskom na njega uključujemo ili isključujemo sam radio. Tipova ovakvih uređaja ima mnogo. Razlikujemo senzorske (magnetne, optičke i laserske) i apsolutne i postepene. Nas ovaj put interesuje postepeni rotacijski enkoder, kakav se najčešće sreće u Arduino svetu. Ovaj enkoder, osim čitanja zakretanja osovinice, ima i taster kada tu istu osovinicu pritisnemo na dole.

Sam enkoder radi tako što preko ploče generiše kvadratne talase. Ploča ima ravnomerno razmaknute zone preko kojih se ostvaruju kontakti, a koje imaju zajedničku dodirnu tačku (C), koja je zapravo GND i dve odvojene tačke (A i B) koje imaju svoje izlaze na pinovima CLK i DT. Prilikom zakretanja osovinice (shaft), a samim tim i ploče, krajevi ovih zona ostvaruju kontakte. Tom prilikom se stvaraju dva odvojena kvadratna talasa kao output. Koristeći bilo koji od ovih talasa, mi možemo tačno znati da li je došlo do zakretanja osovinice i koliko, ali da bismo znali smer, potrebna su nam oba signala. Ako se osovinica zakreće u smeru kazaljke na satu A, izlaz će biti ispred B izlaza, dok će u suprotnom smeru to biti obrnuto. Na šemi vidimo da su oba signala uvek prisutna, ali su razmaknuta dovoljno da se kvadrati talasa, koji su pod 90 stepeni u odnosu na osnovu, ni u kojem slučaju ne poklapaju. Ako idemo u smeru kazaljke na satu, imaćemo pozitivna očitavanja na B pinu (DT), u suprotnom će biti negativna. Na A pinu (CLK) ćemo brojati pulseve da bismo videli koliko se osovinica zakrenula, a praćenjem frekvencije možemo čak videti i kojom brzinom. Za razliku od pomenutog potenciometra, ovde zakretanju nema kraja u bilo kom smeru. Osovinica se može beskonačno zakretati u nekom smeru, a za potrebe našeg projekta, mi to možemo rešiti u okviru skeča i limitirati na vrednosti koje su nama potrebne. Naš enkoder ima 20 koraka za ceo krug, ali ovo zavisi od modela do modela. Ovo ujedno znači i minimum koraka koji se mogu postići.

Postepeni rotacijski enkoder može biti već ugrađen na PCB u obliku modula sa zalemljenim otpornicima ili u „goloj” varijanti. U zavisnosti od projekta, biramo odgovarajući. Mi ćemo se, naravno, prvo družiti sa ovom prvom varijantom koja je mnogo praktičnija za razradu projekta. Ovde imamo pet pinova gde CLK povezujemo sa digitalnim pinom 2, a DT sa pinom 3. SW pin tastera ide na D4. Pinove 5V i GND povezujemo, takođe, na odgovarajuće pinove Una.

//definisanje pinova i promenljivih

int encPinA = 2;

int encPinB = 3;

int switchC = 4;

int encoderPosition = 0;

int switchState = 0;

int switchOutState = 0;

int pos;

int lastPos;

void setup() {

pinMode(encPinA, INPUT);

pinMode(encPinB, INPUT);

pinMode(switchC, INPUT_PULLUP);

Serial.begin(9600);

lastPos = digitalRead(encPinA);

}

void loop() {

pos = digitalRead(encPinA); //citamo poziciju po pinu A

if(pos != lastPos){ //i ako nije poslednja pozicija

if(digitalRead(encPinB) != pos){ //ako ni pozicija pina B nije isto sto i pozicija pina A

encoderPosition --; //umanjujemo poziciju enkodera

}else{

encoderPosition ++; //u suprotnom je povecavamo

}

Serial.print("pozicija je ");

Serial.println(encoderPosition);

}

lastPos = pos; //dodeljujemo trenutnu poziciju poslednjoj poziciji

switchState=digitalRead(switchC); //citamo stanje prekidaca

if(switchState == LOW){ //ako je pritisnut

if(switchOutState == 0){ //ako je stanje prekidaca 0

switchOutState = 1; //menjamo ga u 1

Serial.print("taster je ");

Serial.println(switchOutState);

delay(200);

}else{

switchOutState = 0; //u suprotnom, ako nije 0, menjamo ga u 0

Serial.print("taster je ");

Serial.println(switchOutState);

delay(200);

}

}

}

}

 
Smatramo da do loop funkcije ne treba da dodatno pojašnjavamo. U loop funkciji čitamo poziciju encPinA (CLK) i, ako nije ista kao prethodna, upoređujemo je sa pozicijom na encPinB (DT). Ukoliko nije ni sa njom ista, umanjujemo encoderPosition, u suprotnom je povećavamo. Pri svakom narednom očitavanju ispisujemo encoderPosition kao trenutnu poziciju enkodera, a poslednju poziciju izjednačavamo sa pos vrednošću. Za taster smo napravili da nam se menja stanje logičke nule i jedinice pri svakom pritisku. Ovde ćemo napomenuti da je taster inicijalno „NO”.

Enkoder ima svoju primenu u dosta projekata. Vrlo često se koristi za steper i servo motore. U principu, za bilo šta gde je potrebno povećavati vrednosti u koracima. Mikrokontroler će na osnovu toga izvršiti određene zadatke.

Ukoliko je u pitanju obična (non breakout) varijanta enkodera, pristup je malo drugačiji. S obzirom na to da ipak pričamo o mehaničkom uređaju, možemo imati problema sa šumom prilikom kontakata unutar enkodera. Govorimo o istom problemu kao kada smo pričali o tasterima i debounce proceduri. Za projekte gde ćemo enkoder koristiti za ne tako bitne stvari, šum i neće predstavljati prevelik problem. Ukoliko radimo složeniji projekat gde je svaki korak enkodera bitan, poželjno je ugraditi na A (CLK) i B (DT) pinove RC filter.

Filtriranje se može izvesti i kroz skeč, ali se na taj način dodatno komplikuje. Uvek je bolje problem rešiti hardverski, pre nego posegnuti za softverskim rešenjem. Uz koji otpornik (22-27 kilooma) i keramički kondenzator (100 nanofarada) se ovaj problem može rešiti i ostaviti mikrokontroleru da radi svoj posao. Modul iznad već ima ugrađene otpornike ispod sebe, pa je na taj način šum sveden na minimum. Razlog više da se prilikom biranja dobro razmisli koji enkoder uzeti.

Dejan PETROVIĆ

 
Instaliranje softvera u Linuxu (3)
Izvinjenje Linusa Torvaldsa
TTGO ESP8266 OLED
Rotary Encoder
Šta mislite o ovom tekstu?
Platforma Espressif ESP32
Home / Novi brojArhiva • Opšte temeInternetTest driveTest runPD kutakCeDetekaWWW vodič • Svet igara
Svet kompjutera Copyright © 1984-2018. Politika a.d. • RedakcijaKontaktSaradnjaOglasiPretplata • Help • English
SKWeb 3.22
Opšte teme
Internet
Test Drive
Test Run
PD kutak
CeDeteka
WWW vodič
Svet igara



Naslovna stranaPrethodni brojeviOpšte informacijeKontaktOglašavanjePomoćInfo in English

Svet kompjutera