Stepper kit per Arduino

by luca
24 comments

Alla ricerca di una soluzione economica per dotare Arduino di un motore, ho trovato in vendita un kit composto da un motore passo-passo (stepper) unipolare e dalla relativa scheda di controllo.

Ho acquistato il kit da Hobby Components, ma kit simili sono disponibili su vari negozi online e su eBay. Il motore è siglato 28BYJ-48 (qui il suo datasheet), mentre la scheda di controllo si basa sull’integrato ULN2003, ricalcando lo schema presente sul sito di Arduino, con la sola aggiunta di 4 led per indicare la fase.

Il collegamento ad Arduino è molto semplice: sono necessari 4 pin digitali (nel mio esempio ho scelto 2-3-4-5) e l’alimentazione a 5V.

sebbene sia possibile alimentare il motore usando l’uscita a 5V di Arduino, è consigliata una fonte di alimentazione esterna

Per comandare il motore, possiamo utilizzare la libreria Stepper, indicando il numero di steps (passi) necessari per un giro completo (per il nostro motore 2048) e i pin che abbiamo utilizzato:

Stepper myStepper(2048,2,3,4,5);

Con il metodo setSpeed() possiamo decidere la velocità (= giri al minuto), mentre con step() muoviamo il motore di n passi (con n negativo il motore ruoterà in senso opposto):

#include   <Stepper.h>
 
Stepper myStepper(2048,2,3,4,5);
 
void setup() {
 
  myStepper.setSpeed(10);
}
 
void loop() {
 
  myStepper.step(2048);
  delay(1000);  
  myStepper.step(-2048);
  delay(1000);
}

Ecco un filmato che mostra lo sketch in azione:

[youtube id=”kyrvU2DV5qA” width=”600″ height=”350″]

Related Posts

24 comments

Enrico 10 dicembre 2012 - 09:49

Ciao
Ho lo stesso motore che scheda driver, ma non riesco a farlo funzionare nè con lo sketch che hai messo nè con gli esempi della libreria Stepper, giusto un po’ di ronzio ed un lieve riscaldamento.
Qualche idea ?

Reply
luca 10 dicembre 2012 - 10:40

ciao Enrico,

strano… i led come sono? tutti accesi? a me è capitato quando ho impostato una velocità troppo alta

Reply
Enrico 12 dicembre 2012 - 01:12

