- 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
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);
}
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.