2014 m. gruodžio 22 d., pirmadienis

Rotary encoders naudojimas

Egzistuoja toks dalykas kaip rotary encoders (Rotaciniai enkoderiai?). Lemona juos vadina skaitmeniniais potenciometrais, ir tame yra truputis tiesios. Jie panašūs į potenciometrus, ir turi 3 išvadus, tačiau veikia visiškai skirtingai. Enkoderiai, juos sukant, išduoda skaitmeninius signalus. Jie patogūs naudoti todėl, kad yra prasisukantys, t.y. į vieną puse galima sukti kiek nori. Taip pat juos labai patogu jungti prie mikrovaldiklio. Nusprendžiau su jais pažaisti, ir nusipirkau 10vnt iš ebay'jaus už maždaug 2.5$.



 Jungimas paprastas - vidurinė koja į GND, kitos dvi kojos - tai A ir B. Ant A ir B užkabinami pull-up rezistoriai. Dabar, jei pajungsime oscilografą prie A ir B kojų ir pasuksime, pamatysime tokį vaizdą.

Geltonas - A, Mėlynas -B

Kaip matote, gauname du vienodus signalus tik pasislinkusius. Jei enkoderį suksime į kitą pusę, signalas gausis toks pats, tik iš kitos pusės. T.y. jeigu dabar kai A leidžiasi B būna 0V, tai sukant į kitą pusę, kai leisis B bus 5V. Žinant šį principą, labai lengva parašyti programą.


Parsisiųsti. Principas toks pats. Padarytas falling pertraukimas ant vieno iš dviejų kojų (A arba B). Falling reiškia, kad suveikia kai lygis keičiasi iš aukšto į žemą. Tada tikrinama ar kita koja tuo metu buvo aukštam ar žemam lygyje, ir pagal tai sprendžiama, ar pasukta pagal, ar prieš laikrodžio rodyklę.
Problema ta, kad programa nuskaito tik 1/4 visų būsenų. Tačiau man tai tik privalumas, nes pasukus rankenėlę vieną kartą (sukant jaučiasi toks tarsi treškėjimas, vienas kartas - tai vienas "stepas"), pereinama per visas 4 būsenas. Todėl jei nuskaitinėjant visas būsenas, pasukus vieną kartą, poz vertė pasikeistų per 4 vienetus.

Kita problema yra ta, kad kaip ir mygtukuose, enkoderiuose persijungiant būsenai atsiranda triukšmas, ir mikrovaldiklis tai gali interpretuoti kaip keletą pasukimų. Todėl juos reikia taip sakant "debouncinti".
Šis procesas gali būti dviejų rūšių : programinis, arba hardwarinis. Aš dažniausiai renkuosi hardwarinį, nes programavimas yra mano silpnoji pusė. Tam aš pasinaudojau tokia schema :

Viską sujungiame ir bandome

Rezultatai
Išbandžiau ir galiu pasakyti, kad veikia labai sklandžiai, neperšoko nei vieno skaičiaus - man tikrai labai patiko. Manau, kad tikrai naudosiu juos projektams, kur reikia ką nors reguliuoti, pvz.: laboratorinis maitinimo šaltinis. Dar vienas geras dalykas kurio nepaminėjau - šie enkoderiai turi integruotus mygtukus. Galima paspausti pačia ašį. Nuo savo oscilografo nusižiūrėjau, kad labai patogu ant tų mygtukų padaryti skalės keitimą. Pvz. jei reikia tikslaus nustatymo, paspaudi mygtuką, ir pereinama į mV reguliavimą, paspaudi dar kartą - grįžtama į V.

2 komentarai:

  1. Sveikas Dariau,

    Galvoju gal dar rasiu Tave. Norėjau paklausti gal žinai ar rotary encoderiai ant breakout board'o taip pat veikia? Schemą kurią bandau sujungti siūlo abu GND sulituoti, bet aš turiu rotary tiktais ant breakout'o ir ten vietoj GND/GND yra VCC/GND.. Ir atrodo kad negeneruoja signalų sukant :/.

    Radau tokį: http://circuit-diagramz.com/wp-content/uploads/2017/02/Arduino-Rotary-Encoder-Wiring-pinout-comparison.jpg

    AtsakytiPanaikinti
    Atsakymai
    1. Sveikas, ta nuoroda kurią radai tikrai keistai parodo rotary su breakout board, nes Vcc jam iš esmės nereikalingas (žinoma priklausomai nuo schemos gali reikėti pajungti ir VCC).

      Bet šiaip iš esmės ar su brekout board ar be, jie veikia identiškai. Spėju, kad ta breakout board tai tiesiog kontaktai išvesti. Gali būti kad VCC ir Switch yra du mygtuko išvadai, o GND, OUTA ir OUTB yra pačio enkoderio, dar vienas variantas kad GND ir Switch yra mygtuko, o VCC, OUTA ir OUTB enkoderio. Bet kokiu atveju jei turi multimetrą papraščiausiai būtų atsekti koks pin'as eina į kokią enkoderio koją(Galima ir pagal takelius bandyt pastebėti).

      Žinoma visa tai veiks tik jeigu ta breakout board yra paprastas kontaktų išvedimas. Pažiūrėk ar yra kitoje pusėje ant breakout board kokių detalių, jei taip tai tada apskritai kitokiu būdu reikia pajunginėti.

      Darius

      Panaikinti