Obsah:

Kompletní rotační řešení Arduino: 5 kroků
Kompletní rotační řešení Arduino: 5 kroků

Video: Kompletní rotační řešení Arduino: 5 kroků

Video: Kompletní rotační řešení Arduino: 5 kroků
Video: TOP 10 Počítačové lifehacky, které vám usnadní život 2024, Listopad
Anonim
Kompletní rotační řešení Arduino
Kompletní rotační řešení Arduino

Rotační kodéry jsou otočné ovládací knoflíky pro elektronické projekty, často používané s mikrokontroléry rodiny Arduino. Lze je použít k jemnému doladění parametrů, procházení nabídek, přesouvání objektů na obrazovce, nastavování hodnot jakéhokoli druhu. Jsou běžnou náhradou potenciometrů, protože je lze otáčet přesněji a nekonečně, zvyšují nebo snižují jednu diskrétní hodnotu najednou a často jsou integrovány s posuvným přepínačem pro funkce výběru druhu. Přicházejí ve všech tvarech a velikostech, ale nejnižší cenové rozpětí je obtížné propojit, jak je vysvětleno níže.

Existuje nespočet článků o pracovních podrobnostech a režimech použití rotačních kodérů a řada ukázkových kódů a knihoven o tom, jak je používat. Jediným problémem je, že žádný z nich nepracuje 100% přesně s čínskými rotačními moduly v nejnižší cenové kategorii.

Krok 1: Rotační kodéry uvnitř

Rotační kodéry uvnitř
Rotační kodéry uvnitř
Rotační kodéry uvnitř
Rotační kodéry uvnitř
Rotační kodéry uvnitř
Rotační kodéry uvnitř

Otočná část kodéru má tři kolíky (a dva další pro volitelnou část spínače). Jeden je společný (černý GND), další dva jsou pro určení směru při otočení knoflíku (často se jim říká modrá CLK a červená DT). Oba jsou připojeny ke vstupnímu kolíku PULLUP mikrokontroléru, takže úroveň HIGH je jejich výchozí hodnotou. Když je knoflík otočen dopředu (nebo ve směru hodinových ručiček), nejprve modrá CLK klesne na úroveň LOW, poté následuje červená DT. Při dalším otáčení modrá CLK stoupá zpět na HIGH, pak jak společná GND patch opouští oba připojovací piny, červená DT také stoupá zpět na HIGH. Dokončení jednoho úplného zaškrtnutí FWD (nebo ve směru hodinových ručiček). Totéž platí pro druhý směr BWD (nebo proti směru hodinových ručiček), ale nyní červená padá jako první a modrá stoupá zpět jako poslední, jak je znázorněno na dvouúrovňových obrázcích.

Krok 2: Bída, která mnohým způsobuje skutečnou bolest

Bída, která mnohým způsobuje skutečnou bolest
Bída, která mnohým způsobuje skutečnou bolest
Ubohost, která mnohým způsobuje skutečnou bolest
Ubohost, která mnohým způsobuje skutečnou bolest
Bída, která mnohým způsobuje skutečnou bolest
Bída, která mnohým způsobuje skutečnou bolest

Běžným problémem pro fandy Arduina je to, že levné rotační enkodérové moduly odrážejí zvláštní změny ve výstupních úrovních, což způsobuje další a nesprávné měření směru. To zabraňuje bezchybnému počítání a znemožňuje integraci těchto modulů do přesných rotačních projektů. Tyto zvláštní odskoky jsou způsobeny mechanickými pohyby záplat přes připojovací kolíky a dokonce ani použití přídavných kondenzátorů je nemůže zcela eliminovat. Odrazy se mohou objevit kdekoli v úplných cyklech zaškrtnutí a jsou ilustrovány skutečnými scénáři na obrázcích.

Krok 3: Řešení konečného stavu stroje (FSM)

Řešení konečného stavu stroje (FSM)
Řešení konečného stavu stroje (FSM)

Obrázek ukazuje plný stavový prostor možných změn úrovně pro dva piny (modrý CLK a červený DT), a to jak pro správné, tak pro falešné odrazy. Na základě tohoto stavového stroje lze naprogramovat kompletní řešení, které vždy funguje 100% přesně. Protože v tomto řešení nejsou nutná žádná zpoždění filtrování, je také nejrychlejší. Další výhodou oddělení stavového prostoru kolíků od pracovního režimu je to, že lze podle svého vkusu použít režimy pollingu nebo přerušení. Polling nebo přerušení mohou detekovat změny úrovně na pinech a samostatná rutina vypočítá nový stav na základě aktuálního stavu a skutečných událostí změn úrovně.

Krok 4: Arduino kód

Arduino kód
Arduino kód

Níže uvedený kód počítá zaškrtnutí FWD a BWD na sériovém monitoru a také integruje volitelnou funkci přepínače.

// Peter Csurgay 2019-04-10

// Piny rotátoru mapované na porty Arduino

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

// Aktuální a předchozí hodnota čítače vyladěná rotátorem

int curVal = 0; int prevVal = 0;

// Sedm stavů FSM (konečný stavový automat)

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

neplatné nastavení () {

Serial.begin (250000); Serial.println ("Start …"); // Úroveň VYSOKÁ bude výchozí pro všechny piny pinMode (SW, INPUT_PULLUP); pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // CLK i DT spustí přerušení pro všechny změny úrovně attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }

prázdná smyčka () {

// Ovládání volitelného přepínače integrovaného do některých rotačních kodérů if (digitalRead (SW) == LOW) {Serial.println ("Pressed"); while (! digitalRead (SW)); } // Jakákoli změna hodnoty čítače se zobrazí v Serial Monitor if (curVal! = PrevVal) {Serial.println (curVal); prevVal = curVal; }}

// Přechody State Machine pro změny na úrovni CLK

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

// Přechody State Machine pro změny na úrovni DT

neplatné rotaryDT () {if (digitalRead (DT) == LOW) {if (state == IDLE_11) state = SDT_10; else if (state == SDT_01) state = SDT_00; else if (state == SCLK_01) state = SCLK_00; } else {if (state == SDT_10) state = IDLE_11; else if (state == SDT_00) state = SDT_01; else if (state == SCLK_00) state = SCLK_01; else if (stav == SCLK_10) {stav = IDLE_11; curVal ++; }}}

Krok 5: Bezchybná integrace

V přiloženém videu si můžete ověřit, že řešení FSM funguje přesně a rychle i v případě rotačních kodérů s nízkým dosahem s různými sporadickými efekty odrazu.

Doporučuje: