Cuprins:

O soluție rotativă completă Arduino: 5 pași
O soluție rotativă completă Arduino: 5 pași

Video: O soluție rotativă completă Arduino: 5 pași

Video: O soluție rotativă completă Arduino: 5 pași
Video: De ce ar trebui sa avem macar un singur Arduino original? 👨🏼‍💻 👩🏼‍💻 2024, Noiembrie
Anonim
O soluție rotativă Arduino completă
O soluție rotativă Arduino completă

Codificatoarele rotative sunt butoane de control rotative pentru proiecte electronice, adesea utilizate cu microcontrolerele familiei Arduino. Acestea pot fi utilizate pentru a regla fin parametrii, a naviga prin meniuri, a muta obiecte pe ecran, a seta valori de orice fel. Acestea sunt înlocuiri obișnuite pentru potențiometre, deoarece pot fi rotite mai precis și infinit, ele incrementează sau scad o valoare discretă la un moment dat și sunt adesea integrate cu un comutator împingător pentru funcții de selecție. Sunt disponibile în toate formele și dimensiunile, dar gama de prețuri cea mai mică este dificil de interfațat, așa cum se explică mai jos.

Există nenumărate articole despre detaliile de lucru și modurile de utilizare a codificatoarelor rotative și numeroase exemple de coduri și biblioteci despre cum să le utilizați. Singura problemă este că niciunul dintre aceștia nu funcționează 100% exact cu modulele rotative chinezești cu cea mai mică gamă de prețuri.

Pasul 1: Codificatoare rotative în interior

Codificatoare rotative în interior
Codificatoare rotative în interior
Codificatoare rotative în interior
Codificatoare rotative în interior
Codificatoare rotative în interior
Codificatoare rotative în interior

Partea rotativă a codificatorului are trei pini (și încă doi pentru partea opțională a comutatorului). Unul este un teren comun (GND negru), celelalte două sunt pentru a determina direcția când butonul este rotit (acestea sunt adesea numite albastru CLK și roșu DT). Ambele acestea sunt atașate la un pin de intrare PULLUP al microcontrolerului, făcând nivelul ÎNALT citirea lor implicită. Când butonul este rotit înainte (sau în sensul acelor de ceasornic), mai întâi CLK albastru cade la nivelul LOW, apoi urmează DT roșu. Întorcându-se mai departe, CLK albastru se ridică înapoi la HIGH, apoi pe măsură ce patch-ul GND comun părăsește ambii pini de conexiune, DT roșu se ridică și la HIGH. Completând astfel o bifare completă FWD (sau în sensul acelor de ceasornic). Același lucru este valabil și în cealaltă direcție BWD (sau în sens invers acelor de ceasornic), dar acum roșul cade mai întâi, iar albastrul crește înapoi ultima, așa cum se arată în imaginile cu două niveluri.

Pasul 2: Mizeria care provoacă dureri reale pentru mulți

Mizeria care provoacă dureri reale pentru mulți
Mizeria care provoacă dureri reale pentru mulți
Mizeria care provoacă dureri reale pentru mulți
Mizeria care provoacă dureri reale pentru mulți
Mizeria care provoacă dureri reale pentru mulți
Mizeria care provoacă dureri reale pentru mulți

Problemă obișnuită pentru pasionații Arduino, că modulele ieftine de codificare rotativă saltează modificări suplimentare în nivelurile de ieșire, provocând citiri suplimentare și greșite ale numărării direcțiilor. Acest lucru previne numărarea perfectă și face imposibilă integrarea acestor module în proiecte rotative precise. Aceste sărituri suplimentare sunt cauzate de mișcările mecanice ale plasturilor peste pinii de conectare și chiar și aplicarea condensatorilor suplimentari nu le poate elimina complet. Salturile pot apărea oriunde în ciclurile complete de bifare și sunt ilustrate de scenarii din viața reală pe imagini.

Pasul 3: soluție pentru mașina cu stat finit (FSM)

Soluție pentru mașina cu stat finit (FSM)
Soluție pentru mașina cu stat finit (FSM)

Imaginea arată spațiul complet al stării posibilelor modificări de nivel pentru cei doi pini (albastru CLK și roșu DT), atât pentru săraci corecte, cât și false. Pe baza acestei mașini de stare poate fi programată o soluție completă care funcționează întotdeauna 100% precisă. Deoarece nu sunt necesare întârzieri de filtrare în această soluție, este și cea mai rapidă posibilă. Un alt avantaj al separării spațiului de stare al știfturilor de modul de lucru este acela că se pot aplica ambele moduri de interogare sau de întrerupere după propriul său gust. Interogarea sau întreruperile pot detecta modificări de nivel pe pini și o rutină separată va calcula starea nouă pe baza stării actuale și a evenimentelor efective de schimbări de nivel.

Pasul 4: Cod Arduino

Cod Arduino
Cod Arduino

Codul de mai jos numără bifele FWD și BWD de pe monitorul serial și, de asemenea, integrează funcția de comutare opțională.

// Peter Csurgay 2019-04-10

// Pinii rotativului mapat la porturile Arduino

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

// Valoarea curentă și anterioară a contorului reglat de rotativ

int curVal = 0; int prevVal = 0;

// Șapte stări ale FSM (mașină cu stări finite)

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

configurare nulă () {

Serial.begin (250000); Serial.println ("Start …"); // Nivelul HIGH va fi implicit pentru toți pinii PinMode (SW, INPUT_PULLUP); pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // Atât CLK, cât și DT vor declanșa întreruperi pentru toate modificările de nivel attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }

bucla nulă () {

// Manipularea comutatorului opțional integrat în unele codificatoare rotative if (digitalRead (SW) == LOW) {Serial.println ("Pressed"); while (! digitalRead (SW)); } // Orice modificare a valorii contorului este afișată în Serial Monitor dacă (curVal! = PrevVal) {Serial.println (curVal); prevVal = curVal; }}

// State Machine tranziții pentru modificări de nivel CLK

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; curVal--; }}}

// State Machine tranziții pentru modificări de nivel DT

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; curVal ++; }}}

Pasul 5: integrare perfectă

Puteți verifica în videoclipul atașat că soluția FSM funcționează cu precizie și rapiditate chiar și în cazul codificatoarelor rotative cu rază mică de acțiune, cu diverse efecte sporadice.

Recomandat: