2 Motori DC con L293 e PWM

In questo articolo spiegherò come pilotare due motori in corrente continua tramite un ponte ad H noto come L293D. Per regolare la velocità dei motori verranno usati due segnali PWM.

 

 

Ecco uno schema di funzionamento di un ponte H:

 

In figura A) vediamo che tutti e quattro gli interruttori sono aperti e quindi non circola corrente, il motore (indicato con M) quindi è fermo. In figura B) invece sono chiusi due interruttori, in questo modo si crea una differenza di potenziale tra i due capi del motore e la corrente scorrerà da Vcc a massa seguendo il percorso indicato. In figura C) la situazione è opposta, invertendo la polarità ai capi del motore esso girerà nel senso opposto.

Tutto questo è possibile realizzarlo con dei transistor ma non conviene, possiamo quindi utilizzare un circuito integrato che svolgerà il compito in modo eccezionale e senza farci perdere tempo.

Vi consiglio a questo punto di scaricarvi il datasheet del "L293" da google (cercate semplicemente "L293 datasheet").

Ecco uno schema e la tabella che vi aiuteranno a capirne il funzionamento.

Questo integrato è composto da due ponti H di potenza (circa 600mA per canale se non sbaglio) ed è simmetrico per così dire. Praticamente possiamo ragionare su una metà e sull altra il ragionamento sarà lostesso. Ragioniamo con stati logici 1 e 0. Se A=1 e B=0 il motore 1 girerà in un senso. Il senso dipende da come collegate il motore al driver. Per invertire vi basterà invertire le polarità (cioè i due fili del motore). la situazione opposta con A=0 e B=1 farà girare il motore nel verso opposto. In caso in cui A=B il motore si fermerà.

Ricordate che tutto questo accade se gli enable sono attivi, se siete alle prime armi consiglio di collegarli direttamente ai 5V in modo da lasciarli sempre attivi.(Potete collegarli a Vcc solo nel caso in cui la tensione sia 5V).

 

Ecco il mio Driver Motori (Composto da due L293D, non montati in foto, utilizzato per pilotare due coppie di motori per un rover 4WD):

Non penso che serva uno schema elettrico in quanto non sono presenti altri componenti se non i morsetti per collegare i cavi.

Per chi non sapesse cos'è un segnale PWM, sta per Pulse Width Modulation e consiste nel modulare,appunto il duty cycle del nostro segnale. Il duty cycle si esprime in percentuale, ed è uguale al rapporto tra il periodo in cui il segnale digitale avrà un valore alto sul periodo totale,moltiplicato per 100. Questo tipo di segnale ci permette di regolare la velocità di rotazione di ogni motore.

Passiamo al codice (Per arduino):

pinMode(3, OUTPUT);

Questa riga sarà all'interno del void setup() e serve per dichiarare il pin 3 come uscita. Questo pin è dotato di PWM. Per ogni motore abbiamo bisogno di due linee comunque, quindi bisogna dichiarare anche un altro pin, consiglio il 2 che è adiacente e non necessita di uscita PWM.

void avanti() {
digitalWrite(2, HIGH);  
analogWrite(3, pwm); 
}

Questa invece è la nostra procedura per mandare avanti il motore. Attenzione che per l'uscita PWM bisogna utilizzare l'istruzione analogWrite altrimenti non avremo i risultati sperati. Il primo numero nella parentesi indica il pin, il secondo invece indica lo stato. Nel primo caso si ha HIGH oppure LOW, mentre con il PWM si ha un byte, cioè un numero che va da 0 a 255 che corrisponde al duty cycle del nostro segnale. 255=100% e 0=0%, 127=50%.

Una piccola nota: Se il nostro motore con il pin 2 su HIGH e il 3 LOW girerà ipoteticamente in senso orario di continuo, impostando il pwm a 127 girerà nello stesso verso ma a velocità dimezzata. Se invece inseriamo 255 (100%) però il motore non girerà. Questo perchè il pin 3 è a stato logico alto per il 100% del periodo e con entrambi i pin alti il nostro motore è fermo. Quindi si ragiona all'inverso cioè con pwm=0 allora il motore girerà alla massima velocità. Per semplificare il tutto basta scrivere (255-pwm) dove pwm è sempre il nostro valore. Così il valore minimo corrisponderà effettivamente al motore fermo e il valore massimo porterà il motore alla sua massima velocità. Tutto questo non succede se il pin 2 è impostato su LOW e vogliamo quindi far girare il nostro motore nel verso opposto.

Nel nostro void loop() andremo quindi a chiamare la nostra procedura "avanti()" seguita da un delay(millisecondi) e (per esempio) una chiamata di "stop()"e di nuovo un delay.

/* Software by Federico Vendramin 08/02/2012 */
byte pwm;
void setup() {
pinMode(2, OUTPUT);   //MOTORE DESTRO  
pinMode(3, OUTPUT);
pinMode(12, OUTPUT);    //MOTORE SINISTRO
pinMode(11, OUTPUT);
}

void avanti(byte pwm) {
digitalWrite(2, HIGH);  
analogWrite(3, (255-pwm));  
digitalWrite(12, HIGH);  
analogWrite(11, (255-pwm));  
}

void indietro(byte pwm) {
digitalWrite(2, LOW);
analogWrite(3, pwm);   
digitalWrite(12, LOW);   
analogWrite(11, pwm);   
}

void fermo() {            //ferma i motori
digitalWrite(2, LOW);   
digitalWrite(3, LOW);   
digitalWrite(12, LOW);   
digitalWrite(11, LOW);  
}  

void loop()    //Programma principale
{
pwm = 255;        //imposta pwm al 100%
avanti(pwm);      //chiama procedura avanti
delay(1000);      //va avanti per un secondo
fermo();          //ferma i motori
delay(2000);      //aspetta due secondi
pwm = 127;        //imposta pwm al 50%
indietro(pwm);    //indietro
delay(500);       //per mezzo secondo
}

Questo è un semplice programma completo.Collegamenti:

 

Pin 2 Arduino Pin 2              (L293)
Pin 3 Arduino Pin 7              (L293)
Pin 11 Arduino Pin 15            (L293)
Pin 12 Arduino                
Pin 10            (L293)
GND - massa                    
Pin 4,5,12,13 (L293)
Vcc            
Pin 8,16         (L293)
Enable (5V) Pin 1,9           (L293)
Motore 1 Pin 2,7           (L293)
Motore 2 Pin 12,14       (L293)

 

Se il i motori andranno avanti quando invece dovrebbero andare indietro allora invertite i fili che vanno ai terminali di entrambi dei motori. (anche se vanno indietro quando dovrebbero andare avanti).

Se un motore gira in senso opposto allora invertite semplicemente i fili di quel motore.

 

Attenzione alle specifiche del L293: Evitare di utilizzare motori con assorbimenti superiori ai 500-600mA.L293D e L293B sono essenzialmente uguali, il primo ha già i diodi di protezione integrati. Il secondo può gestire motori con assorbimento fino ad 1A.

The secret of any online business is web hosting. Select the best hosting service reading offered by justhost.
Free Joomla Templates designed by Joomla Hosting