L298N Pilotare un motore passo passo con Arduino

Ancora L298N, ancora un altro how to 😉
Dopo l’articolo in cui ho mostrato come pilotare un motore DC con Arduino e il modulo L298N, questa volta tocca ai motori passo passo.
Se non sai cos’è il modulo L298N trovi qualche informazione in più nell’ articolo precedente.

Update: dopo varie prove ed esperimenti, abbiamo capito che anche se fattibile, pilotare un motore passo passo con un modulo L298N non è la cosa ideale a causa di problemi di surriscaldamento e assorbimento di corrente. Dai un’occhiata agli altri miei articoli dove spiego come utilizzare i driver appositi.

Per quanto riguarda il motore passo passo, potrei/dovrei dilungarmi molto nelle spiegazioni, ma lo scopo di questo articolo non è questo, quindi una breve citazione da Wikipedia per dire che:

Il motore passo-passo spesso chiamato anche step o stepper è un motore elettrico sincrono in corrente continua senza spazzole che può suddividere la propria rotazione in un grande numero di passi (step). La posizione del motore può essere controllata accuratamente senza dover ricorrere al controllo ad anello chiuso (feedback) se la taglia ed il tipo di motore sono scelti in modo adeguato all’applicazione.
È considerato la scelta ideale per tutte quelle applicazioni che richiedono precisione nello spostamento angolare e nella velocità di rotazione, quali la robotica, le montature dei telescopi ed i servomeccanismi in generale. Tuttavia ultimamente vengono spesso sostituiti da motori brushless o da attuatori voice-coil per le applicazioni di fascia alta.

In base al tipo ed alle caratteristiche del motore i prezzi possono variare dalle poche decine di euro alle centinaia se non alle migliaia. Motori a costo zero possono essere riciclati in casa da stampanti, scanner, lettori floppy, lettori CD/DVD…
Per l’esperimento di oggi il motore da utilizzare deve rispettare i requisiti tecnici del modulo L298N, cioè non assorbire più di 2A per fase e non necessitare più di 35 Volt di alimentazione, questi i limiti fisici del modulo.
Tornando al motore, una delle caratteristiche principali sono gli Step per giro, cioè il numero di spostamenti (step) che effettua il rotore per compiere un giro completo. Più è alto questo numero più il motore è accurato. Altre caratteristiche importanti riguardano la forza esercitata durante la rotazione, la forza durante la fase di arresto e mantenimento della posizione, ma per adesso non ci interessano.
Il mio motore è stato prelevato da una stampante multifunzione, per l’esattezza dal suo scanner, come numero di step (96 step) diciamo che è abbastanza scarso, ma per ovviare a questo deficit i progettisti hanno pensato bene di affinare gli spostamenti con un sistema di ingranaggi (nel video lo vedrai senza gli ingranaggi).
Ricordiamoci del particolare del numero degli step in quanto è un parametro fondamentale per utilizzare la libreria Stepper di Arduino.
La prima cosa da fare quindi è trovare il datasheet del proprio motore, questo è il mio.
In alcuni casi, i produttori non specificano il numero di step per giro (chiamiamola pure risoluzione del motore), ma specificano invece lo Step Angle, che in sostanza è il numero di gradi compiuti dal rotore del motore in un singolo step. Avendo questa informazione basta dividere 360 per lo Step Angle e scoprire quanti sono gli Step per giro. Nel mio caso lo Step Angle è di 3.75°, quindi 360/3.75 = 96 Step per giro.

Lo schema

Rapidamente uno sguardo allo schema dei collegamenti:

Schema dei collegamenti

Schema dei collegamenti

I colori utilizzati nello schema rispecchiano quelli del video a fondo pagina.
In questo esempio è stata utilizzata una funzione del modulo L298N discussa nell’articolo precedente, e cioè la capacità del modulo di fornire in uscita una tensione stabilizzata a 5 Volt quando questo è alimentato a 12 Volt. Questa tensione di uscita è stata impiegata per alimentare Arduino. Altra differenza dallo scorso articolo è incentrata sui pin Enable del modulo L298N. In questo caso sono stati utilizzati due jumper per impostare lo stato Enable a true (in sostanza gli viene mandato un valore alto di tensione) e non vengono utilizzati quindi per regolare la velocità del motore.

