Go Down

Topic: Problemi encoder ottico (Read 420 times) previous topic - next topic

Alchemista

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: [Select]

#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] ++;
}

Go Up