mercoledì 24 settembre 2014

Collegare il motore passo passo 28BYJ-48 ad Arduino UNO R3

Ciao e ben ritrovati sul Blog Aspettando il Bus. Negli ultimi giorni sono stato abbastanza impegnato e non ho avuto il tempo di mostrarvi il motorino 28BYJ-48 e come controllarlo con Arduino UNO R3, ma rimediamo subito...
(nota: La versione per Olimexino 85 è qui)

Il progetto che vi propongo oggi è abbastanza economico, il modulo con l' ULN2003A ed il motore passo passo costano circa 8 Euro ma si possono trovare anche a meno. Vediamo la foto del progetto di oggi:

Arduino UNO R3 e motore passo passo 28BYJ-48 - Foto di Paolo Luongo
Fig. 1 - Arduino UNO R3 e motore passo passo 28BYJ-48 - Foto di Paolo Luongo


Step Motor 28BYJ-48 - Foto di Paolo Luongo
Fig. 2 - Step Motor 28BYJ-48 - Foto di Paolo Luongo

Iniziamo col motorino 28BYJ-48 e dal suo datasheet. Il motorino è già provvisto di connettore per il collegamento. Si tratta di un motore passo passo unipolare con 4096 passi per una rotazione di 360 gradi. Il suo perno non si ruota facilmente, anche senza alimentazione elettrica resta bloccato. Quindi si può risparmiare energia non alimentando gli avvolgimenti quando deve restare fermo e così si riscalderà molto meno. I colori dei fili del motore sono Blu, Rosa, Giallo, Arancio e Rosso.

Modulo di controllo motore 28BYJ-48 con UNL2003A - Foto di Paolo Luongo
Fig. 3 - Modulo di controllo motore 28BYJ-48 con UNL2003A - Foto di Paolo Luongo

Vediamo le istruzioni del modulo di controllo che utilizza l'integrato ULN2003A con il suo datasheet.  Sulle mie perplessità su questi moduli e di come controllare gli step motor ne ho già parlato qui. Tornando a noi, guardando nel PDF troviamo alcune utili informazioni:
  1. Quali sono le fasi del motore ed il colore dei fili delle fasi;
  2. In che modo si devono attivare le varie fasi per farlo girare correttamente.
Per questo modulo ho collegato i fili, da sinistra a destra, di colore Verde, Arancio, Rosso, Blu. L'alimentazione +12 Volt o +5 Volt dipende dal motore passo passo utilizzato, (nella foto il filo Giallo) e GND (Marrone). Il Giallo si può collegare al piedino Vin di Arduino UNO R3 per motori a 12 volt e ai 5 Volt se utilizzate il 28BYJ-48. Il marrone va collegato ad un piedino GND sulla board Arduino UNO R3.

Su Arduino UNO R3 il filo Blu va collegato al Pin11, il Rosso al Pin10, l' Arancio al Pin 9 ed il Verde al Pin8. Ovviamente i piedini si possono cambiare ma si deve modificare lo sketch.

Sketch per il comando del motore con Arduino UNO R3 di Paolo Luongo
Fig. 4 - Sketch per il comando del motore con Arduino UNO R3 di Paolo Luongo

Dopo aver scaricato lo sketch si carica nell' IDE di Arduino e si programma Arduino UNO R3.
Vista la finalità puramente didattica vediamo alcune parti dello sketch. Nella foto precedente ci sono le indicazioni di quali Pin di uscita si voglio utilizzare, questo è il posto dove cambiarli.


Sketch:Ritardo iniziale - di Paolo Luongo
Fig. 5 - Sketch:Ritardo iniziale - di Paolo Luongo

La funzione Ritardo Accensione  permette di avere un ritardo iniziale di 5 secondi prima di far iniziare la rotazione del motore. E' buona norma, prima di azionare dei meccanismi, prevedere una breve pausa per permettere all'operatore di allontanarsi dal macchinario prima che inizi la lavorazione.


Sketch: Controllo motore - di Paolo Luongo
Fig. 6 - Sketch: Controllo motore - di Paolo Luongo

Se date uno sguardo al PDF del modulo scoprirete che per far ruotare il motore passo passo 28BYJ-48 bisogna alimentare le fasi seguendo un ordine preciso. Bene questa sequenzialità è fatta da questa parte di codice. Ho scelto di far muovere il motore con otto sequenze. Se preferite farlo con quattro sequenze ecco la parte che dovete modificare.

Scketch: Inizializzazione della Board Arduino Uno R3 - di Paolo Luongo
Fig. 7 - Scketch: Inizializzazione della Board Arduino Uno R3 - di Paolo Luongo

