Pages: [1]   Go Down
Author Topic: Problemi encoder ottico  (Read 383 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti, ho un problema con l'encoder ottico e il motor shield.
Quando i due motori sono fermi gli encoder funzionano perfettamente, infatti facendoli girare a mano contano 20 passi per giro completo, quando invece aziono i motori vengono fuori certe interferenze che fanno contare molti più passi di quanti non lo siano realmente.
Posto il codice interessato, non tutto perchè sarebbe troppo lungo. Anche se non credo ci sia qualcosa di sbagliato, però magari ci potrebbero essere delle migliorie da fare.

Code:
#define LEFT 0
#define RIGHT 1

//i pin usati per i due motori
int SX = 6;
int M1 = 7;
int DX = 5;
int M2 = 4;
//le due "velocità" dei motori
int velocita_sx = 100;                                       
int velocita_dx = 100;

//array per l'encoder
long coder[2] = {0,0};

void setup(){
  attachInterrupt(LEFT, LwheelSpeed, CHANGE);    //inizializzo il pin 2 per l'interrupt
  attachInterrupt(RIGHT, RwheelSpeed, CHANGE);   //inizializzo il pin 3 per l'interrupt
  pinMode(M1, OUTPUT);                           //pin per il controllo dei due motori
  pinMode(M2, OUTPUT);
  Serial.begin(9600);
}

void loop(){
  Serial.print("Coder value: ");               //stampo a monitor il valore dell'array
  Serial.print(coder[LEFT]);
  Serial.print("[Left Wheel] ");
  Serial.print(coder[RIGHT]);
  Serial.println("[Right Wheel]");
  digitalWrite(M1,LOW);                     //per definire il senso di rotazione
  digitalWrite(M2, LOW);
  if(coder[LEFT] < 50 && coder[RIGHT] < 50){   //dovrebbe fare 50 passi dell'encoder e poi fermarsi
  analogWrite(SX, velocita_sx);     
  analogWrite(DX, velocita_dx);
  }
 
 
  if(coder[LEFT] >= 50 && coder[RIGHT] >= 50){
    analogWrite(DX, 0);
    analogWrite(SX, 0);
  }
}


//le due funzioni chiamate dall'interrupt per aumentare il contatore dei passi
void LwheelSpeed()
{
  coder[LEFT] ++; 
}
 
 
void RwheelSpeed()
{
  coder[RIGHT] ++;
}
Logged

Pages: [1]   Go Up
Jump to: