Robot con Arduino: Rob1_v1

In questo articolo parliamo del primo tentativo di realizzazione del robot basato su Arduino. Ho deciso di utilizzare strisce di nastro biadesivo per fissare i blocchi motore-riduttore e la ruota girevole e del nastro adesivo con velcro per fissare (ma lasciando la possibilità di rimuoverei componente se necessario) i porta batterie e la breadboard.

I componenti utilizzati per questo prima realizzazione sono i seguenti:
  • scheda Arduino UNO
  • kit composto da due motori con riduttore ed encoder (http://www.dagurobot.com/goods.php?id=133)
  • ruota girevole da carrellino (di altezza il più possibile simile a quella delle ruote del kit)
  • Integrato driver motori L293D
  • 2 x condensatori ceramici da 0,1 µF
  • 2 x resistenza 1 KΩ
  • 1 coperchio per scatola di derivazione
  • 1 porta batterie da 4 AA
  • 1 porta batterie da 9V con jack per Arduino
Con il nastro biadesivo si attaccano i due motori ad un lato del coperchio per scatola di derivazione (ovviamente si può usare un altra superficie plastica o altro materiale a secondo di ciò che risulta disponibile o facilmente reperibile). Sempre con il biadesivo si attacca nella parte anteriore la ruota girevole. Nella parte sottostante, sempre con il biadesivo, si può incollare anche il porta batterie. Nella prima versione del robot ho utilizzato un porta batterie da 4 AA. In questa foto si può osservare la parte inferiore del robot.
rob1_v1_sotto
 Questo è lo schema dei collegamenti da effettuare su breadboard (o millefiori se si preferisce):

rob1_v1_schem

 In questa foto si può osservare la parte superiore. Il porta batteria da 9 V è attaccato un del nastro adesivo con velcro in modo da poterlo rimuovere per sostituire la batteria. Anche la breadboard è fissata con l’adesivo con velcro.

rob1_v1_sopra

 Questo è il codice caricato su Arduino:

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;


#define ML_MAX_SPEED 255
#define MR_MAX_SPEED 255

 
void setup() {
 pinMode(enable_l, OUTPUT);
 pinMode(enable_r, OUTPUT); 
 
 pinMode(motor_l1, OUTPUT);
 pinMode(motor_l2, OUTPUT);
 pinMode(motor_r1, OUTPUT);
 pinMode(motor_r2, OUTPUT);

 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);
}
 In questo video si può vedere questa prima versione in movimento:

 

Nel video si vede chiaramente che il robot non va dritto seguendo una linea retta, ad un certo punto addirittura una ruota non riparte subito e quindi il robot ruota quasi su se stesso. Per questo motivo nella seconda versione dovremo introdurre l’utilizzo degli encoder per rilevare la velocità dei motori in modo da regolare di conseguenza la tensione applicata ad ogni motore.

Nello schema elettrico si può osservare l’impiego del  driver per motori L293D. La funzione di questo integrato è quella di pilotare i motori con una alimentazione dedicata e non fornita dai pin di output di Arduino. Questi ultimi possono fornire infatti solo una corrente di 40 mA e non è sufficiente per pilotare i motori. L’integrato L293D consente di far girare i motori in senso orario e in senso antiorario o a fermarli del tutto. Inoltre è possibile pilotare i pin di enable con una uscita PWM di Arduino in modo da regolare la tensione applicata ai motori e quindi la velocità di rotazione.

In questa prima prova ho utilizzato un pacco batterie per alimentare i motori formato da 4 batterie AA. Ho utilizzato batterie ricaricabili che forniscono circa 1,2V per un totale di 4,8V (in realtà con le batterie da 2400 mAh a piena carica forniscono un totale di 5,07V). I motori richiedono una tensione compresa tra 3V e 6V. La tensione massima fornita ai motori dal driver non è però pari alla tensione fornita dal pacco batterie perché c’è un po’ di caduta di tensione nei circuiti interni e quindi con questa configurazione impostando i pin di enable alla massima tensione (5V) i motori ricevono poco più della tensione minima richiesta dal loro funzionamento. La tensione massima misurata sui pin di un motore a batterie completamente cariche è di 3,44V con una caduta di tensione causata dal driver di 1,63V.

Per questo motivo nella secondo versione del robot utilizzerò un pacco batterie formato da 6 AA (totale di circa 7,2V) in modo da avere una maggiore possibilità di controllo della velocità dei motori.