Robot con Arduino: Rob1_v2

Come abbiamo visto è necessario aumentare la tensione fornita dal pacco batterie che alimenta i motori. Purtroppo non sono riuscito a montarlo al centro nella parte inferiore (è il pacco da 6 batterie AA è più spesso) e quindi sono stato costretto a montarlo nella parte superiore al fianco della breadboard. In questo modo il robot sarà leggermente sbilanciato e quindi a maggior ragione la velocità dei due motori andrà regolata grazie agli encoder.

In questa foto la nuova configurazione di batterie:

pacco-batterie-da-6

In questa foto invece si vede in dettaglio un encoder:

dettaglio-encoder

 

Come si vede nella foto l’encoder è di tipo magnetico con un sensore ad effetto hall (che consente quindi di rilevare un campo magnetico) e di un disco da inserire sull’albero del motore con un magnete ad 8 poli. In questo modo si ottengono 8 variazioni per ogni giro del motore. Visto che il motore è connesso ad un riduttore con rapporto 48:1 si otterranno 384 variazioni per ogni giro della ruota (che è connessa al riduttore di giri).

Questo è il codice per Arduino che permette gestisce il segnale che arriva dai sensori agli ingressi 2 e 3 che permettono di generare interrupt quando avviene una transizione del segnale. Ogni volta che la ruota fa un giro completo viene visualizzato un messaggio sulla seriale. Ho provato ad attaccare del nastro adesivo con un pezzo di carta su ciascuna ruota e la misura risulta corretta.

const int motor_l1 = 8;
const int motor_l2 = 9;
const int motor_r1 = 10;
const int motor_r2 = 11;

const int enable_l = 5;
const int enable_r = 6;

const int intl = 2;
const int intr = 3;

#define ML_MAX_SPEED 255
#define MR_MAX_SPEED 255

volatile byte full_revolutionsl;
unsigned int rpml;
unsigned long timeoldl;
unsigned int stepl;
unsigned int stepr;
 
void setup() {
  Serial.begin(9600);
  
  pinMode(enable_l, OUTPUT);
  pinMode(enable_r, OUTPUT);     
  
  pinMode(motor_l1, OUTPUT);
  pinMode(motor_l2, OUTPUT);
  pinMode(motor_r1, OUTPUT);
  pinMode(motor_r2, OUTPUT);

  pinMode(intl, INPUT_PULLUP);
  pinMode(intr, INPUT_PULLUP);
 
  attachInterrupt(0,encoder_l,CHANGE);
  attachInterrupt(1,encoder_r,CHANGE);

  stepl = 0;
  stepr = 0;

  motorspeed(ML_MAX_SPEED/2, MR_MAX_SPEED/2);
}

void loop() {
 // delay(2000);
  
 // directionl(true);
  directionr(true);

 // delay(2000);

//  directionl(false);
//  directionr(false);
}

void motorspeed (int motor_l_speed, int motor_r_speed) {
  if (motor_l_speed > ML_MAX_SPEED ) motor_l_speed = ML_MAX_SPEED; // limit top speed
  if (motor_r_speed > ML_MAX_SPEED ) motor_r_speed = ML_MAX_SPEED; // limit top speed
  if (motor_l_speed < 0) motor_l_speed = 0; // keep motor above 0
  if (motor_r_speed < 0) motor_r_speed = 0; // keep motor speed above 0 analogWrite (enable_l, motor_l_speed); 
  analogWrite (enable_r, motor_r_speed); 
} 

void directionl (bool dir) { 
   digitalWrite(motor_l1, !dir); 
   digitalWrite(motor_l2, dir); 
} 

void directionr (bool dir) { 
    digitalWrite(motor_r1, !dir); 
    digitalWrite(motor_r2, dir); 
} 

void encoder_l() { 
    stepl++; 
    if (stepl >= 384) {
      Serial.println("revolution_left");
   
      stepl = 0;
    }
}

void encoder_r() {
    stepr++;
    
    if (stepr >= 384) {
      Serial.println("revolution_right");
   
      stepr = 0;
    }
}