Sadržaj:
2025 Autor: John Day | [email protected]. Zadnja promjena: 2025-01-13 06:57
Rotacijski davači su okretni upravljački gumbi za elektroničke projekte, koji se često koriste s mikrokontrolerima obitelji Arduino. Mogu se koristiti za fino podešavanje parametara, navigaciju po izbornicima, pomicanje objekata na zaslonu, postavljanje bilo koje vrste vrijednosti. Uobičajene su zamjene za potenciometre, jer se mogu točnije i beskonačno rotirati, povećavaju ili umanjuju jednu po jednu diskretnu vrijednost, a često su integrirane s prekidačem koji se može pritisnuti za funkcije odabira vrste. Dolaze u svim oblicima i veličinama, ali s najnižim cjenovnim razredom teško je sučeliti kako je objašnjeno u nastavku.
Postoji bezbroj članaka o radnim pojedinostima i načinima korištenja rotacijskih davača, te brojni uzorci kodova i knjižnica o tome kako ih koristiti. Jedini je problem što nitko od njih ne radi 100% točno s najnižim cjenovnim razredom kineskih rotacijskih modula.
Korak 1: Rotacijski davači iznutra
Okretni dio davača ima tri igle (i još dvije za dodatni dio sklopke). Jedan je zajednička osnova (crni GND), druga dva služe za određivanje smjera pri okretanju gumba (često se nazivaju plavi CLK i crveni DT). Oboje je spojeno na PULLUP ulazni pin mikrokontrolera, pa je razina HIGH njihovo zadano očitanje. Kad je gumb okrenut prema naprijed (ili u smjeru kazaljke na satu), prvo plavi CLK pada na razinu LOW, zatim slijedi crveni DT. Okrećući se dalje, plavi CLK raste natrag do HIGH -a, a kako uobičajena GND zakrpa napušta oba priključka, crveni DT se također podiže na HIGH. Time se dovršava jedan puni pogon naprijed (ili u smjeru kazaljke na satu). Isto vrijedi i za drugi smjer BWD-a (ili u smjeru suprotnom od kazaljke na satu), ali sada crvena pada prva, a plava se posljednja uzdiže nazad kao što je prikazano na slikama na dvije razine.
Korak 2: Bijeda koja mnogima nanosi pravu bol
Uobičajeni problem za ljubitelje Arduina je to što jeftini moduli rotacijskog kodera poništavaju dodatne promjene u izlaznim razinama, uzrokujući dodatna i pogrešna očitanja broja smjera. To sprječava besprijekorno brojanje i onemogućuje integraciju ovih modula u točne rotacijske projekte. Ta dodatna odbijanja uzrokovana su mehaničkim pokretima zakrpa preko priključnih pinova, pa čak i primjenom dodatnih kondenzatora ne možete ih u potpunosti ukloniti. Odbijanje se može pojaviti bilo gdje u cijelom ciklusu označavanja, a ilustrirano je stvarnim scenarijima na slikama.
Korak 3: Rješenje konačnih strojeva (FSM)
Slika prikazuje cijeli prostor stanja mogućih promjena razine za dva pina (plavi CLK i crveni DT), kako za ispravne tako i za lažne odboje. Na temelju ovog stroja za stanje može se programirati cjelovito rješenje koje uvijek radi 100% točno. Budući da u ovom rješenju nisu potrebna odgode filtriranja, ono je i najbrže moguće. Još jedna prednost odvajanja prostora stanja pinova od načina rada je ta što se prema vlastitim željama mogu primijeniti i načini prozivanja ili prekid. Anketiranje ili prekidi mogu otkriti promjene razine na pinovima, a zasebna rutina izračunat će novo stanje na temelju trenutnog stanja i stvarnih događaja promjena razine.
Korak 4: Arduino kod
Donji kod broji krpelje FWD i BWD na serijskom monitoru, a također integrira opcijsku funkciju prekidača.
// Peter Csurgay 2019-04-10
// Igle rotacijskog preslikavanja u Arduino portove
#define SW 21 #define CLK 22 #define DT 23
// Trenutna i prethodna vrijednost brojača podešena pomoću rotacije
int curVal = 0; int prevVal = 0;
// Sedam stanja FSM -a (stroj konačnih stanja)
#define IDLE_11 0 #define SCLK_01 1 #define SCLK_00 2 #define SCLK_10 3 #define SDT_10 4 #define SDT_00 5 #define SDT_01 6 int state = IDLE_11;
void setup () {
Serial.begin (250000); Serial.println ("Start …"); // Razina HIGH bit će zadana za sve pinove pinMode (SW, INPUT_PULLUP); pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // I CLK i DT će pokrenuti prekide za sve promjene razine attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }
void loop () {{100} {101}
// Rukovanje opcijskim prekidačem integriranim u neke rotacijske davače if (digitalRead (SW) == LOW) {Serial.println ("Pressed"); while (! digitalRead (SW)); } // Svaka promjena vrijednosti brojača prikazuje se u Serijskom monitoru if (curVal! = PrevVal) {Serial.println (curVal); prevVal = curVal; }}
// Prijelazi državnog stroja za promjene razine CLK
void rotaryCLK () {if (digitalRead (CLK) == LOW) {if (stanje == IDLE_11) stanje = SCLK_01; else if (stanje == SCLK_10) stanje = SCLK_00; else if (stanje == SDT_10) stanje = SDT_00; } else {if (stanje == SCLK_01) stanje = IDLE_11; else if (stanje == SCLK_00) stanje = SCLK_10; else if (stanje == SDT_00) stanje = SDT_10; else if (stanje == SDT_01) {stanje = IDLE_11; curVal--; }}}
// Prijelazi državnog stroja za promjene razine DT
void rotaryDT () {if (digitalRead (DT) == LOW) {if (stanje == IDLE_11) stanje = SDT_10; else if (stanje == SDT_01) stanje = SDT_00; else if (stanje == SCLK_01) stanje = SCLK_00; } else {if (stanje == SDT_10) stanje = IDLE_11; else if (stanje == SDT_00) stanje = SDT_01; else if (stanje == SCLK_00) stanje = SCLK_01; else if (stanje == SCLK_10) {stanje = IDLE_11; curVal ++; }}}
Korak 5: Besprijekorna integracija
U priloženom videu možete provjeriti radi li FSM rješenje točno i brzo čak i u slučaju rotacijskih davača niskog dometa s različitim sporadičnim efektima odbijanja.