Kazalo:

Popolna Arduino rotacijska rešitev: 5 korakov
Popolna Arduino rotacijska rešitev: 5 korakov

Video: Popolna Arduino rotacijska rešitev: 5 korakov

Video: Popolna Arduino rotacijska rešitev: 5 korakov
Video: Высокая плотность 2022 2024, Julij
Anonim
Popolna Arduino rotacijska rešitev
Popolna Arduino rotacijska rešitev

Rotacijski dajalniki so vrtljivi gumbi za upravljanje elektronskih projektov, ki se pogosto uporabljajo z mikrokrmilniki družine Arduino. Uporabljajo se lahko za natančno nastavitev parametrov, krmarjenje po menijih, premikanje predmetov na zaslonu, nastavljanje kakršnih koli vrednosti. So običajne zamenjave potenciometrov, saj jih je mogoče natančneje in neskončno vrteti, povečujejo ali zmanjšujejo eno diskretno vrednost naenkrat in pogosto integrirane s stikalom za pritisk za funkcije izbire vrste. Na voljo so v vseh oblikah in velikostih, vendar je najnižji cenovni razred težko povezati, kot je razloženo spodaj.

Obstaja nešteto člankov o delovnih podrobnostih in načinih uporabe rotacijskih kodirnikov ter številne vzorčne kode in knjižnice o njihovi uporabi. Edina težava je, da nobeden od njih ne deluje 100% natančno z najnižjim cenovnim razredom kitajskih rotacijskih modulov.

Korak: Rotacijski dajalniki znotraj

Rotacijski dajalniki znotraj
Rotacijski dajalniki znotraj
Rotacijski dajalniki znotraj
Rotacijski dajalniki znotraj
Rotacijski dajalniki znotraj
Rotacijski dajalniki znotraj

Vrtljivi del dajalnika ima tri zatiče (in še dva za izbirni del stikala). Eden je skupna točka (črni GND), druga dva za določanje smeri, ko je gumb obrnjen (pogosto jih imenujemo modri CLK in rdeči DT). Oba sta pritrjena na vhodni pin PULLUP mikrokrmilnika, zaradi česar je raven HIGH njihova privzeta vrednost. Ko gumb obrnete naprej (ali v smeri urinega kazalca), najprej modra CLK pade na raven LOW, nato sledi rdeča DT. Če se še obrnemo, se modri CLK dvigne nazaj na HIGH, nato pa skupni obliž GND zapusti oba priključna zatiča, rdeči DT pa se dvigne nazaj na HIGH. Tako dokončate eno polno oznako FWD (ali v smeri urinega kazalca). Enako velja v drugo smer BWD (ali v nasprotni smeri urinega kazalca), zdaj pa rdeča najprej pade, modra pa se nazadnje dvigne nazaj, kot je prikazano na slikah na dveh ravneh.

2. korak: beda, ki mnogim povzroča resnično bolečino

Beda, ki mnogim povzroča resnično bolečino
Beda, ki mnogim povzroča resnično bolečino
Beda, ki mnogim povzroča resnično bolečino
Beda, ki mnogim povzroča resnično bolečino
Beda, ki mnogim povzroča resnično bolečino
Beda, ki mnogim povzroča resnično bolečino

Pogosta težava ljubiteljev Arduina je, da poceni moduli rotacijskega dajalnika odbijajo dodatne spremembe v izhodnih nivojih, kar povzroča dodatne in napačne odčitke števila smeri. To preprečuje brezhibno štetje in onemogoča integracijo teh modulov v natančne rotacijske projekte. Ti dodatni odkloni so posledica mehanskih premikov obližev po priključnih zatičih in tudi uporaba dodatnih kondenzatorjev jih ne more popolnoma odpraviti. Odkloni se lahko pojavijo kjer koli v celotnem ciklu klopov in so ponazorjeni s scenariji iz resničnega življenja na slikah.

3. korak: Rešitev končnega državnega stroja (FSM)

Rešitev končnega strojnega stroja (FSM)
Rešitev končnega strojnega stroja (FSM)

Slika prikazuje celoten prostor možnih sprememb ravni za dva zatiča (modra CLK in rdeča DT), tako za pravilne kot lažne odboje. Na podlagi tega strojnega stroja je mogoče programirati popolno rešitev, ki vedno deluje 100% natančno. Ker pri tej rešitvi niso potrebne zamude pri filtriranju, je tudi najhitrejša možna. Druga prednost ločevanja prostora stanja zatičev od delovnega načina je, da lahko po lastni želji uporabimo tako način glasovanja kot prekinitev. Anketiranje ali prekinitve lahko zaznajo spremembe ravni na zatičih, ločena rutina pa bo izračunala novo stanje na podlagi trenutnega stanja in dejanskih dogodkov sprememb ravni.

4. korak: Arduino koda

Koda Arduino
Koda Arduino

Spodnja koda šteje kljukice FWD in BWD na serijskem monitorju in vključuje tudi dodatno funkcijo stikala.

// Peter Csurgay 2019-04-10

// Zatiči rotacijskega kartiranja v vrata Arduino

#define SW 21 #define CLK 22 #define DT 23

// Trenutna in prejšnja vrednost števca, nastavljenega z vrtljivim gumbom

int curVal = 0; int prevVal = 0;

// Sedem stanj FSM (stroj s končnimi stanji)

#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 ("Začni …"); // Raven HIGH bo privzeta za vse zatiče pinMode (SW, INPUT_PULLUP); pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // Tako CLK kot DT sprožita prekinitve za vse spremembe ravni attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotacijskiDT, CHANGE); }

void loop () {

// Upravljanje dodatnega stikala, integriranega v nekatere rotacijske dajalnike if (digitalRead (SW) == LOW) {Serial.println ("Pressed"); medtem ko (! digitalRead (SW)); } // Vsaka sprememba števca je prikazana v Serijskem monitorju if (curVal! = PrevVal) {Serial.println (curVal); prevVal = curVal; }}

// Prehodi državnega stroja za spremembe ravni CLK

void rotaryCLK () {if (digitalRead (CLK) == LOW) {if (stanje == IDLE_11) stanje = SCLK_01; sicer, če (stanje == SCLK_10) stanje = SCLK_00; else if (stanje == SDT_10) stanje = SDT_00; } else {if (stanje == SCLK_01) stanje = IDLE_11; sicer, če (stanje == SCLK_00) stanje = SCLK_10; else if (stanje == SDT_00) stanje = SDT_10; sicer if (stanje == SDT_01) {stanje = IDLE_11; curVal--; }}}

// Prehodi državnega stroja za spremembe ravni DT

void rotaryDT () {if (digitalRead (DT) == LOW) {if (stanje == IDLE_11) stanje = SDT_10; else if (stanje == SDT_01) stanje = SDT_00; sicer, če (stanje == SCLK_01) stanje = SCLK_00; } else {if (stanje == SDT_10) stanje = IDLE_11; else if (stanje == SDT_00) stanje = SDT_01; sicer, če (stanje == SCLK_00) stanje = SCLK_01; sicer če (stanje == SCLK_10) {stanje = IDLE_11; curVal ++; }}}

5. korak: brezhibna integracija

V priloženem videu lahko preverite, ali rešitev FSM deluje natančno in hitro tudi v primeru rotacijskih kodirnikov nizkega dosega z različnimi sporadičnimi učinki odboja.

Priporočena: