
Innholdsfortegnelse:
2025 Forfatter: John Day | [email protected]. Sist endret: 2025-01-23 15:02

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



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



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

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

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:
IOT -løsning for delingssykkelen: 6 trinn

IOT -løsning for delingssykkelen: Delsykkelen er veldig populær i Kina i disse dager. Det er mer enn 10 merker av delingssykkel på markedet, og “ mobike ” er den mest kjente, den har mer enn 100 millioner registrerte brukere, og har spredt seg til andre byer enn
Bruke fingeravtrykkssensor for tidsoppmøte i kombinasjon med XAMP -løsning: 6 trinn (med bilder)

Bruke fingeravtrykkssensor for tidsoppmøte i kombinasjon med XAMP -løsning: For et skoleprosjekt lette vi etter en løsning på hvordan vi kan spore elevenes oppmøte. Mange av våre studenter kommer sent. Det er en kjedelig jobb å sjekke deres tilstedeværelse. På den annen side er det mye diskusjon fordi studenter ofte vil si
Sett LoRa IoTea -løsning: 5 trinn

Seeed LoRa IoTea Solution: Et automatisk system for innsamling av informasjon som brukes på teplantasje. Det er en del av intelligent landbruksinformasjonsinnsamling
Sett IoTea LoRa -løsning (oppdatering 1811): 5 trinn

Sett IoTea LoRa -løsning (oppdatering 1811): Internet+ er et populært konsept nå. Denne gangen prøvde vi Internett pluss jordbruk for å lage tehage som vokser ut på internett
Så IoTea LoRa -løsning (med Azure, oppdatering 1812): 5 trinn

Seeed IoTea LoRa Solution (with Azure, Update 1812): Microsoft Azure er en skytjeneste som gir kraftigere og mer stabil datakraft. Denne gangen prøvde vi å sende IoTea -dataene våre til den