Video: Jednoduchý rotačný dekodér: 4 kroky
2025 Autor: John Day | [email protected]. Naposledy zmenené: 2025-01-13 06:58
Tento návod popisuje jednoduchý spôsob dekódovania sekvenčného rotačného snímača pomocou Arduino Uno R3.
Kompaktné softvérové rutiny sa používajú na počítanie počtu prechodov, elimináciu odrazu kontaktov a určovanie smeru otáčania. Ďalšie komponenty a vyhľadávacie tabuľky nie sú potrebné.
K dispozícii sú verzie kódu s prerušením a bez prerušenia.
Verzia prerušenia kódu vyžaduje iba jeden PIN prerušenia.
Snímky:
- Úvodná fotografia zobrazuje zostavený kodér.
- Snímka obrazovky zobrazuje kód pre verziu prerušenia a počet pri otáčaní hriadeľa snímača v smere a proti smeru hodinových ručičiek.
- Video zobrazuje počet počas rýchleho otáčania.
Krok 1: Schéma zapojenia
Schéma zapojenia snímača je znázornená na obr.1.
Prepojovacie vodiče sú spájkované priamo na kolíky kodéra.
Ak je smer počítania obrátený, vymeňte dva modré vodiče.
Krok 2: Zoznam dielov
Nasledujúce diely boli získané z
- 1 iba Arduino UNO R3 s káblom USB.
- 1 iba sekvenčný rotačný snímač (EC11 alebo ekvivalent) s vypínačom.
- 1 iba gombík vhodný pre hriadeľ.
- 3 iba prepojovacie vodiče Arduino muž-muž.
Krok 3: Teória
Sekvenčné rotačné kodéry generujú dve štvorcové vlny, z ktorých každá je posunutá o 90 stupňov, ako je znázornené na obr.
Logické vzorce na kontakte A a kontakte B sa líšia, keď sa hriadeľ otáča v polohách 1 až 6 v smere hodinových ručičiek (CW) a proti smeru hodinových ručičiek (CCW).
Bežné metódy určovania smeru otáčania zahŕňajú:
- hardvér
- dvojité prerušenia
- tabuľky na vyhľadávanie vzorov
Tento projekt používa softvérovú metódu, ktorá nevyžaduje vyhľadávacie tabuľky. [1]
Smer
Namiesto toho, aby sme sa pozreli na výstupné vzorce z kontaktov A a kontaktu B, zamerajme sa na kontakt A.
Ak po každom prechode kontaktu A vzorkujeme kontakt B, všimneme si, že:
- Keď je kodér otočený CW, kontakt A a kontakt B majú opačné logické stavy
- Kontakt A a kontakt B majú rovnaký logický stav, keď je kodér otočený CCW
Skutočný kód:
// ----- Počítanie prechodov
CurrentStateA = stateContactA (); if (CurrentStateA! = LastStateA) {CurrentStateB = digitalRead (ContactB); if (CurrentStateA == CurrentStateB) Count ++; if (CurrentStateA! = CurrentStateB) Count--; LastStateA = CurrentStateA; }
Táto metóda ponúka nasledujúce výhody:
- vyhľadávacie tabuľky nie sú povinné
- je vyžadovaný iba jeden prerušovací riadok
Debounce
Všetky mechanické enkodéry trpia „kontaktným nárazom“.
Ak sa prepínací kontakt nevypne/nerozbije čisto, jeho logický stav bude rýchlo oscilovať od HIGH do LOW, kým sa kontakt spínača neusadí. Výsledkom sú nesprávne počty.
Jednou z metód na potlačenie odrazu kontaktu je pridanie malého kondenzátora na každý prepínací kontakt. Kondenzátor a súvisiaci zdvíhací odpor tvoria integrátor, ktorý efektívne skratuje vysoké frekvencie a umožňuje elegantne stúpať/klesať napätie prepínača.
Temnejšou stránkou tohto prístupu je, že pri rýchlom otáčaní hriadeľa snímača môžu byť prechody vynechané.
Software debouncing
Táto metóda používa dva počítadlá (otvorené, zatvorené), ktoré boli nastavené na nulu. [2]
Akonáhle je v kontakte A zistený prechod:
- Priebežná anketa Kontakt A.
- Zvýšte počet otvorených počítadiel a vynulujte počítadlo zatvorení vždy, keď je kontakt A VYSOKÝ.
- Zvýšte počet zatvorených počítadiel a vynulujte počítadlo otvorení, kedykoľvek je kontakt A NÍZKY.
- Opustite slučku, keď jeden z počítadiel dosiahne vopred určený počet. Účinne hľadáme obdobie ustáleného stavu po každom kontaktnom odskoku.
Skutočný kód:
// ----- Debounce Contact A
while (1) {if (digitalRead (ContactA)) {// ----- ContactA is Open Closed = 0; // Prázdny protiľahlý integrátor Open ++; // Integrujte, ak (otvorené> MaxCount) vráti HIGH; } else {// ----- ContactA je zatvorený otvorený = 0; // Prázdny protiľahlý integrátor Zavretý ++; // Integrujte if (Closed> MaxCount) return LOW; }}
Nie je potrebné odstraňovať kontakt B, pretože prechody kontaktu A a kontaktu B sa nezhodujú.
Počítanie
Mechanická „zarážka“efektívne zdvojnásobí váš počet, pretože medzi kliknutiami sa zaznamenajú dve počty (pozri obr. 1).
Počet „aretácií“je možné určiť pomocou aritmetiky modulo 2, ako je uvedené nižšie.
Skutočný kód:
// ----- Počítajte „detenty“
if (Count % 2 == 0) {Serial.print ("Count:"); Serial.println (počet / 2); }
Referencie
Ďalšie informácie nájdete na:
[1]
howtomechatronics.com/tutorials/arduino/ro…
[2]
newbiehack.com/ButtonorSwitchDebounceinSof…
Krok 4: Softvér
Tento projekt vyžaduje najnovšiu verziu integrovaného vývojového prostredia Ardino Uno R3 IDE, ktorá je k dispozícii na adrese
Stiahnite si každú z nasledujúcich dvoch skíc Arduino (priložené)
- rotary_encoder_1.ino (verzia pre hlasovanie)
- rotary_encoder_2.no (prerušená verzia)
Dvakrát kliknite na požadovanú verziu a postupujte podľa pokynov na obrazovke.
Užite si to …
Kliknutím sem zobrazíte ďalšie moje pokyny.