Turinys:

Pilnas „Arduino“rotacinis sprendimas: 5 žingsniai
Pilnas „Arduino“rotacinis sprendimas: 5 žingsniai

Video: Pilnas „Arduino“rotacinis sprendimas: 5 žingsniai

Video: Pilnas „Arduino“rotacinis sprendimas: 5 žingsniai
Video: Bings Latviski | ⭐ Bings: Labākās Epizodes ⭐ | 20 x Pilnas Epizodes 2024, Liepa
Anonim
Pilnas „Arduino“rotacinis sprendimas
Pilnas „Arduino“rotacinis sprendimas

Sukamieji kodavimo įrenginiai yra pasukami valdymo rankenėlės elektroniniams projektams, dažnai naudojami su „Arduino“šeimos mikrovaldikliais. Jie gali būti naudojami norint patikslinti parametrus, naršyti meniu, perkelti objektus ekrane, nustatyti bet kokios rūšies vertes. Jie yra paprasti potenciometrų pakaitalai, nes juos galima pasukti tiksliau ir be galo, jie padidina arba sumažina vieną atskirą vertę vienu metu ir dažnai yra integruoti su stumdomu jungikliu pasirinkimo funkcijoms atlikti. Jie būna įvairių formų ir dydžių, tačiau su mažiausiu kainų diapazonu sunku susieti, kaip paaiškinta toliau.

Yra daugybė straipsnių apie rotacinių kodavimo prietaisų darbo detales ir naudojimo būdus, taip pat daugybė pavyzdžių kodų ir bibliotekų, kaip juos naudoti. Vienintelė problema yra ta, kad nė vienas iš jų neveikia 100% tiksliai naudojant žemiausio kainų diapazono kinų rotacinius modulius.

1 žingsnis: rotaciniai kodavimo įrenginiai viduje

Rotaciniai kodavimo įtaisai viduje
Rotaciniai kodavimo įtaisai viduje
Rotaciniai kodavimo įtaisai viduje
Rotaciniai kodavimo įtaisai viduje
Rotaciniai kodavimo įtaisai viduje
Rotaciniai kodavimo įtaisai viduje

Sukamoji kodavimo dalis turi tris kaiščius (ir dar du papildomai jungiklio daliai). Vienas iš jų yra bendras (juodas GND), kiti du yra skirti krypties nustatymui sukant rankenėlę (jie dažnai vadinami mėlyna CLK ir raudona DT). Abu jie yra pritvirtinti prie mikrovaldiklio PULLUP įvesties kaiščio, todėl lygis HIGH yra numatytasis rodmuo. Kai rankenėlė pasukta į priekį (arba pagal laikrodžio rodyklę), pirmiausia mėlynas CLK nukrenta iki LOW lygio, po to seka raudona DT. Pasukus toliau, mėlynas CLK pakyla atgal į HIGH, tada, kai bendras GND pleistras palieka abu sujungimo kaiščius, raudonas DT taip pat pakyla į HIGH. Taigi užpildykite vieną pilną varnelę FWD (arba pagal laikrodžio rodyklę). Tas pats pasakytina ir kita kryptimi BWD (arba prieš laikrodžio rodyklę), tačiau dabar pirmiausia nukrinta raudona, o paskutinė vėl pakyla mėlyna spalva, kaip parodyta atitinkamai dviejų lygių vaizduose.

2 žingsnis: vargas, sukeliantis tikrą skausmą daugeliui

Vargas, sukeliantis tikrą skausmą daugeliui
Vargas, sukeliantis tikrą skausmą daugeliui
Vargas, sukeliantis tikrą skausmą daugeliui
Vargas, sukeliantis tikrą skausmą daugeliui
Vargas, sukeliantis tikrą skausmą daugeliui
Vargas, sukeliantis tikrą skausmą daugeliui

Dažna „Arduino“mėgėjų problema yra ta, kad pigūs rotacinio kodavimo moduliai atšaukia papildomus išvesties lygių pokyčius, sukeldami papildomus ir neteisingus krypties rodmenis. Taip išvengiama nepriekaištingo skaičiavimo ir neįmanoma integruoti šių modulių į tikslius sukamuosius projektus. Šiuos papildomus atšokimus sukelia mechaniniai pleistrų judesiai virš jungiamųjų kaiščių, ir net papildomi kondensatoriai negali jų visiškai pašalinti. Atšokimai gali atsirasti bet kurioje vietoje per visus varnelių ciklus ir vaizduojami realaus gyvenimo scenarijais.

3 žingsnis: baigtinės būsenos mašinos (FSM) sprendimas

Galutinės būsenos mašinos (FSM) sprendimas
Galutinės būsenos mašinos (FSM) sprendimas

Paveikslėlyje parodyta visa būsenų erdvė, kurioje galimi dviejų kaiščių (mėlynos spalvos CLK ir raudonos spalvos DT) lygio pokyčiai, tiek teisingi, tiek klaidingi atšokimai. Remiantis šia būsenos mašina, galima užprogramuoti išsamų sprendimą, kuris visada veikia 100% tiksliai. Kadangi šiame sprendime nereikia filtravimo vėlavimo, jis taip pat yra greičiausias. Kitas kaiščių būsenos erdvės atskyrimo nuo darbo režimo pranašumas yra tas, kad pagal savo skonį galima taikyti tiek apklausos, tiek pertraukimo režimus. Apklausa ar pertraukimai gali aptikti kaiščių lygio pokyčius, o atskira tvarka apskaičiuos naują būseną pagal esamą būseną ir faktinius lygio pokyčių įvykius.

4 žingsnis: „Arduino“kodas

Arduino kodas
Arduino kodas

Žemiau pateiktas kodas skaičiuoja serijinio monitoriaus FWD ir BWD erkutes, taip pat įtraukia papildomą jungiklio funkciją.

// Peter Csurgay 2019-04-10

// Sukamojo kaiščiai, susieti su Arduino uostais

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

// Dabartinė ir ankstesnė skaitiklis, sureguliuotas suktuku

int curVal = 0; int prevVal = 0;

// Septynios FSM (baigtinės būsenos mašinos) būsenos

#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 („Pradėti …“); // HIGH lygis bus numatytasis visų kaiščių pinMode (SW, INPUT_PULLUP); pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // Tiek CLK, tiek DT suaktyvins pertraukas visiems lygių pakeitimams attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }

void loop () {

// Pasirinktinio jungiklio, integruoto į kai kuriuos sukamuosius koduotuvus, valdymas, jei (digitalRead (SW) == LOW) {Serial.println ("Paspaustas"); while (! digitalRead (SW)); } // Bet koks skaitiklio vertės pasikeitimas rodomas serijiniame monitoriuje, jei (curVal! = PrevVal) {Serial.println (curVal); prevVal = kreivė; }}

// Būsenos mašinos perėjimai CLK lygio pokyčiams

void rotaryCLK () {if (digitalRead (CLK) == LOW) {if (state == IDLE_11) state = SCLK_01; else if (state == SCLK_10) state = SCLK_00; else if (state == SDT_10) state = SDT_00; } else {if (state == SCLK_01) state = IDLE_11; else if (state == SCLK_00) state = SCLK_10; else if (state == SDT_00) state = SDT_10; else if (state == SDT_01) {state = IDLE_11; kreivė--; }}}

// Būsenos mašinos perėjimai DT lygio pokyčiams

void rotaryDT () {if (digitalRead (DT) == LOW) {if (state == IDLE_11) state = SDT_10; else if (state == SDT_01) state = SDT_00; else if (state == SCLK_01) state = SCLK_00; } else {if (state == SDT_10) state = IDLE_11; else if (state == SDT_00) state = SDT_01; else if (state == SCLK_00) state = SCLK_01; else if (state == SCLK_10) {state = IDLE_11; kreivė ++; }}}

5 žingsnis: nepriekaištinga integracija

Pridėtame vaizdo įraše galite patikrinti, ar FSM sprendimas veikia tiksliai ir greitai, net ir esant mažo nuotolio rotaciniams koduotojams su įvairiais atsitiktiniais atšokimo efektais.

Rekomenduojamas: