Sisukord:

Täielik Arduino pöördlahendus: 5 sammu
Täielik Arduino pöördlahendus: 5 sammu

Video: Täielik Arduino pöördlahendus: 5 sammu

Video: Täielik Arduino pöördlahendus: 5 sammu
Video: Control Position and Speed of Stepper motor with L298N module using Arduino 2024, Juuli
Anonim
Täielik Arduino pöördlahendus
Täielik Arduino pöördlahendus

Pöörlevad koodrid on elektrooniliste projektide jaoks pööratavad juhtnupud, mida sageli kasutatakse koos Arduino perekonna mikrokontrolleritega. Neid saab kasutada parameetrite peenhäälestamiseks, menüüdes navigeerimiseks, objektide liigutamiseks ekraanil, mis tahes väärtuste määramiseks. Need on potentsiomeetrite tavalised asendajad, kuna neid saab täpsemalt ja lõpmatult pöörata, nad suurendavad või vähendavad ühte diskreetset väärtust korraga ja on sageli integreeritud valikuliste funktsioonide jaoks lükatava lülitiga. Neid on igasuguse kuju ja suurusega, kuid madalaima hinnaklassiga on raske liituda, nagu allpool selgitatud.

Rotary -kodeerijate töö üksikasjade ja kasutusviiside kohta on lugematul hulgal artikleid ning nende kasutamise kohta on palju näidiskoode ja raamatukogusid. Ainus probleem on see, et ükski neist ei tööta 100% täpsusega madalaima hinnaklassi Hiina pöördmoodulitega.

Samm: pöörlevad kodeerijad sees

Pöörlevad kodeerijad sees
Pöörlevad kodeerijad sees
Pöörlevad kodeerijad sees
Pöörlevad kodeerijad sees
Pöörlevad kodeerijad sees
Pöörlevad kodeerijad sees

Koodri pöörleval osal on kolm tihvti (ja veel kaks lisavarustusse kuuluva lüliti jaoks). Üks on ühine (must GND), teised kaks on nupu keeramise suuna määramiseks (neid nimetatakse sageli siniseks CLK ja punaseks DT). Mõlemad on kinnitatud mikrokontrolleri PULLUP sisendpoldi külge, muutes taseme HIGH nende vaikeväärtuseks. Kui nuppu keeratakse ettepoole (või päripäeva), langeb kõigepealt sinine CLK tasemele LOW, seejärel järgneb punane DT. Edasi pöörates tõuseb sinine CLK tagasi HIGH -i, siis kui tavaline GND -plaaster jätab mõlemad ühendusnõelad, tõuseb ka punane DT tagasi HIGH -i. Täites seega ühe täieliku linnukese FWD (või päripäeva). Sama kehtib ka teises suunas BWD (või vastupäeva), kuid nüüd langeb kõigepealt punane ja sinine tõuseb viimasena tagasi, nagu on näidatud vastavalt kahetasandilistel piltidel.

2. samm: viletsus, mis põhjustab paljudele tõelist valu

Viletsus, mis põhjustab paljudele tõelist valu
Viletsus, mis põhjustab paljudele tõelist valu
Viletsus, mis põhjustab paljudele tõelist valu
Viletsus, mis põhjustab paljudele tõelist valu
Viletsus, mis põhjustab paljudele tõelist valu
Viletsus, mis põhjustab paljudele tõelist valu

Arduino harrastajatele tavaline probleem, et odavad pöörlevad kodeerimismoodulid tagastavad väljundtaseme täiendavaid muutusi, põhjustades täiendavaid ja valesid suunda. See hoiab ära veatu loendamise ja muudab võimatuks nende moodulite integreerimise täpsetesse pöörlevatesse projektidesse. Need lisapõrked on põhjustatud plaastrite mehaanilistest liikumistest ühenduse tihvtide kohal ja isegi lisakondensaatorite rakendamine ei suuda neid täielikult kõrvaldada. Põrked võivad ilmuda kõikjal puugitsüklites ja neid illustreerivad piltidel olevad reaalsed stsenaariumid.

3. samm: lõpliku oleku masina (FSM) lahendus

Finite State Machine (FSM) lahendus
Finite State Machine (FSM) lahendus

Pilt näitab kahe tihvti (sinine CLK ja punane DT) võimalike tasememuutuste täielikku olekuruumi, nii õigete kui ka valede põrkumiste korral. Selle olekumasina põhjal saab programmeerida terviklahenduse, mis töötab alati 100% täpselt. Kuna selles lahenduses ei ole vaja filtreerimise viivitusi, on see ka kiireim võimalik. Veel üks tihvtide olekuruumi töörežiimist eraldamise eelis on see, et saab oma maitse järgi rakendada nii küsitlus- kui ka katkestusrežiime. Küsitlus või katkestused võivad tuvastada nööpnõelte taseme muutusi ja eraldi rutiin arvutab uue oleku hetkeoleku ja taseme muutuste tegelike sündmuste põhjal.

Samm: Arduino kood

Arduino kood
Arduino kood

Allolev kood loeb jadamonitoril olevaid FWD- ja BWD -puuke ning sisaldab ka valikulist lülitusfunktsiooni.

// Peter Csurgay 10.04.2019

// Arduino sadamatega kaardistatud pöörleva tihvtid

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

// Pöördnupuga häälestatud loenduri praegune ja eelmine väärtus

int curVal = 0; int prevVal = 0;

// Seitse FSM olekut (piiratud olekuga masin)

#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;

tühine seadistus () {

Serial.begin (250000); Serial.println ("Alusta …"); // Kõigi nööpnõelte jaoks on vaikimisi tase HIGH pinMode (SW, INPUT_PULLUP); pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // Nii CLK kui ka DT käivitavad katkestused kõigi tasememuutuste korral attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }

void loop () {

// Valikulise lüliti käsitsemine, mis on integreeritud mõnedesse pöörlevatesse kodeerijatesse, kui (digitalRead (SW) == LOW) {Serial.println ("Pressed"); while (! digitalRead (SW)); } // Kõik loenduri väärtuse muutused kuvatakse Serial Monitoris, kui (curVal! = PrevVal) {Serial.println (curVal); prevVal = curVal; }}

// Olekumasina üleminekud CLK taseme muutuste jaoks

void rotaryCLK () {if (digitalRead (CLK) == LOW) {if (state == IDLE_11) state = SCLK_01; else if (olek == SCLK_10) olek = SCLK_00; else if (olek == SDT_10) olek = SDT_00; } else {if (state == SCLK_01) state = IDLE_11; else if (olek == SCLK_00) olek = SCLK_10; else if (olek == SDT_00) olek = SDT_10; muidu kui (olek == SDT_01) {olek = IDLE_11; kõver-; }}}

// Olekumasina üleminekud DT taseme muutuste jaoks

void rotaryDT () {if (digitalRead (DT) == LOW) {if (state == IDLE_11) state = SDT_10; else if (olek == SDT_01) olek = SDT_00; else if (olek == SCLK_01) olek = SCLK_00; } else {if (state == SDT_10) state = IDLE_11; else if (olek == SDT_00) olek = SDT_01; else if (olek == SCLK_00) olek = SCLK_01; muidu kui (olek == SCLK_10) {olek = IDLE_11; kõver ++; }}}

5. samm: veatu integreerimine

Lisatud videost saate kontrollida, kas FSM -lahendus töötab täpselt ja kiiresti isegi väikese vahelduva pöördkodeerija puhul, millel on erinevad juhuslikud põrkumisefektid.

Soovitan: