Motore passo passo con Arduino e il driver A4988

In tema di pulizie di primavera, colgo l’occasione per mettere un po di ordine in questo ahimè trascurato sito. In questo articolo viene mostrato come eseguire il controllo di un motore passo passo tramite tre pulsanti ed il driver A4988.
Dico pulizia perché in realtà questo progetto era già presente sul sito, ma a suo tempo per velocizzarne la pubblicazione, lo avevo accodato ad un altro articolo dove iniziavo a parlare appunto di motori passo passo e driver A4988.
Per i dettagli relativi ai driver, o alle librerie ti consiglio di dare un’occhiata al precedente articolo. Qui mi limiterò a parlare di questa variante.
Tutto nasce per rispondere alla richiesta di un utente YouTube su un mio mio video.
L’obbiettivo è quello di pilotare un motore passo passo tramite tre pulsanti, due utilizzati per deciderne la direzione, l’altro per determinarne lo stop.
Anche se la richiesta veniva fatta su un video che mostrava come pilotare un motore passo passo con Arduino ed un modulo L298N, decisi che era il momento di utilizzare i componenti giusti in materia.
Di seguito trovi il codice ampiamente commentato ma come sempre se hai dei dubbi in merito, puoi usare la sezione commenti presente a fondo pagina.
Il Codice
/*
Autore : Andrea Lombardo
Web : http://www.lombardoandrea.com
Post : https://wp.me/p27dYH-NE
*/
//Inclusione delle librerie
#include <Bounce2.h>
#include <AccelStepper.h>
//definizione dei pin
const int motoreDir = 2;
const int motoreStep = 3;
const int pinBtnAvanti = 4;
const int pinBtnStop = 5;
const int pinBtnDietro = 6;
const int pinEnable = 7;
//uso il led onboard di Arduino, per avere un riscontro visivo dello stato di marcia o di stop
const int pinLedStato = 13;
/*
Velocità del motore in numero di step per secondo
Come riportato nella descrizione di AccelStepper, massimo 4000 per un Arduino UNO.
4000 steps per second at a clock frequency of 16 MHz on Arduino such as Uno
*/
const float velocita = 1000;
//Millisecondi per il debounce dei pulsanti
const int debounceMs = 10;
//Stato e direzione
boolean abilitato, direzione;
//Creazione istanza del motore
AccelStepper motore(AccelStepper::DRIVER, motoreStep, motoreDir);
//Creazione istanze dei pulsanti
Bounce btnAvanti = Bounce();
Bounce btnStop = Bounce();
Bounce btnDietro = Bounce();
void setup() {
//imposto stato e direzione iniziali (motore fermo)
abilitato = direzione = false;
//definizione della modalità dei pin
pinMode(pinBtnAvanti, INPUT);
pinMode(pinBtnStop, INPUT);
pinMode(pinBtnDietro, INPUT);
pinMode(pinEnable, OUTPUT);
pinMode(pinLedStato, OUTPUT);
//impostazione pullUp per i pin dei bottoni
digitalWrite(pinBtnAvanti, HIGH);
digitalWrite(pinBtnStop, HIGH);
digitalWrite(pinBtnDietro, HIGH);
//setta stato del pin enable e del led di stato
digitalWrite(pinEnable, !abilitato);
digitalWrite(pinLedStato, abilitato);
//configurazione parametri motore
motore.setMaxSpeed(velocita);
motore.setSpeed(velocita);
//Qui setti l'accelerazione del motore.
//il numero passato è inteso per numero di step al secondo
//fai delle prove per trovare quello che più ti conviene
motore.setAcceleration(20);
//inizializzazione bottoni
btnAvanti.attach(pinBtnAvanti);
btnAvanti.interval(debounceMs);
btnStop.attach(pinBtnStop);
btnStop.interval(debounceMs);
btnDietro.attach(pinBtnDietro);
btnDietro.interval(debounceMs);
}
void loop() {
//refresh stato dei pulsanti
btnAvanti.update();
btnStop.update();
btnDietro.update();
//leggi valore dei pulsanti
int valStop = btnStop.read();
int valAvanti = btnAvanti.read();
int valDietro = btnDietro.read();
//determina azioni
if (valStop == LOW) {
abilitato = false;
}
if (valAvanti == LOW) {
abilitato = true;
direzione = true;
}
if (valDietro == LOW) {
abilitato = true;
direzione = false;
}
//cambia stato ai pin ENABLE e LedStato
digitalWrite(pinEnable, !abilitato);
digitalWrite(pinLedStato, abilitato);
//se abilitato == true
if (abilitato) {
//in base al valore di direzione
if (direzione) {
//imposta velocità (e senso)
motore.setSpeed(velocita);
} else {
//imposta velocità negata (inversione di marcia)
motore.setSpeed(-velocita);
}
//muovi il motore
motore.runSpeed();
} else { //se abilitato == false
//in realtà questa istruzione viene ignorata inquanto il pin ENABLE del modulo
//è stato impostato ad HIGH e quindi le uscite dei FET sono spente
motore.stop();
}
}
In questo progetto iniziavo a sfruttare la funzionalità del pin ENABLE del modulo A4988. Premendo il pulsante di stop, lo stato di ENABLE viene impostato ad HIGH, con conseguente rilascio del motore dovuto allo “spegnimento” dei FET che gestiscono le uscite 1A, 1B, 2A, 2B.
Schema dei collegamenti
A fondo pagina trovi il link per scaricare il pacchetto zip contenente il codice e lo schema dei collegamenti.
Come sempre
- Assicurati che tutti i collegamenti siano corretti;
- Ricordati di impostare la porta COM del tuo Arduino;
- Utilizza le tensioni corrette;
- Ricorda che io non mi assumo nessuna responsabilità per eventuali danni o disastri che causi 😀