Questo è il solito blocco di inizializzazione: notate la funzione di ritardo all'accensione.


Sketch: Parte del programma princiaple di controllo - di Paolo Luongo
Fig. 8 - Sketch: Parte del programma principale di controllo - di Paolo Luongo

Questa è solo la prima parte del programma di controllo. E' la parte che si occupa della rotazione oraria. Il motore ruota di 90 gradi, fa una pausa di mezzo secondo poi ruota, pausa...fino a fare una rotazione di 360 gradi. Notate che per far ruotare il motore di 90 Gradi servono 1024 impulsi.
Dopo la rotazione oraria c'è una pausa di 1 secondo per poi fare la rotazione antioraria.

Bene, per oggi è tutto. Devo scappare: FINALMENTE è arrivato il BUS !

Se hai dei dubbi, commenta l'articolo e leggi le FAQ.

Ciao
Paolo :-)

Leggi altri articoli del Blog.

28 commenti:

Unknown ha detto...

Grazie Paolo

paolo percds ha detto...

Prego.
:-)

Unknown ha detto...
Questo commento è stato eliminato dall'autore.
Unknown ha detto...

perfavore ho bisogno di uno sketch per comandare lo stesso motore qui sopra in modo che giri costantemente veloce ma che si possa anche modificarne la velocita tramite un potenziometro da 10k ed e anche necessario poter invertire il senso rotazione tramite un interruttore e senza l'ausilio di chip inoltre ho bisogno che visto che si tratta di un carrello che scorre su binario siano presenti due interruttori situati uno per ogni estremita del binario e che quando sono premuti facciano arrestare la corsa del carrello e quindi del motore in fine c'è bisogno di un interruttore che quando il carrello preme su uno dei due interruttori di arresto descritti prima serva a far ripartire il motore nel senso opposto.
Voglio specificare che lo sketch deve funzionare su arduino micro e per il motore uso un driver con l' integrato uln2003apg e in ultimo ho bisogno di molta coppia e detto questo mi servirebbe al piu presto lo sketch qui descritto grazie mille di tutto stavo impazzendo non sapevo piu come fare grazie ancora

Unknown ha detto...

riguardo al post precedente: visto che vorrei evitare errori mi sarebbe molto utile uno schema per il cablaggio per esserepiu precisi e andare sicuro grazie mille

paolo percds ha detto...

Ciao Salvatore, purtroppo è un favore che non ti posso fare per diverse ragioni, tra cui:
1) non ho Arduino Micro;
2) quello che mi chiedi è un vero lavoro per cui è logico attendersi un compenso e sono molti anni che ho smesso di fare lavori su commissione;
3) lo scopo di questo Blog è quello di invogliare le persone a sperimentare le proprie idee con la gioia d'imparare, magari nei ritagli di tempo;
4) la coppia di questo motore passo passo non credo vada bene, viste le sue ridotte dimensioni, sicuro di aver scelto il motore con la coppia giusta?

Ti ringrazio per la fiducia ma, purtroppo, non ti posso aiutare e se realizzerai la tua idea, sarò lieto di aggiungere qui il tuo link.

Ciao
Paolo

Unknown ha detto...

sinceramente senza offesa non mi sembra un gran lavoro non lo faccio solo perche ho provato e non riesco a far girare il motore e poi non ho chiesto di costruire il circuito ma solo di darmi una mano con lo sketch anche perche per la compatibilita con arduino micro c' è solo da selezionare nella lista" tipo di arduino " il tipo di arduino comque non si e obbligati a farlo ma semplicemente ho solo chiesto e comunque se neanche si parla di queste cose non vedo l' utilita del blog visto che uno sketch come quello sopra non serve a un cavolo

paolo percds ha detto...

Mi dispiace che non ti sia chiaro a cosa serva questo Blog e a cosa possa servire lo sketch dell’ articolo ma, visto “che non è un gran lavoro", credo che tu lo possa fare con estrema facilità ed è proprio questo lo scopo del Blog: invogliare le persone a realizzare i propri progetti da soli.
Ripeto: quando realizzerai il tuo progetto, sarò lieto di pubblicare qui il link del tuo blog col progetto pubblicato.

Ciao
Paolo

giuseppe ha detto...

Ciao Paolo, Mi sono imposto di modificare il tuo sketch per poter far muovere il motore passo passo di un grado alla volta, con impulso proveniente da foto resistore, ...cosa da non poco per le mie competenze. Per quanto riguarda la modifica all'assetto del motore credo di aver capito dove agire, ma vorrei un consiglio di come andare a inserire la parte di sketch in cui il 28BYJ-48 prende ordini dai foto resistori. Ti ringrazio sin da adesso per ispirazione che saprai darmi alla soluzione dell'arcano.
Un caro saluto
Giuseppe

paolo percds ha detto...

Ciao Giuseppe, non mi è chiaro quello che vuoi fare. Mi spiego meglio: il motore 28BYJ-48 compie una rotazione di 360 gradi in 64 passi, quindi con un passo fa una rotazione di 5,625 gradi. Occorre una riduzione da 5,625 a 1 per ottenere un grado, e questo è un problema puramente meccanico e di ingranaggi. Perché non utilizzare un motore con un maggior numero di passi per grado? Avresti una maggiore precisione.
Per l'uso del fotoresistore, bisogna controllare lo stato (illuminato/oscurato), aspettare il cambio di stato e far fare uno step al motore passo passo. Attenzione a non sopravvalutare la coppia di questo motorino, appena 34,3 milliNewtonMetro: rischi che non “giri”.

Ciao e buon lavoro.
Paolo :-)

giuseppe ha detto...

Ciao Paolo, Mi scuso per la poca chiarezza con cui mi sono espresso, Volevo realizzare il classico inseguitore solare.. prototipo per eseguire delle misurazioni, la coppia del motore era sufficiente al mio scopo. Mi sembra di aver letto sulla scheda che i passi del 28BYJ-48 siano 4096 per 360° sarebbe 11,3 passi per un grado una precisione anche eccessiva per l'applicazione, potresti darmi un indizio di come applicare i foto resistori al comando del motore.
Grazie
Giuseppe

paolo percds ha detto...

Ciao Giuseppe, hai ragione sui “4096 step”. Si tratta di micro passi ottenuti con degli ingranaggi inseriti all’interno del motore stesso. Puoi vederli in questo video dove il motore è fatto a pezzi.
Per la questione delle fotocellule, ipotizzando uno spostamento Est-Ovest (senza complicarsi troppo la vita con l’aggiunta di un Nord-Sud) collegherei due foto resistori, ognuno in un tubetto nero, ai due lati.
I due fotoresistori saranno collegati agli ingressi analogici di Arduino (ogni fotoresistore ha un pin collegato ai +5V e l’altro ad un ingresso analogico). Dopo la accensione di Arduino farei un veloce posizionamento a Est con l’ausilio di un pulsante di fine corsa, poi inizierei a cercare il sole spostando il tutto lentamente a Ovest. Una volta “centrato” il sole, farei una lettura della tensione fornita dai due foto resistori, non in modo continuativo ma solo ogni 5 o 10 secondi, per evitare continui spostamenti del sistema motore-sensori per qualche ombra improvvisa.

Buon lavoro
Paolo :-)

Unknown ha detto...

aiutoooooo!! ciao, vorrei gentilmente sapere come fare ad alimentare le singole fasi del motore, vorrei che facesse una rotazione di 90 gradi in senso orario con il verificarsi di una determinata condizione e una rotazione di 90 gradi in senso antiorario con verificarsi di un'altra condizione.
com'è il codice per far si che ciò avvenga?
grazie mille in anticipo

paolo percds ha detto...

Ciao Rosanna,
se leggi con attenzione lo sketch vedrai un ciclo che è ripetuto per 1024 volte: serve per far fare una rotazione di 90 gradi al motore passo passo. E' nell'ultima immagine dello sketch dell'articolo.
Basta adattarlo al tuo sketch.
Buon lavoro !

Unknown ha detto...

salve
ho comprato lo stesso motore ma

ha 5 fili :
rosso
arancione
giallo
rosa
blu

fornito di una SCHEDA DRIVER CONTROLLO ULN2003 PER ARDUINO

come si puo collegare alimentandolo esternamente
grazie
buon anno
peppe

paolo percds ha detto...

Ciao e Buon Anno.
I fili del motore hanno gli stessi colori del mio, come noterai osservando la foto di Fig. 2. Non conosco il tipo preciso di "scheda driver" che hai utilizzato ma suppongo abbia lo stesso integrato ULN2003 dell'articolo e sia identica.
Per maggiori informazioni sul motore passo passo puoi consultare il PDF che trovi (come link) nell' articolo.
Poi se mi spieghi meglio cosa intendi per "come si può collegare ... alimentandolo esternamente" spero di poterti aiutare.

BUON 2016!
Paolo :-)

Unknown ha detto...

Ciao Paolo
innanzi tutto volevo farti i miei complimenti del lavoro sei veramente bravo comunque non capisco la teoria dello sketch che hai fatto, ho visto diversi tutorial in internet ma quello che hai fatto è troppo complicato...mi potresti dare una mano a capire con una descrizione più approfondita della programmazione?

paolo percds ha detto...

Ciao Kalogero,
è quello che vorrei fare ma non trovo il tempo per pubblicare i nuovi articoli. Devi avere un pò di pazienza e, nel frattempo, puoi consultare le FAQ del progetto.
Grazie per i complimenti.
Ciao
Paolo :-)

Sandro Franchini ha detto...

Ciao,
avrei intenzione di realizzare un progetto in cui ci sono 8 motori passo passo che si devono muovere contemporaneamente. Ho trovato navigando a questo link https://www.adafruit.com/products/1411
una shield e desidererei sapere se secondo te è possibile con questa shield pilotare i miei 8 motori passo passo con ovviamente i rispettivi driver. Conosci eventualmente altre alternative o hai suggerimenti da darmi?
Ti ringrazio.

paolo percds ha detto...

Ciao Sandro Franchini, il modulo che segnali nel tuo post è molto interessante ma bisogna vedere che potenze è in grado di gestire. Mi spiego: i motori passo passo possono essere controllati in modo PWM per migliorare il loro rendimento, ma bisogna anche prendere in considerazione la corrente di cui hanno bisogno per lavorare. Il modulo, sempre da una velocissima lettura, mi sembra basato sul chip TLC5940 che eroga dai 60 ai 120 mA per ogni pin, ma questa potenza è legata alla potenza massima dissipabile dal chip. Inoltre non conosco quali motori passo passo pensi di voler utilizzare, la loro potenza e quali sono i "driver" che vorresti utilizzare.
Sono Hardware o Software ?

Ciao
Paolo

Sandro Franchini ha detto...

Paolo grazie per la tua risposta.
Il progetto che devo realizzare prevede 32 motori passo passo identici a quello del tuo esempio 28BYJ-48 e dello stesso driver. I motori devono ruotare contemporaneamente e muovere delle banali lancette (tipo quelle di una sveglia) di una lunghezza di 12 centimetri e di un peso di uno o forse due grammi cadauna.
Nelle specifiche della shield che ti ho sottoposto viene riportato che se ne possono utilizzare una sopra l'altra fino a 62 per un totale di 992 PWM output!
Dato che le lancette devono fare delle rotazioni da 0 a 540° (3 x 180°) sto valutando di usare dei servocomando che tramite un accoppiamento di due ruote dentate mi producano ad una rotazione di 180 gradi del servo, 540 gradi di rotazione della lancetta (rapporto 1:3; ad esempio un ingranaggio da 30 denti sul servo ed un pignone da 10 denti sulla lancetta).
Tu cosa pensi?
Grazie.
Sandro

paolo percds ha detto...

Ciao Sandro,
alla fine le due ideee si equivalgono nel costo problemi/benefici, quindi è solo una questione di gusti: io sceglierei i motori passo passo. Comunque in bocca al lupo per il tuo "piccolo" (nota le virgolette) progetto.
Se vorrai condividere il frutto del tuo lavoro, sarò lieto di linkarlo.

Buon lavoro ;-)
Paolo

Unknown ha detto...

Ciao Paolo,
ho copiato fino alla fig. 8, ma poi mi sono accorto che non si legge l'ultima riga e forse manca la fig. 9.
Puoi aiutarmi a terminare,
Grazie
Francesco

paolo percds ha detto...

Ciao Francesco, nei miei articoli non pubblico l'intero sketch, perchè è noioso da ricopiare e si può sbagliare, ma aggiungo un link da cui scaricarlo. In questo articolo il link si trova dopo la Fig. 4.
Le figure, con i segmenti di codice, ne mostrano alcune parti significative per modifiche o personalizzazioni.

Ciao e buon lavoro.
Paolo ;-)

Unknown ha detto...

Perfetto Paolo,
quale riga da aggiungere per uscire da un Loop?. Vorrei che eseguisse un avanti e un indietro e poi stop.

paolo percds ha detto...

Ciao Francesco,
come sai il comando STOP con un µC non ha molto senso. In questo caso lo puoi tenere "molto occupato" aggungendo while(1==1);.
Così resterà "impegnato" fino alla pressione del tasto reset, per poi ricominciare dell'inizio.

Ciao
Paolo

Federico Salis ha detto...

4096 passi ?? sono 64 step, ha un angolo di 5.625° .. quindi 360/5.625=64 . lo dice anche il datasheet

paolo percds ha detto...

Ciao Federico Salis,
il datasheet "dimentica" di informare che il motore ha un ingranaggio che riduce l'ampiezza dello step, perciò per fare un angolo giro occorrono 4096 "step".
Buon lavoro
Paolo
;-)