2025 Autor: John Day | [email protected]. Zadnja izmjena: 2025-01-13 06:57
Rotacijski davač je elektromehanički uređaj koji pretvara rotacijsko kretanje u digitalne ili analogne informacije. Može se okretati u smjeru kazaljke na satu ili suprotno. Postoje dvije vrste rotacionih davača: apsolutni i relativni (inkrementalni) davači.
Dok apsolutni davač daje vrijednost proporcionalnu trenutnom kutu osovine, inkrementalni davač daje korak vratila i njegov smjer. (U ovom slučaju imamo inkrementalni davač)
Rotacijski davači postaju sve popularniji jer možete koristiti dvije funkcije u jednom električnom modulu: jednostavan prekidač za potvrdu rada i okretni davač za navigaciju, npr. kroz meni.
Inkrementalni rotacijski davač generira dva izlazna signala dok se osovina okreće. Ovisno o smjeru, jedan od signala vodi drugi. (vidi dole)
Korak 1: Razumijevanje izlaznih podataka
Kao što vidite kada se vratilo davača počne okretati u smjeru kazaljke na satu, izlaz A prvo pada na LOW, a izlaz B slijedi. U smjeru suprotnom od kazaljke na satu, radnja se okreće suprotno.
Sada samo moramo ovo implementirati na naš µController (koristio sam Arduino Nano).
Korak 2: Izgradite krug
Kao što sam već opisao, izlazi stvaraju HIGH i LOW bok. Da bismo postigli čistu HIGH vrijednost na podatkovnom pinu A i B µControlera, moramo dodati otpornike za povlačenje. Uobičajeni pin C ide ravno u zemlju za LOW bok.
Za dobivanje informacija o unutarnjem prekidaču (tipkalo) upotrijebit ćemo druga dva pina. Jedan od njih ide na VCC, a drugi na podatkovni pin µControlera. Moramo dodati i pull-down otpornik na pin za podatke kako bismo dobili čisti LOW.
Takođe je moguće koristiti interne otpornike za povlačenje i povlačenje vašeg µKontrolera!
U mom slučaju pinout izgleda ovako:
- +3, 3V => +3, 3V (Arduino) (takođe +5V moguće)
- GND => GND (Arduino)
- A => Pin10
-
B =>
Pin
11
- C => GND
-
SW =>
Pin
12
Korak 3: Pisanje koda
int pinA = 10; // interni prekidač A int pinB = 11; // interni prekidač B int pinSW = 12; // prekidač (pritisnuti koder) int encoderPosCount = 0; // počinje na nuli, promijenite ako želite
int positionval;
bool switchval; int mrotateLast; int mrotate;
void setup () {
int mrotateLast = digitalRead (pinA); Serial.begin (9600); kašnjenje (50); }
void loop () {readencoder (); if (readwitch () == 1) {Serial.println ("Switch = 1"); }}
int readencoder () {
mrotate = digitalRead (pinA); if (mrotate! = mrotateLast) {// dugme se rotira if (digitalRead (pinB)! = mrotate) {// prekidač A se prvo menja -> rotirajući enkoder u smeru kazaljke na satuPosCount ++; Serial.println ("rotirano u smjeru kazaljke na satu"); } else {// prekidač B se prvo promijenio-> rotirajući koder u smjeru kazaljke na satuPosCount--; Serial.println ("rotirano u smjeru suprotnom od kazaljke na satu"); }
Serial.print ("Položaj kodera:"); Serial.println (encoderPosCount); Serial.println (""); } mrotateLast = mrotate; return encoderPosCount; } bool readwitch () {
if (digitalRead (pinSW)! = 0) {// prekidač je pritisnut
while (digitalRead (pinSW)! = 0) {} // prekidač je trenutno pritisnut switchval = 1; } else {switchval = 0;} // prekidač nije pritisnut return switchval; }
Sada možete okrenuti davač i varijabla enkoderPosCount će odbrojavati ako rotirate u smjeru kazaljke na satu i odbrojavati ako se okrećete u smjeru suprotnom od kazaljke na satu.
To je to! Jednostavno i korisno.
Slobodno promijenite i izvedite kod. Možete ga implementirati u svoj projekt.
Postavit ću i LED projekt u kojem sam pomoću kodera postavio svjetlinu LED dioda.