Innehållsförteckning:

En komplett Arduino roterande lösning: 5 steg
En komplett Arduino roterande lösning: 5 steg

Video: En komplett Arduino roterande lösning: 5 steg

Video: En komplett Arduino roterande lösning: 5 steg
Video: Arduino Drum Sequencer: 8 spår, 16 steg per takt, 8 åtgärder per mönster 2024, Juli
Anonim
En komplett Arduino Rotary Solution
En komplett Arduino Rotary Solution

Rotary encoders är vridbara kontrollknappar för elektroniska projekt, som ofta används med Arduino -familjens mikrokontroller. De kan användas för att finjustera parametrar, navigera i menyer, flytta objekt på skärmen, ange värden av något slag. De är vanliga ersättare för potentiometrar, eftersom de kan roteras mer exakt och oändligt, de ökar eller minskar ett diskret värde i taget och integreras ofta med en skjutbar omkopplare för urvalsfunktioner. De finns i alla former och storlekar, men den lägsta prisklassen är svår att ansluta till som förklaras nedan.

Det finns otaliga artiklar om arbetsdetaljer och användningslägen för Rotary encoders, och många exempelkoder och bibliotek om hur man använder dem. Det enda problemet är att ingen av dem fungerar 100% exakt med de lägsta prisklasserna kinesiska roterande moduler.

Steg 1: Rotary Encoders inuti

Rotary Encoders inuti
Rotary Encoders inuti
Rotary Encoders inuti
Rotary Encoders inuti
Rotary Encoders inuti
Rotary Encoders inuti

Den roterande delen av givaren har tre stift (och två till för den valfria omkopplingsdelen). Den ena är gemensam grund (svart GND), de andra två är för att bestämma riktning när ratten vrids (de kallas ofta blå CLK och röd DT). Båda dessa är anslutna till en PULLUP -ingångsstift på mikrokontrollen, vilket gör nivån HÖG till deras standardavläsning. När vredet vrids framåt (eller medurs) faller först den blå CLK till nivå LÅG, sedan följer den röda DT. När vi vänder oss ytterligare, stiger blå CLK tillbaka till HIGH, då den gemensamma GND -patchen lämnar båda anslutningstapparna stiger röda DT också tillbaka till HIGH. Sålunda avslutas en hel bock FWD (eller medurs). Samma sak går åt andra hållet BWD (eller moturs), men nu faller rött först och blått stiger tillbaka sist som visas i de två nivåbilderna.

Steg 2: Elände som orsakar verklig smärta för många

Elände som orsakar verklig smärta för många
Elände som orsakar verklig smärta för många
Elände som orsakar verklig smärta för många
Elände som orsakar verklig smärta för många
Elände som orsakar verklig smärta för många
Elände som orsakar verklig smärta för många

Vanligt problem för Arduino -hobbyister, att billiga Rotary encoder -moduler studsar extra förändringar i utgångsnivåer, vilket orsakar extra och fel riktningsräkning. Detta förhindrar felfri räkning och gör det omöjligt att integrera dessa moduler i exakta roterande projekt. Dessa extra studsar orsakas av de mekaniska rörelserna hos lapparna över anslutningstapparna, och även applicering av extra kondensatorer kan inte eliminera dem helt. Bounces kan visas var som helst i hela fästingcyklerna och illustreras av verkliga scenarier på bilderna.

Steg 3: Finite State Machine (FSM) -lösning

Finite State Machine (FSM) -lösning
Finite State Machine (FSM) -lösning

Bilden visar hela tillståndsutrymmet för de möjliga nivåändringarna för de två stiften (blå CLK och röd DT), både för korrekta och falska studsar. Baserat på denna tillståndsmaskin kan en komplett lösning programmeras som alltid fungerar 100% korrekt. Eftersom inga filtreringsfördröjningar är nödvändiga i denna lösning är det också snabbast möjligt. En annan fördel med att skilja pinnarnas tillståndsutrymme från arbetsläget är att man kan tillämpa både polling- eller avbrottslägen efter eget tycke. Polling eller avbrott kan upptäcka nivåförändringar på stift och en separat rutin kommer att beräkna det nya tillståndet baserat på nuvarande tillstånd och faktiska händelser med nivåändringar.

Steg 4: Arduino -kod

Arduino -kod
Arduino -kod

Koden nedan räknar FWD- och BWD -fästingarna på den seriella bildskärmen och integrerar också den valfria switchfunktionen.

// Peter Csurgay 2019-04-10

// Stift för roteraren mappas till Arduino -portar

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

// Aktuellt och tidigare värde för räknaren som ställts in av roteraren

int curVal = 0; int prevVal = 0;

// Sju tillstånd av 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;

void setup () {

Serial.begin (250000); Serial.println ("Start …"); // Nivå HÖG kommer att vara standard för alla stift pinMode (SW, INPUT_PULLUP); pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // Både CLK och DT utlöser avbrott för alla nivåändringar attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }

void loop () {

// Hantering av den valfria omkopplaren integrerad i vissa roterande kodare om (digitalRead (SW) == LOW) {Serial.println ("Pressad"); medan (! digitalRead (SW)); } // Alla ändringar i räknarvärdet visas i Serial Monitor om (curVal! = PrevVal) {Serial.println (curVal); prevVal = curVal; }}

// State Machine -övergångar för CLK -nivåändringar

void rotaryCLK () {if (digitalRead (CLK) == LOW) {if (state == IDLE_11) state = SCLK_01; annars om (tillstånd == SCLK_10) tillstånd = SCLK_00; annars om (tillstånd == SDT_10) tillstånd = SDT_00; } annat {if (state == SCLK_01) state = IDLE_11; annars om (tillstånd == SCLK_00) tillstånd = SCLK_10; annars om (tillstånd == SDT_00) tillstånd = SDT_10; annars om (tillstånd == SDT_01) {tillstånd = IDLE_11; curVal--; }}}

// State Machine -övergångar för DT -nivåändringar

void rotaryDT () {if (digitalRead (DT) == LOW) {if (state == IDLE_11) state = SDT_10; annars om (tillstånd == SDT_01) tillstånd = SDT_00; annars om (tillstånd == SCLK_01) tillstånd = SCLK_00; } annat {if (state == SDT_10) state = IDLE_11; annars om (tillstånd == SDT_00) tillstånd = SDT_01; annars om (tillstånd == SCLK_00) tillstånd = SCLK_01; annars om (tillstånd == SCLK_10) {tillstånd = IDLE_11; curVal ++; }}}

Steg 5: Felfri integration

Du kan kontrollera i den bifogade videon att FSM -lösningen fungerar exakt och snabbt även vid roterande omkodare med låga avstånd med olika sporadiska studs -effekter.

Rekommenderad: