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.

Iniaizamo

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.

Continua a leggere su Wikipedia

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 😀

A fine pagina trovi il link per scaricare il pacchetto con codici e schemi di collegamento. Come sempre ti ricordo che acquistando prodotti Amazon passando attraverso i link del mio sito, io percepisco una piccola commissione (parliamo di centesimi) in buoni regalo. Questi buoni sommati alle eventuali donazioni PayPal, servono a mantenere attivo il sito web e ad acquistare nuovi componenti.

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

}

Potrebbero interessarti anche...

Available for Amazon Prime