Indholdsfortegnelse:

En komplet Arduino roterende løsning: 5 trin
En komplet Arduino roterende løsning: 5 trin

Video: En komplet Arduino roterende løsning: 5 trin

Video: En komplet Arduino roterende løsning: 5 trin
Video: Schlumberger Stabilock 4040 0.4 to 990Mhz repair power supply teardown (part 1) 2024, Juli
Anonim
En komplet Arduino Rotary Solution
En komplet Arduino Rotary Solution

Rotary encoders er drejeknapper til elektroniske projekter, der ofte bruges sammen med Arduino -familiens mikrokontroller. De kan bruges til at finjustere parametre, navigere i menuer, flytte objekter på skærmen, indstille værdier af enhver art. De er almindelige erstatninger for potentiometre, fordi de kan drejes mere præcist og uendeligt, de øger eller formindsker en diskret værdi ad gangen og integreres ofte med en skubbar kontakt til valgfunktioner. De findes i alle former og størrelser, men den laveste prisklasse er vanskelig at grænseflade med som forklaret nedenfor.

Der er utallige artikler om arbejdsdetaljer og brugstilstande for Rotary encoders og adskillige prøvekoder og biblioteker om, hvordan de bruges. Det eneste problem er, at ingen af dem fungerer 100% præcist med de laveste prisklasser kinesiske roterende moduler.

Trin 1: Rotary Encoders inde

Roterende encodere inde
Roterende encodere inde
Roterende encodere inde
Roterende encodere inde
Roterende encodere inde
Roterende encodere inde

Den roterende del af encoderen har tre ben (og to mere til den valgfri switchdel). Den ene er fælles (sort GND), de to andre er til bestemmelse af retning, når knappen drejes (de kaldes ofte blå CLK og rød DT). Begge disse er knyttet til en PULLUP -indgangsstift på mikrokontrolleren, hvilket gør niveauet HØJT til deres standardaflæsning. Når knappen drejes fremad (eller med uret), falder først den blå CLK til niveau LOW, derefter følger den røde DT. Når vi vender yderligere, stiger blå CLK tilbage til HIGH, da den fælles GND -patch forlader begge forbindelsesstifter, stiger rød DT også tilbage til HIGH. Således fuldføres ét helt kryds FWD (eller med uret). Det samme gælder den anden retning BWD (eller mod uret), men nu falder rødt først, og blå stiger sidst tilbage som vist i henholdsvis de to niveaubilleder.

Trin 2: Elendighed, der forårsager reel smerte for mange

Elendighed, der forårsager reel smerte for mange
Elendighed, der forårsager reel smerte for mange
Elendighed, der forårsager reel smerte for mange
Elendighed, der forårsager reel smerte for mange
Elendighed, der forårsager reel smerte for mange
Elendighed, der forårsager reel smerte for mange

Almindeligt problem for Arduino -hobbyfolk, at billige Rotary encoder -moduler hopper over ekstra ændringer i udgangsniveauer, hvilket forårsager ekstra og forkerte målinger i retningstælling. Dette forhindrer fejlfri optælling og gør det umuligt at integrere disse moduler i præcise roterende projekter. Disse ekstra studs er forårsaget af de mekaniske bevægelser af lapperne over forbindelsesstifterne, og selv påføring af ekstra kondensatorer kan ikke fjerne dem fuldstændigt. Bounces kan vises hvor som helst i de fulde krydscyklusser og illustreres af virkelige scenarier på billederne.

Trin 3: Finite State Machine (FSM) løsning

Finite State Machine (FSM) løsning
Finite State Machine (FSM) løsning

Billedet viser det fulde tilstandsrum for de mulige niveauændringer for de to ben (blå CLK og rød DT), både for korrekte og falske afvisninger. Baseret på denne tilstandsmaskine kan der programmeres en komplet løsning, der altid fungerer 100% nøjagtig. Fordi ingen filtreringsforsinkelser er nødvendige i denne løsning, er den også hurtigst mulig. En anden fordel ved at adskille stifternes tilstandsrum fra arbejdstilstanden er, at man kan anvende både polling eller afbrydelse til sin egen smag. Afstemning eller afbrydelser kan registrere niveauændringer på stifter, og en separat rutine vil beregne den nye tilstand baseret på den aktuelle tilstand og de faktiske begivenheder ved niveauændringer.

Trin 4: Arduino -kode

Arduino kode
Arduino kode

Koden herunder tæller FWD- og BWD -ticks på den serielle skærm og integrerer også den valgfri switchfunktion.

// Peter Csurgay 2019-04-10

// Stifter af roterende kort til Arduino -porte

#definer SW 21 #definer CLK 22 #definer DT 23

// Aktuel og tidligere værdi af tælleren, der er indstillet af drejeknappen

int curVal = 0; int prevVal = 0;

// Syv tilstande af FSM (finite state machine)

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

ugyldig opsætning () {

Serial.begin (250000); Serial.println ("Start …"); // Niveau HIGH vil være standard for alle pins pinMode (SW, INPUT_PULLUP); pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // Både CLK og DT udløser afbrydelser for alle niveauændringer attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }

void loop () {

// Håndtering af den valgfrie switch integreret i nogle roterende encodere hvis (digitalRead (SW) == LOW) {Serial.println ("Presset"); mens (! digitalRead (SW)); } // Enhver ændring i tællerværdi vises i Serial Monitor hvis (curVal! = PrevVal) {Serial.println (curVal); prevVal = curVal; }}

// State Machine -overgange til CLK -niveauændringer

void rotaryCLK () {if (digitalRead (CLK) == LOW) {if (state == IDLE_11) state = SCLK_01; ellers hvis (tilstand == SCLK_10) tilstand = SCLK_00; ellers hvis (tilstand == SDT_10) tilstand = SDT_00; } ellers {hvis (tilstand == SCLK_01) tilstand = IDLE_11; ellers hvis (tilstand == SCLK_00) tilstand = SCLK_10; ellers hvis (tilstand == SDT_00) tilstand = SDT_10; ellers hvis (tilstand == SDT_01) {tilstand = IDLE_11; curVal--; }}}

// State Machine -overgange til ændringer på DT -niveau

void rotaryDT () {if (digitalRead (DT) == LOW) {if (state == IDLE_11) state = SDT_10; ellers hvis (tilstand == SDT_01) tilstand = SDT_00; ellers hvis (tilstand == SCLK_01) tilstand = SCLK_00; } ellers {hvis (tilstand == SDT_10) tilstand = IDLE_11; ellers hvis (tilstand == SDT_00) tilstand = SDT_01; ellers hvis (tilstand == SCLK_00) tilstand = SCLK_01; ellers hvis (tilstand == SCLK_10) {tilstand = IDLE_11; curVal ++; }}}

Trin 5: Fejlfri integration

Du kan kontrollere i den vedhæftede video, at FSM -løsningen fungerer præcist og hurtigt, selv i tilfælde af lavdistance roterende encodere med forskellige sporadiske bounce -effekter.

Anbefalede: