- Rotary Encoder at ang Mga Uri nito
- KY-040 Rotary Encoder Pinout at paglalarawan
- Paano Gumagana ang Rotary Encoder
- Kinakailangan ang Mga Bahagi
- PIC16F877A Rotary Encoder Interfacing Circuit Diagram
- Paliwanag sa Code
Ang Rotary encoder ay isang input device na makakatulong sa gumagamit na makipag-ugnay sa isang system. Mukhang mas katulad ng isang potensyomiter sa Radio ngunit naglalabas ito ng isang tren ng mga pulso na ginagawang natatangi ang application nito. Kapag pinaikot ang knob ng Encoder ay umiikot ito sa anyo ng maliliit na hakbang na tumutulong dito upang magamit para sa pagkontrol ng stepper / Servo motor, pag-navigate sa isang pagkakasunud-sunod ng menu at Pagtaas / pagbawas ng halaga ng isang numero at marami pang iba.
Sa artikulong ito, matututunan natin ang tungkol sa iba't ibang uri ng Rotary Encoder at kung paano ito gumagana. Kami ay din interface ito sa PIC Microcontroller PIC16F877A at kontrolin ang halaga ng isang integer sa pamamagitan ng pag-ikot ng Encoder at ipakita ang halaga nito sa isang 16 * 2 LCD screen. Sa pagtatapos ng tutorial na ito, magiging komportable ka sa paggamit ng isang Rotary Encoder para sa iyong mga proyekto. Magsimula na tayo…
Rotary Encoder at ang Mga Uri nito
Ang rotary encoder ay madalas na tinatawag na isang shaft encoder. Ito ay isang electromekanical transducer, nangangahulugang binabago nito ang mga paggalaw ng mekanikal sa mga elektronikong pulso o sa madaling salita binago nito ang posisyon ng anggulo o posisyon ng paggalaw o baras sa isang digital o analog signal. Binubuo ito ng isang knob kung saan kapag umiikot ay lilipat ng hakbang-hakbang at makakagawa ng isang pagkakasunud-sunod ng mga tren ng pulso na may paunang natukoy na lapad para sa bawat hakbang.
Maraming uri ng rotary encoder sa merkado na maaaring pumili ang taga-disenyo ng isa alinsunod sa kanyang aplikasyon. Ang mga pinakakaraniwang uri ay nakalista sa ibaba
- Karagdagang Encoder
- Ganap na Encoder
- Magnetic Encoder
- Optical Encoder
- Laser Encoder
Ang mga encoder na ito ay inuri batay sa signal ng Output at teknolohiya ng sensing, ang Incremental Encoder at Absolute Encoder ay inuri batay sa Output signal at ang Magnetic, Optical at Laser Encoder ay inuri batay sa Teknolohiya ng Sensing. Ang Encoder na ginamit dito ay isang Incremental type Encoder.
Nag- iimbak ang ganap na encoder ng impormasyon ng posisyon kahit na naalis ang kuryente, at magagamit ang impormasyon ng posisyon kapag muli naming inilalapat ang lakas dito.
Ang iba pang pangunahing uri, Incremental encoder ay nagbibigay ng data kapag binago ng encoder ang posisyon. Hindi nito maiimbak ang impormasyon sa posisyon.
KY-040 Rotary Encoder Pinout at paglalarawan
Ang mga pinout ng KY-040 Incremental type rotary encoder ay ipinapakita sa ibaba. Sa proyektong ito, ia-interface namin ang Rotary Encoder na ito sa sikat na microcontroller PIC16F877A mula sa microchip.
Ang unang dalawang pin (Ground at Vcc) ay ginagamit upang paandarin ang Encoder, karaniwang ginagamit ang supply ng 5V. Bukod sa pag-ikot ng knob sa orasan na matalino at laban sa pakaliwa na direksyon, ang encoder ay mayroon ding switch (Aktibo mababa) na maaaring mapindot sa pamamagitan ng pagpindot sa knob sa loob. Ang signal mula sa switch na ito ay nakuha sa pamamagitan ng pin 3 (SW). Sa wakas mayroon itong dalawang mga output pin (DT at CLK) na gumagawa ng mga waveform tulad ng napag-usapan sa ibaba. Na-interfaced namin ang Rotary Encoder na ito sa Arduino.
Paano Gumagana ang Rotary Encoder
Ang output ay ganap na nakasalalay sa panloob na tanso pad na nagbibigay ng koneksyon sa GND at VCC na may baras.
Mayroong dalawang bahagi ng Rotary Encoder. Ang Shaft Wheel na kung saan ay konektado sa baras at paikutin nang pakaliwa o laban sa pakaliwa depende sa pag-ikot ng poste, at ang base kung saan tapos ang koneksyon sa kuryente. Ang base ay may mga port o point na kung saan ay konektado sa DT o CLK sa isang paraan na kapag umiikot ang shaft wheel, ikokonekta nito ang mga base point at magbigay ng square wave sa parehong DT at CLK port.
Ang output ay magiging katulad kapag ang baras ay umiikot-
Dalawang port ang nagbibigay ng square square ngunit may bahagyang pagkakaiba sa tiyempo. Dahil dito, kung tatanggapin namin ang output bilang 1 at 0, maaari lamang magkaroon ng apat na estado, 0 0, 1 0, 1 1, 0 1. Tinutukoy ng pagkakasunud-sunod ng output ng binary ang pag-ikot sa pagliko o pag-ikot sa oras. Tulad ng, halimbawa, kung ang Rotary Encoder ay nagbibigay ng 1 0 sa idle na kondisyon at magbigay ng 1 1 pagkatapos nito, nangangahulugan iyon na binago ng encoder ang posisyon ng isang solong hakbang patungo sa direksyon ng relo, ngunit kung nagbibigay ito ng 0 0 pagkatapos ng idle 1 0, nangangahulugang ang baras ay binabago ang mga posisyon nito sa direksyon na laban sa pakaliwa na may isang hakbang.
Kinakailangan ang Mga Bahagi
Ito ang oras upang makilala kung ano ang kailangan natin upang mai-interface ang Rotary Encoder sa PIC Microcontroller,
- PIC16F877A
- 4.7k risistor
- 1k risistor
- 10k palayok
- 33pF ceramic disc capacitor - 2pcs
- 20Mhz na kristal
- 16x2 Ipakita
- Rotary Encoder
- 5V adapter.
- Lupon ng Tinapay
- Mga wire ng hookup.
PIC16F877A Rotary Encoder Interfacing Circuit Diagram
Nasa ibaba ang larawan ng pangwakas na pag-set up pagkatapos ikonekta ang mga bahagi ayon sa Circuit Diagram:
Gumamit kami ng isang solong 1K risistor para sa kaibahan ng LCD sa halip na gumamit ng potensyomiter. Gayundin, suriin ang buong gumaganang video na ibinigay sa dulo.
Paliwanag sa Code
Ang kumpletong PIC code ay ibinibigay sa pagtatapos ng proyektong ito na may isang demonstration video, narito ipinapaliwanag namin ang ilang mahahalagang bahagi ng code. Kung bago ka sa PIC Microcontroller pagkatapos sundin ang aming mga tutorial sa PIC mula sa simula.
Habang kami ay tinalakay bago, kailangan namin upang suriin ang mga output at ang pagkakaiba ng mga binary output para sa parehong DT at CLK, kaya lumikha kami ng isang kung-ibang bahagi para sa operasyon.
kung (Encoder_CLK! = posisyon) { kung (Encoder_DT! = posisyon) { // lcd_com (0x01); counter ++; // Taasan ang counter na mai-print sa lcd lcd_com (0xC0); lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, counter); } iba pa { // lcd_com (0x01); lcd_com (0xC0); counter--; // bawasan ang counter lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, counter); // lcd_puts ("Kaliwa"); } }
Kailangan din nating iimbak ang posisyon sa bawat hakbang. Upang magawa ito, gumamit kami ng isang variable na "posisyon" na nag-iimbak ng kasalukuyang posisyon.
posisyon = Encoder_CLK; // Ito ay upang maiimbak ang posisyon ng orasan ng encoder sa variable. Maaaring 0 o 1.
Maliban dito, ang isang pagpipilian ay ibinigay upang abisuhan ang tungkol sa switch pindutin sa LCD.
kung (Encoder_SW == 0) { sw_delayms (20); // debounce delay kung (Encoder_SW == 0) { // lcd_com (1); // lcd_com (0xC0); lcd_puts ("switch press"); // itoa (counter, halaga, 10); // lcd_puts (halaga);
Ang pagpapaandar ng system_init ay ginagamit upang simulan ang operasyon ng I / O na pin, LCD at upang maiimbak ang posisyon ng Rotary Encoder.
void system_init () { TRISB = 0x00; // PORT B bilang output, Ang port na ito ay ginagamit para sa LCD TRISDbits.TRISD2 = 1; TRISDbits.TRISD3 = 1; TRISCbits.TRISC4 = 1; lcd_init (); // Ito ang magpapasimula sa posisyon ng LCD = Encoder_CLK; // Na-sotro ang posisyon ng CLK sa init ng system, bago magsimula ang habang loop. }
Ang LCD function ay nakasulat sa lcd.c at lcd.h library kung saan idineklara ang lcd_puts (), lcd_cmd ().
Para sa variable na deklarasyon, mga bit ng pagsasaayos at iba pang mga code snippet, mangyaring hanapin ang buong code sa ibaba.