Innholdsfortegnelse:

En komplett Arduino roterende løsning: 5 trinn
En komplett Arduino roterende løsning: 5 trinn

Video: En komplett Arduino roterende løsning: 5 trinn

Video: En komplett Arduino roterende løsning: 5 trinn
Video: Leader LMV-89 2 channel AC Millivoltmeter Teardown and simple test 2024, Juli
Anonim
En komplett Arduino roterende løsning
En komplett Arduino roterende løsning

Rotary encoders er dreibare kontrollknapper for elektroniske prosjekter, ofte brukt med Arduino -familiens mikrokontrollere. De kan brukes til å finjustere parametere, navigere i menyer, flytte objekter på skjermen, sette verdier av noe slag. De er vanlige erstatninger for potensiometre, fordi de kan roteres mer nøyaktig og uendelig, de øker eller reduserer en diskret verdi om gangen, og ofte integrert med en trykkbar bryter for valgfunksjoner. De kommer i alle former og størrelser, men den laveste prisklassen er vanskelig å koble til som forklart nedenfor.

Det finnes utallige artikler om arbeidsdetaljer og bruksmåter for Rotary encoders, og mange eksempler på koder og biblioteker om hvordan du bruker dem. Det eneste problemet er at ingen av dem fungerer 100% nøyaktig med de laveste prisklasser kinesiske rotasjonsmoduler.

Trinn 1: Rotary Encoders Inside

Rotary Encoders inni
Rotary Encoders inni
Rotary Encoders inni
Rotary Encoders inni
Rotary Encoders inni
Rotary Encoders inni

Den roterende delen av koderen har tre pinner (og to til for den valgfrie bryterdelen). Den ene er felles grunn (svart GND), de to andre er for å bestemme retningen når knappen dreies (de kalles ofte blå CLK og rød DT). Begge disse er festet til en PULLUP -inngangspinne på mikrokontrolleren, noe som gjør nivået HØY til standardverdien. Når knappen dreies fremover (eller med klokken), faller først den blå CLK til nivå LOW, deretter følger rød DT. Når vi vender videre, stiger blå CLK tilbake til HIGH, da den vanlige GND -lappen forlater begge tilkoblingspinnene, stiger også rød DT tilbake til HIGH. Dermed fullfører du en full kryss FWD (eller med klokken). Det samme gjelder den andre retningen BWD (eller mot klokken), men nå faller rødt først, og blå stiger sist tilbake som vist i henholdsvis de to nivåbildene.

Trinn 2: Elendighet som forårsaker ekte smerte for mange

Elendighet som forårsaker ekte smerte for mange
Elendighet som forårsaker ekte smerte for mange
Elendighet som forårsaker ekte smerte for mange
Elendighet som forårsaker ekte smerte for mange
Elendighet som forårsaker ekte smerte for mange
Elendighet som forårsaker ekte smerte for mange

Vanlig problem for Arduino -hobbyister, at billige Rotary encoder -moduler spretter ekstra endringer i utgangsnivåer, noe som forårsaker ekstra og feil retningstelling. Dette forhindrer feilfri telling og gjør det umulig å integrere disse modulene i nøyaktige roterende prosjekter. Disse ekstra sprettene skyldes de mekaniske bevegelsene til lappene over tilkoblingspinnene, og selv påføring av ekstra kondensatorer kan ikke eliminere dem helt. Sprett kan vises hvor som helst i hele kryssesyklusene, og illustreres av virkelige scenarier på bildene.

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

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

Bildet viser hele tilstandsrommet for de mulige nivåendringene for de to pinnene (blå CLK og rød DT), både for riktige og falske avvisninger. Basert på denne tilstandsmaskinen kan det programmeres en komplett løsning som alltid fungerer 100% nøyaktig. Fordi ingen filtreringsforsinkelser er nødvendige i denne løsningen, er den også raskest mulig. En annen fordel med å skille pinners tilstandsrom fra arbeidsmodus er at man kan anvende både avstemnings- eller avbruddsmoduser til sin egen smak. Avstemning eller avbrudd kan oppdage nivåendringer på pinner, og en egen rutine vil beregne den nye tilstanden basert på nåværende tilstand og faktiske hendelser med nivåendringer.

Trinn 4: Arduino -kode

Arduino -koden
Arduino -koden

Koden nedenfor teller FWD- og BWD -merkene på den serielle skjermen og integrerer også den valgfrie bryterfunksjonen.

// Peter Csurgay 2019-04-10

// Pins av roterende kartlagt til Arduino -porter

#definere SW 21 #definere CLK 22 #definere DT 23

// Gjeldende og forrige verdi på telleren som er innstilt av dreieknappen

int curVal = 0; int prevVal = 0;

// Syv tilstander av FSM (endelig tilstandsmaskin)

#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 oppsett () {

Serial.begin (250000); Serial.println ("Start …"); // Nivå HØY vil være standard for alle pins pinMode (SW, INPUT_PULLUP); pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // Både CLK og DT vil utløse avbrudd for alle nivåendringer attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }

void loop () {

// Håndtering av valgfri bryter integrert i noen roterende kodere hvis (digitalRead (SW) == LOW) {Serial.println ("Presset"); mens (! digitalRead (SW)); } // Enhver endring i tellerverdi vises i Serial Monitor hvis (curVal! = PrevVal) {Serial.println (curVal); prevVal = curVal; }}

// State Machine -overganger for CLK -nivåendringer

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; } annet {if (state == SCLK_01) state = IDLE_11; ellers hvis (tilstand == SCLK_00) tilstand = SCLK_10; ellers hvis (tilstand == SDT_00) tilstand = SDT_10; ellers hvis (state == SDT_01) {state = IDLE_11; curVal--; }}}

// State Machine -overganger for DT -nivåendringer

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; } annet {if (state == SDT_10) state = IDLE_11; ellers hvis (tilstand == SDT_00) tilstand = SDT_01; ellers hvis (tilstand == SCLK_00) tilstand = SCLK_01; ellers hvis (state == SCLK_10) {state = IDLE_11; curVal ++; }}}

Trinn 5: Feilfri integrasjon

Du kan sjekke i den vedlagte videoen at FSM -løsningen fungerer nøyaktig og raskt, selv ved roterende encodere med lav rekkevidde med forskjellige sporadiske spretteffekter.

Anbefalt: