Modul enokoder

Uvod

Modul enkoderja za hobby uporabo je elektronska naprava, ki pretvarja gibanje ali položaj (kot so koti, razdalje ali vrtilne hitrosti) v digitalni signal, ki ga lahko obdela mikrokontroler, računalnik ali druga elektronska vezja. Enkoderji se pogosto uporabljajo v robotiki, avtomatizaciji, CNC strojih, 3D tiskalnikih in drugih sistemih, kjer je natančno sledenje položaja ali gibanja ključnega pomena.

Za hobby uporabo obstajajo različni tipi enkoderjev, med katerimi so najpogostejši:

  1. Optični enkoderji: Ti enkoderji delujejo na principu prekinitve svetlobnega žarka, ki ga zaznavajo fotodioda ali fototranzistor. Optični enkoderji so običajno bolj natančni, vendar so lahko občutljivi na zunanje svetlobne vplive in prah.

  2. Magnetni enkoderji: Magnetni enkoderji uporabljajo Hall-efekt ali magnetorezistivne senzorje za zaznavanje sprememb magnetnega polja, ki jih povzročajo premikajoči se magnetni elementi. Magnetni enkoderji so bolj robustni in odporni na umazanijo ali prah, vendar so lahko manj natančni od optičnih enkoderjev.

  3. Mehanski enkoderji: Mehanski enkoderji uporabljajo fizični stik med premikajočimi se deli, kot so zobniki ali kontaktne plošče, za generiranje električnih signalov. Mehanski enkoderji so pogosto cenejši od optičnih ali magnetnih enkoderjev, vendar lahko zaradi obrabe in trenja povzročijo večjo napako.

Enkoderji za hobby uporabo so na voljo v različnih ločljivostih in velikostih ter so lahko enostavni za uporabo z mikrokontrolerji, kot so Arduino, Raspberry Pi in drugimi razvojnimi ploščami. Pri izbiri enkoderja za vaš projekt je pomembno upoštevati zahtevano natančnost, območje delovanja, robustnost in cenovni razpon.

Opis

V našem primeru gre za preprost enkoder, ki lahko nadomesti klasični potenciometer. Povežemo ga na mikrokrmilnik in nam služi kot zunanji modul za spreminjanje programske spremenljivke.

Prednost enkoderja je, da ga lahko neskončno vrtimo v eno ali drugo smer.

thumb

Specifikacije

 

  • Napajalna napetost: 5V

  • Vmesnik: digitalni

thumb

Programska koda

				
					const int interruptA = 0;       
const int interruptB = 1;       
int CLK = 2;     // PIN2
int DAT = 3;     // PIN3
int BUTTON = 4;  // PIN4
int LED1 = 5;    // PIN5
int LED2 = 6;    // PIN6
int COUNT = 0;

void setup() 
 {
  attachInterrupt(interruptA, RoteStateChanged, FALLING);
 // attachInterrupt(interruptB, buttonState, FALLING);
  pinMode(CLK, INPUT); 
  digitalWrite(2, HIGH);  // Pull High Restance  
  pinMode(DAT, INPUT); 
  digitalWrite(3, HIGH);  // Pull High Restance 
 
pinMode(BUTTON, INPUT); 
  digitalWrite(4, HIGH);  // Pull High Restance
  pinMode(LED1, OUTPUT); 
  pinMode(LED2, OUTPUT); 
   Serial.begin(9600);
 }


void loop() 
{
  if  (!(digitalRead(BUTTON))) 
    {
     COUNT = 0;  
     Serial.println("STOP COUNT = 0");
     digitalWrite(LED1, LOW);
     digitalWrite(LED2, LOW);
     delay (2000);
    }
     Serial.println(COUNT);  
}

//-------------------------------------------
void RoteStateChanged() //When CLK  FALLING READ DAT
{
 if  (digitalRead(DAT)) // When DAT = HIGH IS FORWARD
   {
    COUNT++;
    digitalWrite(LED1, HIGH);
    digitalWrite(LED2, LOW);
    delay(20);
   }
 else                   // When DAT = LOW IS BackRote
   {
    COUNT--;
    digitalWrite(LED2, HIGH);
    digitalWrite(LED1, LOW);
    delay(20);
   }
}const int interruptA = 0;       
const int interruptB = 1;       
int CLK = 2;     // PIN2
int DAT = 3;     // PIN3
int BUTTON = 4;  // PIN4
int LED1 = 5;    // PIN5
int LED2 = 6;    // PIN6
int COUNT = 0;

void setup() 
 {
  attachInterrupt(interruptA, RoteStateChanged, FALLING);
 // attachInterrupt(interruptB, buttonState, FALLING);
  pinMode(CLK, INPUT); 
  digitalWrite(2, HIGH);  // Pull High Restance  
  pinMode(DAT, INPUT); 
  digitalWrite(3, HIGH);  // Pull High Restance 
 
pinMode(BUTTON, INPUT); 
  digitalWrite(4, HIGH);  // Pull High Restance
  pinMode(LED1, OUTPUT); 
  pinMode(LED2, OUTPUT); 
   Serial.begin(9600);
 }


void loop() 
{
  if  (!(digitalRead(BUTTON))) 
    {
     COUNT = 0;  
     Serial.println("STOP COUNT = 0");
     digitalWrite(LED1, LOW);
     digitalWrite(LED2, LOW);
     delay (2000);
    }
     Serial.println(COUNT);  
}

//-------------------------------------------
void RoteStateChanged() //When CLK  FALLING READ DAT
{
 if  (digitalRead(DAT)) // When DAT = HIGH IS FORWARD
   {
    COUNT++;
    digitalWrite(LED1, HIGH);
    digitalWrite(LED2, LOW);
    delay(20);
   }
 else                   // When DAT = LOW IS BackRote
   {
    COUNT--;
    digitalWrite(LED2, HIGH);
    digitalWrite(LED1, LOW);
    delay(20);
   }
}
				
			

Rezultat

Modul rotacijskega kodirnika lahko šteje impulzne izhodne čase med vrtenjem v pozitivni in negativni smeri. Ta način štetja vrtenja je neomejen, za razliko od potenciometrov, ki imajo omejeno število obratov. Modul se lahko vrne v začetno stanje in ponovno šteje od 0.

 

thumb