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 ti mostro come pilotare un motore passo passo con Arduino e il driver A4988 e tre semplici pulsanti.
Dico ordine 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.
Perché
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
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 😀
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.
Commentati Recentemente