Talaan ng mga Nilalaman:

Isang Kumpletong Arduino Rotary Solution: 5 Hakbang
Isang Kumpletong Arduino Rotary Solution: 5 Hakbang

Video: Isang Kumpletong Arduino Rotary Solution: 5 Hakbang

Video: Isang Kumpletong Arduino Rotary Solution: 5 Hakbang
Video: LDmicro 19: Rotary Encoder Menu Navigation (Microcontroller PLC Ladder Programming with LDmicro) 2024, Hulyo
Anonim
Isang Kumpletong Arduino Rotary Solution
Isang Kumpletong Arduino Rotary Solution

Ang mga rotary encoder ay maaaring i-turn knob para sa mga elektronikong proyekto, na madalas na ginagamit sa mga microcontroller ng pamilya Arduino. Maaari silang magamit upang pagmultahin ang mga parameter ng pag-tune, pag-navigate sa mga menu, paglipat ng mga bagay sa screen, itakda ang mga halaga ng anumang uri. Karaniwan silang mga kapalit para sa mga potentiometers, dahil maaari silang paikutin nang mas tumpak at walang hanggan, dagdagan o pagbawas ng isang discrete na halaga sa bawat oras, at madalas na isinama sa isang pushable switch para sa mga pagpipilian ng uri ng pagpili. Dumating ang mga ito sa lahat ng mga hugis at sukat, ngunit ang pinakamababang saklaw ng presyo ay mahirap i-interface tulad ng ipinaliwanag sa ibaba.

Mayroong hindi mabilang na mga artikulo tungkol sa mga detalyeng nagtatrabaho at mga mode ng paggamit ng Rotary encoder, at maraming mga sample code at aklatan kung paano ito gamitin. Ang tanging problema ay wala sa kanila ang gumagana nang 100% tumpak sa pinakamababang saklaw ng presyo ng mga module ng pag-ikot ng Tsino.

Hakbang 1: Mga Rotary Encoder Sa Loob

Rotary Encoder Sa Loob
Rotary Encoder Sa Loob
Rotary Encoder Sa Loob
Rotary Encoder Sa Loob
Rotary Encoder Sa Loob
Rotary Encoder Sa Loob

Ang umiikot na bahagi ng encoder ay may tatlong mga pin (at dalawa pa para sa opsyonal na bahagi ng paglipat). Ang isa ay karaniwang lupa (itim na GND), ang dalawa pa ay para sa pagtukoy ng direksyon kapag ang knob ay nakabukas (madalas silang tinatawag na asul na CLK at pulang DT). Ang parehong mga ito ay naka-attach sa isang PullUP input pin ng microcontroller, ginagawa ang antas na TAAS ang kanilang default na pagbabasa. Kapag ang knob ay naka-forward (o pakanan sa orasan), una ang asul na CLK ay nahuhulog sa antas na mababa, pagkatapos ay sumusunod ang pulang DT. Ang pag-on pa, ang asul na CLK ay tumataas pabalik sa TAAS, pagkatapos dahil ang karaniwang patch ng GND ay umalis sa parehong mga pin ng koneksyon, ang pulang DT ay tumataas din sa TAAS. Sa gayon nakumpleto ang isang buong tick FWD (o pakanan sa oras). Parehas ang papunta sa iba pang direksyon na BWD (o kontra-pakaliwa), ngunit ngayon ang pula ay unang nahuhulog, at ang asul ay tumaas pabalik tulad ng ipinakita sa dalawang antas ng mga imahe ayon sa pagkakabanggit.

Hakbang 2: Pagdurusa Na Nagdudulot ng Totoong Sakit para sa Marami

Kalungkutan Na Nagdudulot ng Totoong Sakit para sa Marami
Kalungkutan Na Nagdudulot ng Totoong Sakit para sa Marami
Kalungkutan Na Nagdudulot ng Totoong Sakit para sa Marami
Kalungkutan Na Nagdudulot ng Totoong Sakit para sa Marami
Kalungkutan Na Nagdudulot ng Totoong Sakit para sa Marami
Kalungkutan Na Nagdudulot ng Totoong Sakit para sa Marami

Karaniwang problema para sa mga hobbyist ng Arduino, na ang murang mga module ng Rotary encoder ay tumatalbog sa labis na mga pagbabago sa mga antas ng output, na nagdudulot ng labis at maling pagbasa ng bilang ng direksyon. Pinipigilan nito ang mabibilang na pagbibilang at ginagawang imposibleng isama ang mga modyul na ito sa tumpak na mga proyektong umiikot. Ang mga sobrang bounce na ito ay sanhi ng mga paggalaw ng mekanikal ng mga patch sa mga koneksyon na pin, at kahit na ang paglalapat ng labis na mga capacitor ay hindi matanggal ang mga ito nang buo. Ang mga bounce ay maaaring lumitaw kahit saan sa buong mga siklo ng tick, at isinalarawan ng mga senaryong totoong buhay sa mga imahe.

Hakbang 3: Solusyon ng Finite State Machine (FSM)

Solusyon ng Finite State Machine (FSM)
Solusyon ng Finite State Machine (FSM)

Ipinapakita ng imahe ang buong puwang ng estado ng mga posibleng pagbabago sa antas para sa dalawang pin (asul na CLK at pulang DT), kapwa para sa tama at maling bounce. Batay sa machine ng estado na ito ang isang kumpletong solusyon ay maaaring mai-program na laging gumagana 100% tumpak. Dahil hindi kinakailangan ng mga pagkaantala sa pag-filter sa solusyon na ito, ito rin ang pinakamabilis na posible. Ang isa pang pakinabang ng paghihiwalay ng puwang ng estado ng mga pin mula sa mode na pagtatrabaho ay ang isa ay maaaring mag-apply ng parehong mga botohan o makagambala na mga mode ayon sa kanyang gusto. Ang botohan o makagambala ay maaaring makakita ng mga pagbabago sa antas sa mga pin at isang magkakahiwalay na gawain ay kakalkulahin ang bagong estado batay sa kasalukuyang estado at aktwal na mga kaganapan ng mga pagbabago sa antas.

Hakbang 4: Arduino Code

Code ng Arduino
Code ng Arduino

Ang code sa ibaba ay binibilang ang mga FWD at BWD ticks sa serial monitor at isinasama din ang opsyonal na function ng switch.

// Peter Csurgay 2019-04-10

// Pins ng rotary na nai-map sa mga port ng Arduino

# tukuyin ang SW 21 # tukuyin ang CLK 22 # tukuyin ang DT 23

// Kasalukuyan at nakaraang halaga ng counter na naayos ng rotary

int curVal = 0; int prevVal = 0;

// Seven state of 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;

walang bisa ang pag-setup () {

Serial.begin (250000); Serial.println ("Start…"); // Antas ng TAAS ay magiging default para sa lahat ng mga pin pinMode (SW, INPUT_PULLUP); pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // Ang parehong CLK at DT ay magpapalitaw ng mga nakakagambala para sa lahat ng mga pagbabago sa antas na attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }

void loop () {

// Handling ng opsyonal na switch na isinama sa ilang mga rotary encoder kung (digitalRead (SW) == LOW) {Serial.println ("Pressed"); habang (! digitalRead (SW)); } // Anumang pagbabago sa halaga ng counter ay ipinapakita sa Serial Monitor kung (curVal! = PrevVal) {Serial.println (curVal); prevVal = curVal; }}

// Mga paglipat ng State Machine para sa mga pagbabago sa antas ng CLK

void rotaryCLK () {if (digitalRead (CLK) == LOW) {if (state == IDLE_11) state = SCLK_01; kung hindi man kung (estado == SCLK_10) estado = SCLK_00; kung hindi man kung (estado == SDT_10) estado = SDT_00; } iba pa {kung (estado == SCLK_01) estado = IDLE_11; kung hindi man kung (estado == SCLK_00) estado = SCLK_10; kung hindi man kung (estado == SDT_00) estado = SDT_10; kung hindi man (estado == SDT_01) {estado = IDLE_11; curVal--; }}}

// Mga paglipat ng State Machine para sa mga pagbabago sa antas ng DT

void rotaryDT () {if (digitalRead (DT) == LOW) {if (state == IDLE_11) state = SDT_10; kung hindi man kung (estado == SDT_01) estado = SDT_00; kung hindi man kung (estado == SCLK_01) estado = SCLK_00; } iba pa {kung (estado == SDT_10) estado = IDLE_11; kung hindi man kung (estado == SDT_00) estado = SDT_01; kung hindi man kung (estado == SCLK_00) estado = SCLK_01; kung hindi man kung (estado == SCLK_10) {estado = IDLE_11; curVal ++; }}}

Hakbang 5: Flawless Pagsasama

Maaari mong suriin sa naka-attach na video na ang solusyon sa FSM ay gumagana nang tumpak at mabilis kahit na sa kaso ng mababang saklaw na mga rotary encoder na may iba't ibang mga sporadic bounce effects.

Inirerekumendang: