Come pilotare un motore passo passo usando l’integrato L298N
Quando osservo i robot industriali assemblare, saldare, fresare o posizionare oggetti con una precisione sconcertante rimango affascinato dalla capacità umana di poter costruire queste macchine.
Anche nelle nostre abitazioni sono presenti oggetti dotati di parti meccaniche, che compiono movimenti molto precisi, come ad esempio le stampanti, i plotter e gli scanner.
Questi dispositivi hanno in comune tra loro un particolare dispositivo chiamato motore passo passo (stepper motor).
E’ un trasduttore elettromeccanico che converte degli impulsi elettrici in un movimento fisico. Ad ogni impulso elettrico corrisponde un movimento del rotore; questo spostamento viene chiamato step.
A differenza del motore in corrente continua i motori passo passo possono mantenere la propria velocità di rotazione costante, anche con carico applicato, senza usare sistemi di controreazione (tachimetriche o encoder).
Il motore eroga una coppia elevata, anche con bassi numeri di giri, possiede accelerazioni e frenate repentine ed è capace di mantenere il carico applicato fermo in posizione, senza vibrazioni.
Naturalmente esistono anche degli svantaggi, tra cui la necessità di utilizzare un circuito elettrico di pilotaggio, un rendimento energetico basso, una velocità di rotazione ridotta ed un costo di acquisto elevato.
La figura seguente mostra, in maniera semplificata, il principio di costruzione di un motore passo passo.
Il movimento del rotore avviene alimentando le bobine in modo consecutivo. Eccitando solo la bobina A1 il rotore si posiziona verso NORD, eccitando solo la bobina B1 il rotore si posiziona in direzione EST, eccitando solo la bobina A2 il rotore si posiziona in direzione SUD ed infine eccitando solo la bobina B2 il rotore si posiziona in direzione OVEST.
La tabella seguente riassumere la sequenza.
Fasi di Alimentazione | ||||
A1 | A2 | B1 | B2 | |
Fase 1 | + | – | – | – |
Fase 2 | – | – | + | – |
Fase 3 | – | + | – | – |
Fase 4 | – | – | – | + |
Seguendo le fasi di alimentazioni A1-B1-A2-B2 il rotore si sposterà in senso orario, invertendo la sequenza B2-A2-B1-A1 il rotore si sposterà in senso antiorario. E’ importante alimentare le bobine in modo sequenziale perché il rotore deve seguire in maniera lineare il campo elettromagnetico generato dalle bobine.
Naturalmente nei motori passo passo reali la sequenza delle 4 fasi fa girare l’albero di un solo passo (step). Il numero dei passi è una caratteristica costruttiva del motore, solitamente ha un valore di 200 step/giro, ma ne esistono anche da 20, 24, 48 e 400 step/giro. Il numero di step può essere espresso in gradi sessagesimali, ad esempio un motore da 7.5° equivale ad uno con 48 step/giro (360°/7.5°=48).
Le 4 fasi di alimentazione delle bobine (considerando un ipotetico motore da 1 step/giro), viene rappresentata dalla figura seguente:
La sequenza di alimentazione è solitamente gestita da un integrato a logica programmabile mentre il compito di fornire l’energia è demandato ad un ponte ad H. Abbiamo affrontato l’utilizzo del ponte H in questo precedente articolo. Per essere più precisi, avendo 4 fili, dobbiamo usare due ponti H uno che alimenta le bobine A1 e A2 e l’altro che alimenta le bobine B1 e B2.
In questo tutorial ho usato come microcontrollore la Arduino Leonardo e come doppio ponte H il driver L298N prodotto da ST Microelectronics. Il motore è un 48 passi/giro operante a 12Vdc, smontato da una vecchia stampante non più funzionante.
Collegamento dei componenti
Il circuito elettrico che permette di pilotare il motore è rappresentato nella figura seguente:
riassumo i collegamenti tramite la tabella seguente
Motore Passo Passo | Integrato L298N | Arduino Leonardo |
1-8-15 | GND | |
6-9-11 | VCC 5Vdc | |
5 | 5 |
|
7 | 4 |
|
10 | 3 |
|
12 | 2 |
|
A1 | 14 | |
A2 | 13 | |
B1 | 3 | |
B2 | 2 | |
Alimentazione Motore 12Vdc | 4 |
i diodi in contro fase servono per proteggere le uscite dell’integrato L298N da eventuali sovratensioni generate durante l’alimentazione delle bobine.
Il codice necessario per pilotare il motore rispecchia quanto detto precedentemente. In pratica è necessario alimentare in modo consecutivo le bobine rispettando le quatto fasi.
void setup() { //i pin 2-3-4-5 sono //configurati come uscite pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); //forzo le uscite a livello logico basso digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, LOW); } void loop() { //FASE 1 //Alimento solo la prima bobina digitalWrite(2, HIGH); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, LOW); delay(10); //FASE 2 //Alimento solo la seconda bobina digitalWrite(2, LOW); digitalWrite(3, HIGH); digitalWrite(4, LOW); digitalWrite(5, LOW); delay(10); //FASE 3 //Alimento solo la terza bobina digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, HIGH); digitalWrite(5, LOW); delay(10); //fase 4 //Alimento solo la quarta bobina digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, HIGH); delay(10); }
Una volta caricato lo sketch, l’albero del motore inizierà a girare in senso orario. Per invertire la rotazione è sufficiente alimentare le bobine dalla fase 4 alla fase 1.
Cambiando il valore del delay() otterremmo una variazione di velocità nella rotazione del rotore.
Se avete delle stampanti vecchie potete subito passare alla pratica realizzando piccoli meccanismi e semplici robot. Volendo si possono collegare alla Leonardo 2 driver L298N per pilotare altrettanti motori passo passo, questo vi permette di poter controllare i due motori simultaneamente creando sistemi meccanici più complessi.
Related posts
8 Comments
Lascia un commento Annulla risposta
Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.
Articoli popolari
Sorry. No data so far.
.Net micro framework Arduino Arduino Webserver Domotica Flyport I2C IOT Netduino OpenPicus raspberry RTC Speed Test
Ottima spiegazione , ma come si fa a controllare anche la velocità ?
Ciao Paolo
Per variare la velocità di rotazione è necessario cambiare il tempo di pausa tra le varie fasi, nell’esempio ho impostato un dalay(10) pari appunto a 10mS. Se aumenti o diminuisci questo valore cambierà anche la velocità di rotazione
grazie
Marco
Eventualmente, è possibile inserire un potenziometro alla porta analogica
per poter modulare la velocità? Se si, può pubblicare una schema con relativo
sketch?
grazie
mplimenti per chiarezza della spiegazione , io dovrei pilotare in quel modo un motore passo passo ma non a 12v ma bensi a 3,1v e 2,5A, come potrei fare? Grazie
Ciao
sostituisci i 12Vdc di alimentazione con i tuoi 3.1Vdc. Il circuito rimane invariato.
a presto
Grazie mille
Ciao Marco, ho capito che variando delay() cambia il ritardo tra un pesso e l’altro ma se il valore (1) non mi bastasse come devo scrivere per scendere sotto lo (0) delay(001) oppure (0,01) ?
In pratica avrei bisogno di più velocita.
Grazie 1000
Ciao
potresti usare la funzione DelayMicroseconds (http://arduino.cc/en/Reference/DelayMicroseconds) .
la velocità massima è comunque stabilità dalla costruzione del motore.
a presto
Marco