Connessioni del motore passo passo

Come capire l’ordine di connessione dei cavi del motore?
Trattandosi di un motore bipolare i cavi che lo alimentano e controllano sono quattro, ma per poterlo utilizzare vanno identificate le coppie giuste. Se possediamo il datasheet, siamo a cavallo, viceversa ci tocca ingegnarci… Il metodo è semplice. Guardando l’immagine di seguito, possiamo vedere a grandi linee come sono collegati internamente questi quattro fili, quindi armandoci di tester, posizionato in funzione test continuità, basterà cercare quali sono le coppie di cavi che forniscono una certa resistenza, e che quindi fanno parte dello stesso avvolgimento.

Principio delle connessioni

Principio delle connessioni

Una volta scoperte le coppie basta collegarle alle uscite Output A e Output B del modulo L298N.

Pinout L298N

Pinout L298N

Continuando con la descrizione dei collegamenti, passiamo alla parte del controllo, quindi le connessioni tra Arduino e il modulo L298N: pin IN1 al pin 11, IN2 al pin 10, IN3 al pin 9 e IN4 al pin 8. Ricordiamoci di posizionare dei jumper sui pin EN-A e EN-B del modulo.
Terminiamo il montaggio con l’alimentazione. Per comodità io uso un alimentatore da banco, ma nello schema viene riportata una batteria, in ogni caso, colleghiamo il polo positivo all’ingresso +12V del modulo, il negativo alla massa (GND) e per alimentare Arduino sfruttiamo l’uscita +5V del modulo collegandola al pin Vin. Sempre da Arduino facciamo partire un cavetto che colleghi la sua massa con quella del modulo.

Upload del codice

Una volta terminata la fase di montaggio è ora di passare al codice. Come sempre rimando alla spiegazione dello stesso nei commenti a corredo. Se qualcosa non ti è chiaro utilizza la zona commenti a fine pagina!

/*
 * L298N pilotare un motore passo passo con Arduino
 * In questo esempio vediamo come sfruttare la libreria Stepper
 * al fine di controllare un motore passo passo
 * Obbietivo : muovere ripetutamente il motore da 0 a 180 gradi e ritorno
 * Nel post correlato viene mostrato come interfacciare Arduino
 * ed il motore passo passo tramite il modulo L298N
 *
 * Autore  : Andrea Lombardo
 * Web     : http://www.lombardoandrea.com
 * Post    : http://bit.ly/L298N-ARDUINO-MOTOREPASSOPASSO
 * Git     : https://github.com/AndreaLombardo/Arduino-L298N-Motore-Passo-Passo
 */

//includo l'apposita libreria per gestire i motori passo passo
#include <Stepper.h>

/*
* Informo il programma su quanti sono gli step impiegati
* dal mio motore per compiere un giro completo.
* In alcuni datasheet (come nel mio caso) non e' specificato il numero di step del motore
* viene tuttavia specificato il numerdo di gradi effettuato ad ogni step (Step angle).
* Avendo queste informazioni, basta dividere 360 per lo Step angle
* per ottenere il numero di step del motore.
* E' evidente che piu' alto e' il numero degli step, piu' accurato sara' il movimento del motore
*/
int static stepMotore = 96; //modificare il valore in base agli step del motore in possesso

//un giro completo e' composto da 360 gradi, ne deriva che per compiere 180 gradi il motore dovra' percorrere
//un numero di step pari ai suoi "stepMotore diviso 2"
int stepDaPercorrere = stepMotore/2;

//definisco i pin che controlleranno il motore, per convenzione ho usato i nomi dei connettori presenti sul modulo L298N
int static IN1 = 11;
int static IN2 = 10;
int static IN3 = 9;
int static IN4 = 8;

//Istanzio un oggetto Stepper che rappresentera' il mio motore
Stepper mioMotore(stepMotore, IN1, IN2, IN3, IN4);

void setup() {
  //imposto la velocita' del motore
  //prova a giocare con questo valore per vedere le reazioni del motore
  //ma fallo gradualmente per non fare incazzare il motore...
  mioMotore.setSpeed(40);
}

void loop() {

  //effettuo il movimento di andata
  mioMotore.step(stepDaPercorrere);

  //attendo 50 millisecondi
  delay(50);

  //il metodo step accetta valori negativi
  //effettuo il movimento di ritorno
  mioMotore.step(-stepDaPercorrere);
  
  //attendo altri 50 millisecondi
  delay(50);
}

Questa volta è possibile scollegare l’Arduino dal pc dopo aver caricato il programma, in quanto Arduino sarà alimentato dal modulo L298N.

    Come sempre

  • Assicurati che tutti i collegamenti siano corretti;
  • Ricordati di impostare la porta COM del tuo Arduino;
  • Utilizza le tensioni corrette;
  • E ricorda che io non mi assumo nessuna responsabilità per eventuali danni o disastri che causi 😀

Prodotti Amazon



Il mio video


Puoi clonare il progetto direttamente da GitHub!

Approfondimenti


Risposta Michele


#include <Stepper.h>

int static stepMotore = 96; //modificare il valore in base agli step del motore in possesso

int stepDaPercorrere = 50; //numero di step necessari ad aprire il telo.

//definisco i pin che controlleranno il motore, per convenzione ho usato i nomi dei connettori presenti sul modulo L298N
int static IN1 = 11;
int static IN2 = 10;
int static IN3 = 9;
int static IN4 = 8;

int static SW = 12; //switch che risulterà chiuso alla chiusura del telo

//Istanzio un oggetto Stepper che rappresentera' il mio motore
Stepper mioMotore(stepMotore, IN1, IN2, IN3, IN4);

void setup() {

  mioMotore.setSpeed(25);//imposto la velocita' espressa in giri al minuto

  pinMode(SW, INPUT); //imposto il pin dello switch come input

  //resetto la posizione del telo. Lo chiudo!
  while (!isTeloChiuso()) {
    mioMotore.step(-stepDaPercorrere);
  }

}

void loop() {

  //il sensore mi dice che c'è troppo caldo e lo switch mi dice che attualmente il telo è chiuso
  if (devoAprire() && isTeloChiuso()) {
    //apro
    mioMotore.step(stepDaPercorrere);
  }

  //il sensore mi dice che c'è troppo freddo o piove e lo switch mi dice che attualmente il telo è aperto
  if (!devoAprire() && !isTeloChiuso()) {
    //chiudo
    mioMotore.step(-stepDaPercorrere);
  }

  //rimani fermo
  mioMotore.step(0);

  //attendo 50 mills
  delay(50);
}



boolean devoAprire() {
  //qui ci metto la logica che controlla la temperatura e decido il da farsi
  //restituisco true se voglio che il telo venga aperto, false se voglio chiuderlo
  return true; //false
}


boolean isTeloChiuso() {

  val = digitalRead(SW);

  if (val == HIGH) {
    return true;
  } else {
    return false;
  }

}

