sâmbătă, 15 februarie 2014

Arduino+Stepper=Encoder


     Din ciclul  proiecte "mai putin utile" dar cu mare scop didactic sau cum se imbina teoria cu prctica va prezint:

           Cum se poate face un encoder rotativ dintr-un motor pas cu pas, un comparator si... Arduino.





     Un pic de teorie...

     Dupa leagea lui Faraday si constatarea lui Lenz se poate afirma ca daca o bobina se misca (fie rectiliniu, fie unghiular) intr-un camp magnetic prin aceasta va incepe sa circule un curent care va avea sensul opus cauzei care l-a creat (miscarea). Practic orice motor este un convertor de energie: daca se aplica la ax o putere mecanica la borne va aparea o tensiune electromotoare iar daca se aplica la borne o tensiune electromotoare la ax vom avea o putere mecanica. GATA? Nu chiar... Pentru acest proiect intereseaza partea in care se aplica putere mecanica la ax iar la borne apare o t.e.m. Tensiunea aparuta la borne depinde de doi factori : intensitatea si densitatea campului magnetic si rata variatie a vitezei cu care bobina se misca in acesta. Ideal ar fi sa fie indplinite ambele conditii dar exista niste constrangeri despre care nu voi vorbi acum.      Sa presupunem ca avem un camp magnetic dat,  la care nu se poate "umbla" asadar, pentru a obtine o tensiune la bornele motorului, va trebui sa rotim bobina in camp. Dar daca facem acest lucru manual ce tensiune se obtine? Una foarte mica daca rotim incet si una mai mare daca rotim mai repede. Acum este GATA teoria !!

    Ce este un encoder rotativ?

    Un encoder roatativ poate fi comparat cu doua contacte rotative defazate intre ele cu 90 de grade. Cum o poza face mai mult de 100 de cuvinte eu zic sa privim urmatoarea imagine:




Principiu encoder roattiv

     OK. Conatactele sunt C1 (rosu) si C2 (verde). Sa zicem ca la inceputul utilizarii cele doua contacte sunt in pozitia P1, adica C1 este "la masa" si C2 este la 5V. Citim aceste valori cu Arduino (sau alt microcontroller). Rotim contactele pana in P2 si citim si aceste avalori. Mai departe se rotesc contactele pana la P4. Se obesrva ca la P5 cele doua contacte ajung la tensiuni  similare cu cele pe care le-au avut in pozitia P1. La ce ne ajuta asta? La stabilirea sensului miscarii! Citind succesiv starea contactelor se pot elabora algoritimi care in functie de tiparul miscarii sa stabilieasca sensul miscarii.
   
    Ce legatura are un motor pas cu pas cu un encoder?

    Are. Un motor pas cu pas (mpp) bipolar este realizat din 2 bobine dispuse in asa fel incat infasurarile acestora creaza campuri elctromagnetice defazate intre ele. Pentru mai multe detalii despre cum este construit un mpp puteti vedea filmuletele de mai jos :


   

     Acum : daca rotim manual axul mpp-ului cele doua bobine vor fi rotite in campul magnetic al magnetului permanent. Asta insemna ca la bornele lor vom citii o tensiune electromotoare. Ordinea aparitiei acestei tensiuni la bornele celor doua bobine este dependenta de sensul in care rotim axul. Aici apar doua probleme :

  1. Tensiunile de la borne sunt sinusoidale.
  2. Valorile lor sunt mici.
  Cele doua probleme se rezolva daca utilizam urmatorul montaj ( schema este proprietatea sitelui http://home.clear.net.nz/pages/joecolquitt/stepper_as_encoder.html , site pe care va rog sa il vizitati pentru lamuriri)  :



     Urmarind schema solutiile celor doua probleme devin evidente: pentru a scapa de alternata negativa se utilizeaza doua diode, iar pentru a citii valori corecte se utilizeaza doua comparatoare care au setat ca prag tensiunea data de potentiometrul de 50k pe intrarile neinversoare. O solutie inteligenta pe care autorul a adoptat-o a fost aplicarea unui curent (~6mA) bobinelor pentru a amplifica efctul de inductie, dar si pentru a scapa de tensiunile parazite (explicatia se gaseste pe site).

     In sfarsit, in formele de unda ale celor doua iesiri se observa clar cum ordinea in care acestea isi schimba starea depinde de sensul de rotatie.
     Pentru a face mai usoara utilizarea am creat pe baza schemei un cablaj (pe care l-am si realizat) :

Cablaj encoder
Amplasare componente



Cablajul realizat

     Dupa cum se observa am utilizat un LM339 (4 AO cu colector in gol) tocmai pentru a utiliza doua motoare (am o idee pe care vreau sa o pun in practica). Ceva ce mi-a scapt a fost marcarea contectorului "SIL1" (fapt important deoarce prin acesta se face conexiunea cu Arduino) ordinea este urmatoarea:

  1. Pin 1 VCC
  2. Pin 2 iesirea AO1
  3. Pin 3 iesirea AO2
  4. Pin 4 iesirea AO3
  5. Pin 5 iesirea AO4
  6. Pin 6 GND.

     Cablajul in format PDF se poate descarca de aici.

     Interfatarea cu Arduino....

    Pentru a demonstra ca montajul functioneaza am conceput urmatorul program :



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//// ENCODER FROM STEPPER ////
////ARDUINO MEGA 2560/////
////PETRESCU CRISTIAN////
////FEB.2014////////////

int counter;
int pin1=2;
int pin2=3;
int i;
int leds[8]={24,26,28,30,32,34,36,38};
boolean val_pin1;
boolean val_pin2;
int k;
int old_k;
int index;
int test[3]; 

void setup(){
 pinMode(pin1,INPUT);
 pinMode(pin2,INPUT);
 noInterrupts();
 interrupts();
 for(i=0;i<8;i++){
  pinMode(leds[i],OUTPUT);
 }
 Serial.begin(9600);
}

void loop(){
 while(!(test[0])){
  val_pin1=digitalRead(pin1);
  val_pin2=digitalRead(pin2);
  k=val_pin1|(val_pin2<<1);
 
  if(k!=3 && k!=old_k && k!=0){
   old_k=k;
   index++;
   test[index]=k;
  }
  if(k==3){
   if(index==2)
   test[0]=1;
   index=0;
  }
 }
 if(test[1]==2&&test[2]==1){
  counter++;
 }
 if(test[1]==1&&test[2]==2){
  counter--;
 }
 test[0]=0;
 for(i=0;i<8;i++){
  if(counter&(1<<i)){
   digitalWrite(leds[i],HIGH);
  }
  if(!(counter&(1<<i))){
   digitalWrite(leds[i],LOW);
  }
 }
 delay(150);
}

     Programul nu face altceva decat sa monitorizeze schimbarea starii a pinilor 2 si 3 ai lui Arduino, iar dupa ce stabileste tiparul schimbarii acestora  (in prima bucla "while") incrementeza su decreamenteza variabila " counter". Pe baza acestei variabile in bucla "for" se aprind sau se sting 8 leduri, starea acestora reprezntand transpunerea in binar a variabilei counter. 
    Cam asta ar fi ceea ce aveam de prezentat


Niciun comentariu:

Trimiteți un comentariu