Enkoder – světelná závora a reflex

Jak zjistit přesný počet otáček a pootočení?
No přece pomocí enkoderu.


Světelná závora


Je to docela prosté zařízení:
na hřídelku připevníme kolečko se soustřednými otvory. Těmi svítíme na fototranzistor. Když se kolečko bude otáčet, fototranzistor bude spínat a rozepínat obvod a my ho budeme vyhodnocovat. Můžeme samosebou použít i mechanický přerušovač, záleží na použití.

Možnost připojení přes tvarovač: http://merkurrobot.cz/?p=1350

Model postavený z merkuru a světelné infračervené závory:


Enkoder - sestava


Pokud chceme zjistit, jestli se hřídel nebo kolo otáčí, musíme použít enkodery 2.
Enkoderová kola připevníme „skoro“ stejně, jen budou malinko oproti sobě pootočena, aby dávala posunuté signály pro vyhodnocení podle následující tabulky:


Enkoder - vyhodnocení směru


Pokud si takový pokus chcete vyzkoušet třeba s arduinem, můžete pak použít tento program na sestavě arduino+LCD display.
Program není zrovna nejrychlejší, proto je vhodný jen pro pomalé otáčení.
Vysokorychlostní enkodery popíšeme zase příště.

//---------PROGRAM PRO OBSLUHU 2 ENKODERU------------------------------------
#include <LiquidCrystal.h>
#include <LCDKeypad.h>

int sensorValue0 = 0;  // promenna pro cteni analog. tlacitek
int sensorValue1 = 0;  // variable to store the value coming from the sensor
int sensorValue2 = 0;  // vstup enkoderu 2
int sensorValue3 = 0;  // vstup enkoderu 3
int sensorValue4 = 0;  // variable to store the value coming from the sensor
int sensorValue5 = 0;  // variable to store the value coming from the sensor
int enkoder2 = 0;  // 0=sviti, 1=nesviti
int enkoder3 = 0;  // 0=sviti, 1=nesviti
int stav = 0; // enc2 enc3 stav
              //  0    0    1
              //  0    1    2
              //  1    0    3 
              //  1    1    4
int stav_old = 0; // minuly stav: 1..4, 0=pocatecni inicializace
int smer = 0; // stav 1->3 = vpred
              // stav 3->1 = vzad
int pozice = 0;  //kde se zrovna vozik nachazi            

LCDKeypad lcd;

void setup()    //------------------------------------------------------
{
 // int i,k;

  
  lcd.clear();lcd.begin(16, 2);
  lcd.print("cti analogove");
  lcd.setCursor(0,1);
  lcd.print("   vstupy");
  delay(1000);
  lcd.setCursor(0, 0);
  lcd.print("0:   1:   c:");
  lcd.setCursor(0, 1);
  lcd.print("2:   3:   4:   ");
  
}

void loop() {   // ------------------------------------------
                // ------ hlavni smycka ---------------------
                // ------------------------------------------
       cti_vstupy();
       vpred_vzad();
//    zobraz_vstupy();
    zobraz_pozici();

}  // ------ konec hlavni smycka ---------------------
   // ------------------------------------------------

void cti_vstupy()   //------------------------------------------------------
{
  sensorValue0 = analogRead(0);    // read the value from the sensorPin 0..5
  sensorValue1 = analogRead(1);    // read the value from the sensorPin 0..5
  sensorValue2 = analogRead(2);    // read the value from the sensorPin 0..5
    if (sensorValue2 > 500) {enkoder2=0;} else {enkoder2=1;}
  sensorValue3 = analogRead(3);    // read the value from the sensorPin 0..5
    if (sensorValue3 > 500) {enkoder3=0;} else {enkoder3=1;}
      
}  // --- konec cti_vstupy --------------------------
void zobraz_vstupy()   //------------------------------------------------------
{
  lcd.setCursor(2, 1);  // enkoder 2
     if (enkoder2==0) {lcd.print("o");} else {lcd.print(" ");}
  lcd.setCursor(3, 1);  // enkoder 3
     if (enkoder3==0) {lcd.print("o");} else {lcd.print(" ");}
  lcd.print(" ");
}

void zobraz_pozici()   //------------------------------------------------------
{
  lcd.setCursor(12, 0);
  lcd.print(pozice);lcd.print(" ");
  lcd.setCursor(14, 1);
  lcd.print(stav);
}

void vpred_vzad()   //------------------------------------------------------
{
  // enc2 enc3 stav
  //  0    0    1
  //  0    1    2
  //  1    0    3 
  //  1    1    4
  // smer -  stav 1->3 = vzad
  //         stav 3->1 = vpred
  // pozice - kde se zrovna vozik nachazi  
     if ( enkoder2 == 0 && enkoder3 == 0 ) stav = 1; // 1
     if ( enkoder2 == 0 && enkoder3 == 1 ) stav = 2; // 2
     if ( enkoder2 == 1 && enkoder3 == 0 ) stav = 3; // 3
     if ( enkoder2 == 1 && enkoder3 == 1 ) stav = 4; // 4
     
     if (stav_old != stav )
     {   
            if (stav_old == 1 && stav == 3) {++pozice;lcd.setCursor(13, 1);lcd.print("+"); lcd.print(stav_old); }
            if (stav_old == 3 && stav == 1) {--pozice;lcd.setCursor(13, 1);lcd.print("-"); lcd.print(stav_old); }
     }
     //else {}
     
     stav_old = stav;

}  // --- konec vpred_vzad ----------------------------

Schema zapojení:


Schéma optozávory


Varianta A:

optozávora U má vyvedeny vývody IR LED a fototranzistoru pouze na piny.
Úpravu signálu a připojení na napájení je nutné udělat externě, aby mohl být zpracováván procesorem.

Varianta B:

optozávora je zapojena způsobem „společný emitor“. Výstup možno zapojit třípinově rovnou do MCU.

Varianta C:

optozávora je zapojena způsobem „společný kolektor“. Výstup možno zapojit třípinově rovnou do MCU. Rozdíl oproti variantě B je, že lze pomocí odporu R6 nastavit výstup přesněji.

Možnost připojení přes tvarovač: http://merkurrobot.cz/?p=1350

Variantu A a B je možno zakoupit např. zde – Stavebnice.com a Snailinstrument.cz

Napsat komentář