Ricerche che hanno riportato a questa pagina:
  • Antonio Gasperetti
  • Ciao Antonio, grazie per l’apprezzamento.
    Si, le piedinature dei moduli possono variare in base al fabbricatore… Capita! Bisogna prestare sempre attenzione a quanto riportato sui propri componenti 😉

  • Di nuovo ciao Antonio, con molta probabilità quanto ti accade è dovuto alla troppa corrente assorbita dal motore durante il suo funzionamento, con conseguente generazione di calore da parte del modulo e del motore stesso. Per questo motivo il modulo va in protezione termica ed interrompe il suo funzionamento.
    Una possibile soluzione sarebbe quella di limitare la corrente fornita in ingresso al modulo, cosi da evitare che il motore ne “ciucci” più del dovuto. In altre occasioni mi è capitato di vedere dei driver dedicati ai motori passo passo che presentano on-board un trimmer per regolare la corrente in uscita.
    Purtroppo non ne posseggo nessuno e non saprei darti maggiori info. Generalmente vengono usati sulle stampanti 3D o macchine CNC in genere. Sono piccoli e non molto costosi. Facendo attenzione al datasheet e alle tue esigenze dovresti riuscire a sostituire il classico LN298N con uno di questi specifico.
    Un interessante lettura:
    -> https://learn.adafruit.com/all-about-stepper-motors/
    -> https://learn.adafruit.com/all-about-stepper-motors/matching-the-driver-to-the-stepper
    Driver su Amazon: http://amzn.to/2jXTqbh

    Spero di esserti stato utile in qualche modo.
    Se deciderai di intraprendere questa strada, tienici aggiornati sulla tua esperienza 😉

  • Doshin So

    Ciao Andrea, ho un motore di una fotocopiatrice a sei fili. Vorrei utilizzarlo per farci un piccolo mulino per rompere i grani di orzo per farci la birra. Tu credi che il modulo alimentatore possa andare bene per qualunque motore?

  • Ciao, cosa intendi per modulo alimentatore!? Parliamo sempre del modulo L298N?
    Se si, credo che comunque non sia il miglior modo di farlo funzionare. Puoi dare un’occhiata qui: http://bit.ly/2l2nuDa

  • Michele Morandini

    Ciao Andrea
    Il motore però lo fai andare continuamente.. Io avrei bisogno di comandarlo però quando voglio io La mia applicazione se può farti capire meglio è su una serra dove il motorino deve aprire il telo se cè troppo caldo (dht22) o chiuderlo se piove/troppo freddo.. Si può con la libreria stepper controllare per quanti step deve girare avanti o indietro? Cosi faccio un if e metto dentro appunto gli step
    Se mi sono spiegato Ringrazio in anticipo e aspetto risposta 😉

  • Ciao Michele, come ti avevo anticipato in privato la cosa è fattibile. Basta chiamare il metodo step(nstep) all’interno della tua condizione, utilizzando nstep positivo o negativo in base a che tu lo voglia fare andare avanti o indietro. In questo caso, nstep saranno gli step necessari al motore per aprire o chiudere il telo.
    Così, ragionando al volo mi chiedo:
    Perchè non usi un servo al posto del motore passo passo?
    Cosa succede se va via la corrente o il programma si blocca?
    Come farà Arduino a capire se il telo risultava aperto o chiuso al momento del blackout?

    Ho provato a scrivere uno sketch implementando l’uso di uno switch (come quelli di fine corsa nelle stampanti).
    Lo switch se chiuso, deve restituire HIGH, e mettendolo quindi in posizione da essere premuto dal telo a fine corsa, potrà informare Arduino sullo stato del telo.
    Una funzione nel metodo setup del programma dovrebbe far si che il telo venga chiuso al momento dell’accensione, come per resettarne la posizione, per poi agire in base alla temperatura nel metodo loop.
    Il codice che ti propongo non l’ho testato perchè non ho nulla al momento con me. Non so nemmeno se il metodo nel setup gli dia fastidio.
    Se hai la possibilità, e se lo ritieni opportuno, testalo per noi e facci sapere.
    Ho messo il codice a fine articolo http://bit.ly/RISP-MICHELE

  • Michele Morandini

    Grazie
    Proverò in questi giorni
    Quindi pensando al funzionamento.. i due fine corsa servono solo per dare informazione del telo aperto/chiuso ad arduino?
    Se si, baipasso però il vantaggio dei motori step ovvero la possibilità di gestire precisamente gli step che deve fare il motore..

    Poi non ho ben capito cosa devo mettere dove hai commentato //qui ci metto la logica che controlla ecc..

  • Lo switch di fine corsa è uno solo, e serve a far capire se il telo è aperto o chiuso. Serve all’accensione e nel caso in cui vada via la corrente. Dove ho messo, qui ci metto la logica etc etc… Ci andrebbe la logica che legge i sensori e decide se bisogna aprire o chiudere il telo…

  • Michele Morandini

    https://uploads.disquscdn.com/images/abf71e3e5105cbf5126167285e86e237f607fd41be1af3e0201f638f471abfa5.png

    Ho provato anche semplicemente a fare uno sketch per vedere se riesco a controllare gli step del motore ma non funziona.. il motore parte ma non si ferma
    Ho sbagliato qualcosa?

  • Michele Morandini

    Come non detto
    Sono riuscito in qualche modo 😉
    Ho però un dubbio..
    è normale che il dissipatore dell’ l298n dopo circa 5 minuti che sta alimentando il motore (sia se lo fa girare, sia se lo tiene bloccato alimentando una bobina) non ci tieni le mani sopra.. anche il motore dopo un pò scalda.. è un motore 12v 1.3 A però mi sembra strano che a vuoto scaldi cosi tanto

  • E’ normale perchè i motori passo passo, anche se fermi rimangono in assorbimento (proprio per mantenere la posizione). Inoltre questi tipi di motore assorbono tutta la corrente che riescono ad ottenere dal circuito che li alimenta, con conseguente surriscaldamento. Per evitare questo problema occorre fornire al motore (e quindi far passare dal L298N) solo la corrente necessaria. Per questo si realizzano circuiti appositi per limitare la corrente, o in alternativa si usano altri tipi di driver che prevedono un sistema di regolazione della corrente. Un esempio sono gli Easy Driver (http://amzn.to/2lKf31n) che presentano un trimmer a bordo per regolare la corrente.

  • Per fermare il motore devi dirgli di eseguire uno step(0)

  • Ciao, scusa se ti rispondo tardi… Non sono riuscito a trovare il datasheet del tuo motore, comunque… Consiglio di usare un Easy Driver. Con esso potrai regolare la corrente da fornire al motore ed evitare quindi eccessivi assorbimenti e surriscaldamenti dei componenti (http://amzn.to/2lKf31n) . Nella guida che ti ho mandato nel commento precedente, vedi come escludere i due fili “di troppo”.

  • Michele Morandini

    Beh ma comunque lui riscalda ma in teoria non dovrebbe bruciarsi..
    Nè l298 nè il motore no?

  • Credo invece che qualcosa possa danneggiarsi con il troppo calore… sopratutto per un uso prolungato come il tuo. H24 7 gg su 7…

  • Michele Morandini

    Quindi ho comprato l 298 un pò per niente perchè non è adatto per i motori passo passo

  • Michele Morandini

    Non si può, come avevi detto, creare un circuito che limita la corrente? Volevo sfruttare l 298 e il motore dato che li ho in casa ora..

  • Lo puoi usare se gli metti un regolatore di corrente. Comunque nasce principalmente per pilotare uno o due motori DC 😉

  • Michele Morandini

    E dove posso trovarlo un regolatore di corrente? Come posso fare?

  • Michele Morandini

    Poi ho un ulteriore problema.. ho comprato arduino mega compatibile (non originale) però il mio pc non mi trova i driver e quindi non installa arduino mega
    Ho provato a cercare dei driver in internet ma non trovo nulla..
    Hai soluzioni? https://uploads.disquscdn.com/images/2577b1478d39b48419fe3e1e36ae793bcd6c183036463a77e1c30dfc6908f55c.jpg

  • Ciao Michele purtroppo non posso aiutarti, non ho abbastanza conoscenze in elettronica per progettarti un limitatore di corrente, e non ho tempo per fare qualche ricerca. Per quanto riguarda l’Arduino Mega prova a dare un occhiata su google, ho visto di gente che parla di problemi simili ai tuoi su Windows 7/8 e 10…
    Buona serata!

  • Michele Morandini

    Ho riscontrato un problema..
    Con il dht22 siccome legge i dati ogni due secondi
    Con il programma della serra ogni due secondi mi blocca il motore passo passo
    Ci sono soluzioni? Magari o nel codice ecc..

  • Vai su http://pastebin.com/ incolla il tuo codice, dove dice Syntax Highlighting metti C++ crea il pastebin e postami il link… senza vedere il tuo codice mi viene difficile capire come funziona 😉

  • Ciao Doshin, se tutti i collegamenti sono corretti e l’alimentazione è sufficiente per i tuoi motori, pare strano che non funzioni. Comunque… dopo vari test e prove, abbiamo capito che usare un modulo L298N non è la cosa ideale per far andare un motore passo passo. Il mio consiglio quindi è quello di optare per driver appositi (L298N nasce per pilotare 2 motori DC). Se dai un’occhiata qui: http://www.lombardoandrea.com/pilotare-un-motore-passo-passo-con-arduino-e-il-driver-a4988/ trovi una guida su come usare i driver A4988 che possono pilotare motori passo passo con alimentazione fino a 35 Volt e 2 Ampere circa.
    Spero di esserti comunque stato utile. 😉

%d blogger hanno fatto clic su Mi Piace per questo: