October 14, 2021

Kaip veikia „Rotary Encoder“ ir kaip jį naudoti su „Arduino“

Read Time:5 Minute, 27 Second

Šioje pamokoje sužinosime, kaip veikia sukamasis enkoderis ir kaip jį naudoti su „Arduino“. Galite žiūrėti šį vaizdo įrašą arba perskaityti toliau pateiktą rašytinę pamoką.

REKOMENDUOJAMAS
8 geriausi „Arduino“ pradedančiųjų rinkiniai pradedantiesiems 2019 m
Apžvalga


Rotacinis kodavimo įrenginys yra padėties jutiklio tipas, naudojamas nustatyti besisukančio veleno kampinę padėtį. Jis generuoja analoginį arba skaitmeninį elektrinį signalą pagal sukimosi judesį.

Rotacinis kodavimo modulis

Yra daugybė skirtingų sukamųjų enkoderių tipų, kurie klasifikuojami pagal išėjimo signalą arba jutimo technologiją. Konkretus sukamasis enkoderis, kurį naudosime šioje pamokoje, yra inkrementinis sukamasis enkoderis ir tai paprasčiausias padėties jutiklis sukimui matuoti.

Rotacinių enkoderių klasifikacija

Šis sukamasis koderis taip pat žinomas kaip kvadratinis kodatorius arba santykinis rotacinis koduotojas, o jo išvestis yra kvadratinių bangų impulsų serija.

Kaip veikia „Rotary Encoder“


Pažvelkime iš arčiau į kodavimo įrenginį ir pamatysime jo veikimo principą. Štai kaip generuojami kvadratinių bangų impulsai: Koduotojas turi diską su tolygiai išdėstytomis kontaktinėmis zonomis, sujungtas su bendru kaiščiu C ir dviem kitais atskirais kontaktiniais kaiščiais A ir B, kaip parodyta žemiau.

Rotary Encoder Kaip tai veikia darbo principas

Kai diskas pradės suktis žingsnis po žingsnio, kaiščiai A ir B pradės kontaktuoti su bendru kaiščiu ir atitinkamai bus generuojami du kvadratinių bangų išėjimo signalai.

Bet kurį iš dviejų išėjimų galima naudoti pasukamai padėčiai nustatyti, jei tik skaičiuosime signalo impulsus. Tačiau jei norime nustatyti ir sukimosi kryptį, turime atsižvelgti į abu signalus vienu metu.

Galime pastebėti, kad du išėjimo signalai yra pasislinkę 90 laipsnių kampu vienas nuo kito. Jei koduotojas sukasi pagal laikrodžio rodyklę, išėjimas A bus priešais išvestį B.

Rotacinio kodavimo įrenginio išvesties signalo veikimo principo nuotrauka

Taigi, jei kiekvieną kartą, kai keičiasi signalas, skaičiuosime žingsnius nuo aukšto iki mažo arba nuo mažo iki aukšto, tuo metu galime pastebėti, kad du išėjimo signalai turi priešingas vertes. Priešingai, jei koduotojas sukasi prieš laikrodžio rodyklę, išvesties signalai turi vienodas vertes. Taigi atsižvelgdami į tai, mes galime lengvai užprogramuoti savo valdiklį skaityti kodavimo priemonės padėtį ir sukimosi kryptį.

Rotacinio kodavimo įrenginio „Arduino“ pavyzdys


Pateikime praktišką jo pavyzdį naudodami „Arduino“. Konkretus modulis, kurį naudosiu šiame pavyzdyje, yra ant pertraukiamosios lentos ir turi penkis kaiščius. Pirmasis kaištis yra išėjimas A, antrasis kaištis yra išėjimas B, trečiasis kaištis yra mygtuko kaištis ir, žinoma, kiti du kaiščiai yra VCC ir GND kaištis.

„Rotary Encoder Arduino“ mokymo pavyzdys

Išvesties kaiščius galime prijungti prie bet kurio „Arduino“ plokštės skaitmeninio kaiščio.

Šiai „Arduino“ mokymo programai reikalingus komponentus galite gauti iš toliau pateiktų nuorodų:

Atskleidimas: tai yra filialų nuorodos. Kaip „Amazon“ partneris uždirbu iš kvalifikuotų pirkimų.

Pirminis kodas


Štai „Arduino“ kodas:

