Obsah:

Jednoduchý rotační dekodér: 4 kroky
Jednoduchý rotační dekodér: 4 kroky

Video: Jednoduchý rotační dekodér: 4 kroky

Video: Jednoduchý rotační dekodér: 4 kroky
Video: Leap Motion SDK 2024, Červenec
Anonim
Image
Image
Jednoduchý rotační dekodér
Jednoduchý rotační dekodér

Tento návod popisuje jednoduchou metodu dekódování sekvenčního rotačního kodéru pomocí Arduino Uno R3.

Kompaktní softwarové rutiny slouží k počítání počtu přechodů, eliminaci odrazu kontaktů a určování směru otáčení. Další součásti a vyhledávací tabulky nejsou vyžadovány.

K dispozici jsou verze kódu s přerušením a bez přerušení.

Verze přerušení kódu vyžaduje pouze jeden pin přerušení.

Snímky:

  • Úvodní fotografie ukazuje sestavený kodér.
  • Snímek obrazovky ukazuje kód pro verzi přerušení a počet při otáčení hřídele kodéru ve směru hodinových ručiček a proti směru hodinových ručiček.
  • Video ukazuje počet během rychlého otáčení.

Krok 1: Schéma zapojení

Kruhový diagram
Kruhový diagram

Schéma zapojení kodéru je znázorněno na obr.1.

Propojovací vodiče jsou připájeny přímo k pinům kodéru.

Pokud je směr počítání obrácen, vyměňte dva modré vodiče.

Krok 2: Seznam dílů

Následující části byly získány z

  • 1 pouze Arduino UNO R3 s kabelem USB.
  • 1 pouze sekvenční rotační kodér (EC11 nebo ekvivalent) s přepínačem.
  • 1 knoflík pouze vhodný pro hřídel.
  • 3 pouze propojovací vodiče Arduino male-to-male.

Krok 3: Teorie

Teorie
Teorie

Sekvenční rotační kodéry generují dvě čtvercové vlny, z nichž každá je posunuta o 90 stupňů, jak ukazuje obrázek 1.

Logické vzorce na kontaktu A a kontaktu B se liší, když se hřídel otáčí ve směru hodinových ručiček (CW) a proti směru hodinových ručiček (CCW) přes polohy 1 až 6.

Mezi běžné metody určování směru otáčení patří:

  • Hardware
  • dvojitá přerušení
  • tabulky pro vyhledávání vzorů

Tento projekt používá softwarovou metodu, která nevyžaduje vyhledávací tabulky. [1]

Směr

Místo pohledu na výstupní vzory z Kontaktu A a Kontaktu B se zaměřme na Kontakt A.

Pokud po každém přechodu kontaktu A vzorkujeme kontakt B, všimneme si, že:

  • Když je kodér otočen CW, kontakt A a kontakt B mají opačné logické stavy
  • Kontakt A a kontakt B mají při otáčení kodéru CCW stejný logický stav

Aktuální kód:

// ----- Počítat přechody

CurrentStateA = stateContactA (); if (CurrentStateA! = LastStateA) {CurrentStateB = digitalRead (ContactB); if (CurrentStateA == CurrentStateB) Count ++; if (CurrentStateA! = CurrentStateB) Count--; LastStateA = CurrentStateA; }

Tato metoda nabízí následující výhody:

  • vyhledávací tabulky nejsou povinné
  • je vyžadován pouze jeden řádek přerušení

Debounce

Všechny mechanické enkodéry trpí „kontaktním odrazem“.

Pokud se spínací kontakt nevypne/nerozbije čistě, jeho logický stav bude rychle oscilovat od VYSOKÉ do NÍZKÉ, dokud se spínací kontakt neusadí. To má za následek falešné počty.

Jednou z metod potlačení odrazu kontaktů je přidání malého kondenzátoru přes každý spínací kontakt. Kondenzátor a přidružený výsuvný odpor tvoří integrátor, který účinně zkratuje vysoké frekvence a umožňuje elegantně stoupat/klesat spínací napětí.

Nevýhodou tohoto přístupu je, že přechody mohou být vynechány, pokud se hřídel kodéru rychle otáčí.

Software debouncing

Tato metoda používá dva čítače (otevřené, uzavřené), které byly nastaveny na nulu. [2]

Jakmile je u kontaktu A detekován přechod:

  • Průběžné hlasování Kontakt A.
  • Zvyšte počet otevřených čítačů a resetujte zavřený čítač, kdykoli je kontakt A VYSOKÝ.
  • Pokud je kontakt A NÍZKÝ, zvyšte počet zavřených počitadel a vynulujte počitadlo otevřených.
  • Ukončete smyčku, když jeden z čítačů dosáhne předem stanoveného počtu. Účinně hledáme období ustáleného stavu po každém kontaktu.

Aktuální kód:

// ----- Debounce Contact A

while (1) {if (digitalRead (ContactA)) {// ----- ContactA is Open Closed = 0; // Prázdný protilehlý integrátor Open ++; // Integrujte if (Open> MaxCount) return HIGH; } else {// ----- ContactA is Closed Open = 0; // Prázdný opačný integrátor Zavřeno ++; // Integrujte if (Closed> MaxCount) return LOW; }}

Kontakt B není nutné odstraňovat, protože přechody kontaktu A a kontaktu B se neshodují.

Počítací

Mechanická „zarážka“efektivně zdvojnásobí váš počet, protože mezi kliknutími se zaregistrují dvě počty (viz obr. 1).

Počet „detententů“lze určit pomocí aritmetiky modulo 2, jak je uvedeno níže.

Aktuální kód:

// ----- Spočítejte "detenty"

if (Count % 2 == 0) {Serial.print ("Count:"); Serial.println (počet / 2); }

Reference

Další informace naleznete na:

[1]

howtomechatronics.com/tutorials/arduino/ro…

[2]

newbiehack.com/ButtonorSwitchDebounceinSof…

Krok 4: Software

Tento projekt vyžaduje nejnovější verzi Ardino Uno R3 IDE (integrované vývojové prostředí), která je k dispozici na adrese

Stáhněte si každý z následujících dvou skic Arduina (přiložen)

  • rotary_encoder_1.ino (verze pro hlasování)
  • rotary_encoder_2.no (verze s přerušením)

Poklepejte na požadovanou verzi a postupujte podle pokynů na obrazovce.

Užívat si …

Kliknutím sem zobrazíte mé další pokyny.

Doporučuje: