Motore passo passo con Arduino e il driver A4988

Controllo Motore passo passo con Arduino e il driver A4988 mediante tre pulsanti

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

Schema dei collegamenti per motore passo passo con Arduino e il driver A4988
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 😀

Prodotti Amazon




Approfondimenti

Potrebbero interessarti anche...