/*     Arduino Rotary Encoder Tutorial
 *      
 *  by Dejan Nedelkovski, www.HowToMechatronics.com
 *  
 */
 
 #define outputA 6
 #define outputB 7

 int counter = 0; 
 int aState;
 int aLastState;  

 void setup() { 
   pinMode (outputA,INPUT);
   pinMode (outputB,INPUT);
   
   Serial.begin (9600);
   // Reads the initial state of the outputA
   aLastState = digitalRead(outputA);   
 } 

 void loop() { 
   aState = digitalRead(outputA); // Reads the "current" state of the outputA
   // If the previous and the current state of the outputA are different, that means a Pulse has occured
   if (aState != aLastState){     
     // If the outputB state is different to the outputA state, that means the encoder is rotating clockwise
     if (digitalRead(outputB) != aState) { 
       counter ++;
     } else {
       counter --;
     }
     Serial.print("Position: ");
     Serial.println(counter);
   } 
   aLastState = aState; // Updates the previous state of the outputA with the current state
 }

Kodo aprašymas: Taigi pirmiausia turime apibrėžti kaiščius, prie kurių prijungtas mūsų koderis, ir apibrėžti keletą kintamųjų, reikalingų programai. Sąrankos skyriuje turime apibrėžti du kaiščius kaip įvestis, pradėti nuoseklųjį ryšį, kad rezultatai būtų spausdinami serijiniame monitoriuje, taip pat perskaityti pradinę išvesties A vertę ir įdėti vertę į kintamąjį aLastState.

Tada ciklo skyriuje mes dar kartą perskaitėme išvestį A, bet dabar mes įtraukėme vertę į aState kintamąjį. Taigi, jei pasuksime kodavimo įrenginį ir generuosime impulsą, šios dvi reikšmės skirsis ir pirmasis teiginys „jei“ taps teisingas. Iškart po to, naudodamiesi antruoju sakiniu „jei“, mes nustatome sukimosi kryptį. Jei išėjimo B būsena skiriasi nuo išėjimo A būsenos, skaitiklis bus padidintas vienu, kitaip jis bus sumažintas. Pabaigoje, išspausdinę rezultatus serijiniame monitoriuje, turime atnaujinti aLastState kintamąjį su aState kintamuoju.

Tai viskas, ko mums reikia šiam pavyzdžiui. Jei įkelsite kodą, paleiskite nuoseklųjį monitorių ir pradėkite sukti kodavimo įrenginį, tada mes pradėsime gauti nuoseklaus monitoriaus reikšmes. Konkretus mano turimas modulis sudaro 30 visų ciklų.

2 pavyzdys – žingsninio variklio valdymas naudojant sukamąjį kodavimo įrenginį


Be šio pagrindinio pavyzdžio, aš padariau dar vieną pavyzdį, kaip valdyti žingsninio variklio padėtį naudojant sukamąjį kodavimo įrenginį.

Žingsninio variklio valdymas naudojant Rotary Encoder

Štai šio pavyzdžio šaltinio kodas:

/*     Stepper Motor using a Rotary Encoder
 *      
 *  by Dejan Nedelkovski, www.HowToMechatronics.com
 *  
 */

 #include <LiquidCrystal.h> // includes the LiquidCrystal Library 
 LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7) 

// defines pins numbers
 #define stepPin 8 
 #define dirPin  9
 #define outputA 10
 #define outputB 11

 int counter = 0;
 int angle = 0; 
 int aState;
 int aLastState;  
 
void setup() {
  // Sets the two pins as Outputs
  pinMode(stepPin,OUTPUT); 
  pinMode(dirPin,OUTPUT);
  pinMode (outputA,INPUT);
  pinMode (outputB,INPUT);
  
  aLastState = digitalRead(outputA);
  lcd.begin(16,2); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display } 

}
void loop() {

  aState = digitalRead(outputA);
  
  if (aState != aLastState){     
     if (digitalRead(outputB) != aState) { 
       counter ++;
       angle ++;
       rotateCW();  
     }
     else {
       counter--;
       angle --;
       rotateCCW(); 
     }
     if (counter >=30 ) {
      counter =0;
     }
     
     lcd.clear();
     lcd.print("Position: ");
     lcd.print(int(angle*(-1.8)));
     lcd.print("deg"); 
     lcd.setCursor(0,0);
     
   }
  aLastState = aState;
}

void rotateCW() {
  digitalWrite(dirPin,LOW);
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(2000);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(2000); 
}
void rotateCCW() {
  digitalWrite(dirPin,HIGH);
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(2000);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(2000);   
}

Nedvejodami užduokite bet kurį klausimą toliau pateiktame komentarų skyriuje.

Happy
Happy
0 %
Sad
Sad
0 %
Excited
Excited
0 %
Sleepy
Sleepy
100 %
Angry
Angry
0 %
Surprise
Surprise
0 %

Average Rating

5 Star
0%
4 Star
100%
3 Star
0%
2 Star
0%
1 Star
0%

One thought on “Kaip veikia „Rotary Encoder“ ir kaip jį naudoti su „Arduino“

Leave a Reply

Your email address will not be published. Required fields are marked *

Previous post Kaip pasidaryti sodo žymes dažant akmenis
Next post Kaip gaminti „Origami“ popierinius „Fortune“ slapukus – nesudėtinga