Innholdsfortegnelse:
- Trinn 1: Rotary Encoders Inside
- Trinn 2: Elendighet som forårsaker ekte smerte for mange
- Trinn 3: Finite State Machine (FSM) løsning
- Trinn 4: Arduino -kode
- Trinn 5: Feilfri integrasjon
Video: En komplett Arduino roterende løsning: 5 trinn
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-30 11:23
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
$ 2 Arduino. ATMEGA328 som frittstående. Enkelt, billig og veldig lite. en komplett guide.: 6 trinn (med bilder)
$ 2 Arduino. ATMEGA328 som frittstående. Enkelt, billig og veldig lite. en komplett guide.: I denne instruksjonsboken lærer du hvordan du bruker Arduino ATMEGA328 mikrokontrollerbrikke som en frittstående mikrokontroller. De koster bare 2 dollar, kan gjøre det samme som din Arduino og gjøre prosjektene dine ekstremt små. Vi dekker pin -layouten
Komplett Arduino-basert kjøretøy GPS+GPRS tyverisikringssystem: 5 trinn (med bilder)
Komplett Arduino-basert Vehicle GPS+GPRS Anti-tyverisystem: Hei alle sammen! Jeg ønsket å bygge en komplett løsning for en GPS-tyverisikringsenhet, som ville være: så billig som mulig så komplett som mulig som det bare fungerer -det er-ingenting-annet-å-gjøre som muligSå endte jeg med å bygge en Arduino-basert løsning