Ciao, sì i led si accendono. All’inversione di senso di rotazione si spengono il 2° ed il 4° per un istante, mentre nel tuo filmato mi pare di vedere che si spengono il 3° ed il 4°, per cui ho sospettato una inversione di terminali, ma non sono riuscito a trovareuna combinazione funzionante. C’è una pagina dove si discute di questo ( http://www.youtube.com/all_comments?v=asv5-kYzSsE&page=1 ) e risulterebbe (in alcuni esemplari?) appunto una inversione, ma anche seguendo le indicazioni … niente.
Solo con l’esempio di velocità regolata con un potenziometro ad un certo valore ho una parziale rotazione.
Il venditore vuole risarcirmelo, ma mi sarebbe piaciuto riuscire a farlo funzionare. Ma dove si trova il “cablaggio” interno ? ho misurato dei valori che si avvicinano a quello indicato nel datasheet, ma non capisco il 5° terminale

Reply
luca 12 dicembre 2012 - 08:53

Ciao Enrico,

ho trovato una differenza nel modo in cui sono realizzate alcune schede di controllo… prova a sostituire:

Stepper myStepper(2048,2,3,4,5);

con:

Stepper myStepper(2048,2,4,3,5);

e fammi sapere se così si inverte… eventualmente prova anche a ridurre la velocità

Reply
doc 29 giugno 2013 - 11:32

Ciao,
mi potresti dare un link per recuperare la libreria Stepper corretta?

Reply
luca 1 luglio 2013 - 21:13

ciao

è quella inclusa in Arduino, non devi scaricare nulla

Reply
Giacomo 11 luglio 2013 - 12:41

Ciao Luca,
Ho lo stesso tuo motore con la stessa drive board, ma quando carico il tuo programma ottengo solo un ronzio da parte del motore, l’albero non si muove. Hai qualche idea? E come hai fatto a sapere che il numero degli step è 2048? Io leggendo qualche documento ho letto che questo motore ha 64 step! Grazie in anticipo

Reply
luca 11 luglio 2013 - 12:59

Ciao Giacomo,

il motore ha 64 steps/giro ma incluso c’è un riduttore che li porta a 2048/giro.
prova come suggerito in un altro commento a mettere Stepper myStepper(2048,2,4,3,5);

Reply
Giacomo 11 luglio 2013 - 13:07

No.. niente da fare, stesso risultato 🙁

Reply
Luigi 17 luglio 2013 - 08:40

myStepper.setSpeed(10);

Il massimo valore inseribile è 7!

Reply
Luigi 17 luglio 2013 - 08:46

…con 5V
2048/64=32/4 step=8 (0-7)
🙂

Reply
luca 17 luglio 2013 - 18:52

Ciao Luigi

non ho capito il tuo ragionamento: la funzione setSpeed() imposta il numero di giri al minuto che fa il motore, da dove vedi che quel motore al massimo ne può fare solo 7?

Reply
Vito 2 agosto 2013 - 15:20

Ciao, sei il migliore! Miglior guida in assoluto per semplicità ed immediatezza. Ci tengo a precisare alcune cose: ho comprato quei motorini e ho eseguito il tuo sketch: intanto con la velocità a 10 non funzionano, ecco spiegato il ronzio di cui parlavano gli altri, a me va al massimo a 7, oltre gira male o non gira. Poi volevo dirti che dopo il delay continua a girare sempre nello stesso verso anche se il numero è negativo… Puoi spiegarmi perchè? Ultima cosa: ho bisogno di controllare due motorini per muovere qualcosa su due assi, si riescono a controllare due motorini di questo tipo (infatti ne ho presi proprio due) e magari implementare in modo semplice G-Code? Grazie in anticipo 😉

Reply
Fabio 16 giugno 2014 - 16:47

ciao scusa sono sempre io ho provato questo steck avendo una motor shield che usa per il mio motore passo passo i pin pwa = 3 dira=2 pwb=9 dirb=8 e fa 200 step per giro… così ho scritto:

#include

Stepper myStepper(200,2,3,8,9);

void setup() {

myStepper.setSpeed(10);
}

void loop() {

myStepper.step(200);
delay(1000);
myStepper.step(-200);
delay(1000);
}
ma il motore non gira ma traballa come se sbagliasse le fasi

Reply
luca 17 giugno 2014 - 09:54

ciao Fabio

prova a ridurre il numero di passi per giro…

Reply
Florin 14 giugno 2015 - 11:09

ciao luca, ho aggiunto al progetto anche il Wii nunchuck (il joystick), però ho bisogno di aiuto con il codice, mi daresti una mano??grazie

Reply
Gian Marco 19 giugno 2015 - 14:16

Il mio, identico a questo, funziona con:
Stepper myStepper(2048,1,3,2,12);

Reply
Gian Marco 19 giugno 2015 - 14:19

Dimenticavo, collegato come da schema. Non so come sia possibile che il motore funzioni bene nonostante NON abbia collegato il pin 1,3,2 e 12 ma, come da articolo, abbia collegato il 2,3,4,5!
Come velocità:
myStepper.setSpeed(9);

Reply
stepper 12 gennaio 2016 - 15:57

Davvero un bell’articolo. Quali sono le applicazioni per un motore stepper? Si potrebbe usare per far ruotare gli annunci su un piccolo tabellone pubblicitario?

Reply
luca 12 gennaio 2016 - 20:47

Grazie! Normalmente i motori stepper si utilizzano dove è necessaria precisione di movimento (CNC…) ma naturalmente possono essere impiegati ogni qualvolta serva “muovere” qualcosa.

Reply
Claudio Carletta 23 giugno 2017 - 22:21

Nel lontano 12/12/2012 hai scritto:
prova a sostituire:
Stepper myStepper(2048,2,3,4,5);
con:
Stepper myStepper(2048,2,4,3,5);

ed io oggi ho risolto.
Grazie

Reply
luca 30 giugno 2017 - 10:12

molto bene! 😉

Reply
Fabrizio 20 febbraio 2018 - 20:11

Buonasera, innanzitutto complimenti per l’articolo, ho provato e funziona perfettamente (con la modifica 2,4,3,5). Volevo solo un chiarimento, dal data sheet del motore lo stride angle è di 5,625° che grazie al riduttore passa a 0,088° circa, quindi per fare un giro dovrebbe impiegare 360/0.088=4096 passi però invece è giusto 2048 perchè con 4096 mi fa 2 giri..mi spieghi il tuo calcolo? Dove sbaglio? Grazie in anticipo!

Reply
luca 26 febbraio 2018 - 14:46

Ciao Fabrizio, i tuoi calcoli sono giusti in base al datasheet, purtroppo come altri utenti sul Forum Arduino hanno scoperto, quei motori arrivano con diversi motoriduttori… il mio (e quindi anche il tuo) in realtà paiono essere /32 e non /64 come dichiarato.

Reply

Rispondi a Florin Cancel Reply

dieci + undici =