Sadržaj:

Potpuno Arduino rotacijsko rješenje: 5 koraka
Potpuno Arduino rotacijsko rješenje: 5 koraka

Video: Potpuno Arduino rotacijsko rješenje: 5 koraka

Video: Potpuno Arduino rotacijsko rješenje: 5 koraka
Video: Lesson 97: Controlling Servo Motor using Rotary Encoder and Display Angle On LCD 2024, Novembar
Anonim
Potpuno Arduino rotacijsko rješenje
Potpuno Arduino rotacijsko rješenje

Rotacijski davači su okretni upravljački gumbi za elektroničke projekte, koji se često koriste s mikrokontrolerima porodice Arduino. Mogu se koristiti za fino podešavanje parametara, navigaciju kroz menije, pomicanje objekata na ekranu, postavljanje vrijednosti bilo koje vrste. To su uobičajene zamjene za potenciometre, jer se mogu rotirati preciznije i beskonačno, povećavaju ili smanjuju 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 rasponom cijena teško je spojiti kako je objašnjeno u nastavku.

Postoji bezbroj članaka o radnim detaljima i načinima korištenja rotacijskih davača, te brojni uzorci kodova i biblioteka o tome kako ih koristiti. Jedini problem je što nijedan od njih ne radi 100% precizno s najnižim cjenovnim razredom kineskih rotacijskih modula.

Korak 1: Rotacijski davači iznutra

Rotacijski davači iznutra
Rotacijski davači iznutra
Rotacijski davači iznutra
Rotacijski davači iznutra
Rotacijski davači iznutra
Rotacijski davači iznutra

Okretni dio davača ima tri pina (i još dva za opcionalni dio sklopke). Jedan je zajednička osnova (crni GND), druga dva služe za određivanje smjera pri okretanju dugmeta (često se nazivaju plavi CLK i crveni DT). Oboje je priključeno na PULLUP ulazni pin mikrokontrolera, pa nivo HIGH postaje njihovo zadano očitanje. Kada je gumb okrenut prema naprijed (ili u smjeru kazaljke na satu), prvo plavi CLK pada na nivo LOW, a 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 ide u drugom smjeru BWD (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 u dva nivoa.

Korak 2: Bijeda koja mnogima izaziva pravu bol

Bijeda koja mnogima izaziva pravu bol
Bijeda koja mnogima izaziva pravu bol
Bijeda koja mnogima izaziva pravu bol
Bijeda koja mnogima izaziva pravu bol
Bijeda koja mnogima izaziva pravu bol
Bijeda koja mnogima izaziva pravu bol

Uobičajeni problem za ljubitelje Arduina je to što jeftini moduli rotacijskog kodera odbijaju dodatne promjene u izlaznim nivoima, uzrokujući dodatna i pogrešna očitanja brojača smjerova. Ovo sprječava besprijekorno brojanje i onemogućava integraciju ovih modula u precizne rotacijske projekte. Ta dodatna odbijanja uzrokovana su mehaničkim pokretima zakrpa preko priključnih pinova, pa čak ni primjenom dodatnih kondenzatora ne možete ih u potpunosti ukloniti. Odbijanja se mogu pojaviti bilo gdje u cijelom ciklusu označavanja i ilustrirana su stvarnim scenarijima na slikama.

Korak 3: Rješenje konačnih državnih mašina (FSM)

Rešenje konačnih mašina (FSM)
Rešenje konačnih mašina (FSM)

Slika prikazuje cijeli prostor stanja mogućih promjena nivoa za dva pina (plavi CLK i crveni DT), kako za ispravne tako i za lažne odboje. Na osnovu ovog računara može se programirati potpuno rješenje koje uvijek radi 100% precizno. Budući da u ovom rješenju nisu potrebna odlaganja filtriranja, ono je i najbrže moguće. Još jedna prednost odvajanja prostora stanja pinova od radnog načina rada je ta što se po vlastitoj želji mogu primijeniti i načini prozivanja ili prekid. Anketiranje ili prekidi mogu otkriti promjene nivoa na pinovima, a zasebna rutina će izračunati novo stanje na osnovu trenutnog stanja i stvarnih događaja promjene nivoa.

Korak 4: Arduino kod

Arduino kod
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 na 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 (mašina 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 …"); // Nivo HIGH će biti zadani za sve pinove pinMode (SW, INPUT_PULLUP); pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // I CLK i DT će pokretati prekide za sve promjene nivoa 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 stanja 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--; }}}

// Prelazi 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 precizno i brzo čak i u slučaju rotacijskih enkodera niskog dometa s različitim sporadičnim efektima odbijanja.

Preporučuje se: