Visto il mio interesse verso le stampanti 3D e vista la progettazione che sto seguendo di una di esse, voglio parlarvi di come pilotare motori passo-passo (stepper) con Arduino e un integrato di tipo ULN2003A. Andremo a vedere, in modo sintetico, il funzionamento di un motore stepper e dell'integrato, la realizzazione di un circuito di test e la stesura del codice per Arduino.
Un motore passo-passo, anche definito stepper, è un tipo di motore sincrono che può, a seconda degli avvolgimenti eccitati dalla corrente continua, dividere i suoi movimenti in passi (step). Questo tipo di motori non ha spazzole e, rispetto ai normali motori CC, ha il vantaggio di poter fare movimenti precisi, tenendo fermo l'albero con poco margine di errore. Ne esistono di due tipi, riconoscibili in base al numero di fili che indicano le fasi:
- unipolari (5, 6 o 8 fili)
- bipolari (4 o 8 fili)
Nel nostro caso andremo ad utilizzare un motore unipolare del tipo Nema 17 da 200 passi 0,44A. Il motore avrà una corrente di 0,44A perchè l'integrato che useremo potrà gestire una corrente massima di 0.5A.
L'integrato ULN2003A (qui trovate il suo datasheet) è composto da 7 transistor Darlington e, come è stato detto, può gestire una corrente massima di 0.5A e tensioni massime in uscita di 50V. E' da sottolineare che per ogni motore che vogliamo usare bisognerà utilizzare un integrato: infatti, ULN2003A può gestire 1 motore stepper oppure 2 motori CC semplici.
Passiamo ora allo schema elettrico da usare. Lo schema è questo proposto di seguito
Nell'immagine è indicato l'integrato 2004 ma il datasheet è lo stesso del 2003A quindi sono identici.
Dallo schema elettrico si può notare che verranno usati gli input 1, 2, 3, 4 per ricevere il segnale da Arduino e i rispettivi output (13, 14, 15 e 16) per collegare le 4 fasi del motore. Useremo poi il pin 8 a massa (GND) e il rispettivo (COM) come comune con il motore e l'alimentazione dello stesso. Per l'alimentazione, possiamo utilizzare una tensione supportata da entrambi oppure alimentare separatamente i due componenti, cioè utilizzare 5v per il Darlington ed un alimentatore a parte per il motore.
Per capire meglio i collegamenti generali e costruire un circuito di test, si può osservare la seguente immagine esplicativa
In questo caso si può notare come l'alimentazione sia presa esternamente, anche se è presente un collegamento con i 5V di Arduino. La fonte, però, come si può leggere dal datasheet dell'integrato, non deve superare i 30V in entrata.
Tenendo in considerazione che stiamo usando dei motori che funzionano a 5V 0.44A, si potrebbe anche usare la sola alimentazione che arriva da Arduino per entrambi i dispositivi in quanto il computer riesce a pilotare entrambi senza causare sovraccarichi della porta USB.
Nello schema generale, i pin 8, 9, 10 e 11 di Arduino sono collegati con i pin 1, 2, 3 e 4 dell'integrato; i restanti pin dell'ULN2003A sono collegati come precedentemente descritto.
A questo punto, costruito il nostro circuito, possiamo passare ai test ma prima ancora serve effettuare la stesura del codice di Arduino. Sul sito ufficiale si possono trovare numerosi tutorial e parti di codice utili per qualsiasi evenienza. Prendiamo in esame il codice per pilotare un solo motore:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
/* Stepper Copal * ------------- * * Program to drive a stepper motor coming from a 5'25 disk drive * according to the documentation I found, this stepper: "[...] motor * made by Copal Electronics, with 1.8 degrees per step and 96 ohms * per winding, with center taps brought out to separate leads [...]" * [http://www.cs.uiowa.edu/~jones/step/example.html] * * It is a unipolar stepper motor with 5 wires: * * - red: power connector, I have it at 5V and works fine * - orange and black: coil 1 * - brown and yellow: coil 2 * * (cleft) 2005 DojoDave for K3 * http://www.0j0.org | http://arduino.berlios.de * * @author: David Cuartielles * @date: 20 Oct. 2005 */ int motorPin1 = 8; int motorPin2 = 9; int motorPin3 = 10; int motorPin4 = 11; int delayTime = 500; void setup() { pinMode(motorPin1, OUTPUT); pinMode(motorPin2, OUTPUT); pinMode(motorPin3, OUTPUT); pinMode(motorPin4, OUTPUT); } void loop() { digitalWrite(motorPin1, HIGH); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW); delay(delayTime); digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, HIGH); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW); delay(delayTime); digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, HIGH); digitalWrite(motorPin4, LOW); delay(delayTime); digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, HIGH); delay(delayTime); } |
- le linee 23-26 indicano la corrispondenza tra la fase del motore e il pin al cui è collegata ad Arduino
- la linea 27 indica il ritardo di rotazione, in millisecondi, tra uno step e quello successivo
- le linee 29-34 impostano i pin di Arduino in modalità OUTPUT
- le linee 36 e 57 indicano la funzione di "loop" in modo da far compiere un ciclo continuo all'albero del motore
- le linee 37-40 indicano ad Arduino di invare un segnale HIGH sul pin 8. Quest'ultimo, collegato con l'ULN2003A, collegherà la fase corrispondente del motore facendolo avanzare. Le stesse righe indicano ad Arduino anche di inviare un segnale LOW ai pin dal 9 a 11, mentre la riga 40 impone di aspettare 500 ms prima di procedere con altre istruzioni
- le linee 42-56 impostano un segnale HIGH in successione ai pin 9, 10 e 11 attendendo, per ogni passo, un tempo di 500 millisecondi
Come si può vedere, pilotare un motore stepper non è molto complicato e il codice descritto può essere ampliato per pilorare più di un motore. Questo tipo di motori è molto utile per far muovere, nel caso di una stampante 3D, tutti i meccanismi, dalle barre filettate alle cinghie all'estrusore, per la loro precisione e per la maggiore coppia motrice che hanno rispetto ai normali motori a corrente continua. Inoltre questo tipo di motori non ha spazzole, a differenza dei normali motori, e quindi ha una maggiore vita. Uno svantaggio di questi però è l'eccessivo costo, ma si può ovviare a ciò cercando su siti di materiale usato, come ad esempio qui, oppure procedere in sano spirito Open e recuperare alcuni motori da vecchie stampanti Canon (dalla mia esperienza le Hp hanno sempre semplici motori CC) oppure da scanner.
BUONA PROGETTAZIONE!
Un ottima guida, come sai anche io mi devo cimentare nella programmazione di motori stepper, il tuo articolo mi tornerà molto utile, dato che devo imparare da zero il linguaggio di arduino. Particolarmente apprezzata la spiegazione per linee di comando.
Ciao Cristian
Mi associo al commento di Luca, ottima guida per iniziare a utilizzare questa tipologia di motori, che possono anche essere recuperati da vecchie stampanti.
Uno dei problemi di questa tipologia di motori è di riuscire a trovare le loro caratteristiche e soprattutto l’ordine di collegamento dei cavi.
Anch’io ho fatto alcune esperienze con questo tipo di motori e a suo tempo ho realizzato alcune schede di comando basate sia sull’integrato ULN2003A.
http://www.adrirobot.it/robot_deagostini/moduli/stepper/modulo-stepper.htm
Oppure sull’integrato L293
http://www.adrirobot.it/robot_deagostini/moduli/l293/modulo-motori-l293.htm
Oppure ancora con una scheda con foto accoppiatori e transistor
http://www.adrirobot.it/menu_new/index/index_stepper.htm
Se può essere d’aiuto, sempre, sul mio sito è disponibile una pagina con un po’ di teoria e informazioni utili
http://www.adrirobot.it/elettronica/stepper/stepper_motor_theory.htm
Saluti
Adriano
Bell’articolo, Cristian, molto interessante.
Avevo letto in giro di come funzionano questi motori e di come si possa pilotarne uno con Arduino. Per ora non ho necessità di pilotare motori passo-passo, però se possibile vorrei cogliere l’occasione per togliermi un dubbio che riguarda le CNC e simili. Dunque, finché si tratta di un codice come questo non ho grosse difficoltà: io imposto la direzione, il ritardo degli step, e finché non lo fermo, Arduino mi fa girare in maniera prestabilita il motore. Però ad esempio, come faccio a far capire al microcontrollore, in automatico, quali movimenti deve compiere nel seguire un disegno da stampare? Se Arduino non interpreta il G-code nativamente, come si fa a fargli capire quali movimenti deve fare? Non riesco proprio a immaginare quale potrebbe essere un esempio di codice Arduino per una macchina CNC, che gli faccia memorizzare il percorso, e poi regolare i motori in modo da seguirlo.
Grazie in anticipo e buona serata!
Anto
La guida è quella famosa che ho citato in alcuni commenti nel forum. E’ molto semplice pilotarli, pensa anche per me che di Arduino mastico poco, e leggendo lo sketch si riescono a capire subito i comandi principali e di base 😉 Con le opportune modifiche potresti anche usarlo per il tuo dirigibile.
A proposito, come procede il progetto? 🙂
Ciao Adriano,
innanzitutto ti ringrazio e, sì, è molto interessante e semplice per chi non ha molte basi di Arduino. Ho creato questa guida perché nella realizzazione della mia stampante mi tornava proprio utile e ho riunito tutte info in un’unica guida. 🙂
Come dici tu, la particolarità di questi motori è che si trovano nelle stampanti più vecchie (tranne le Hp che per esperienza non ne montano). Il problema è proprio trovare le fasi di questi motori, soprattutto negli unipolari con più cavi. Interessanti le tue schede di controllo, molto simili alla guida, e ricordano molto le board Stepper Driver della RepRap.
Utilissimo il link alla teoria, avevo in mente di inserire un po’ di teoria nella guida ma sarebbe risultata molto lunga; nel caso potrei fare un nuovo articolo su come riconoscere velocemente le fasi.
Grazie Antonello! 🙂
Cerco di rispondere subito al tuo dubbio. Questo codice può essere usato anche per un CNC (da qualche parte dovrei ancora avere lo sketch per pilotare due motori simultaneamente, tipo asse X e Y di una CNC, e nel caso te lo posso passare 😉 ). Detto ciò, Arduino e questa board vanno accoppiati ad un programma sul pc: in pratica, come per le stampanti 3D, tu avrai un modello 3D sul pc che dovrai trasformare, se serve, in formato .stl, successivamente in formato g-code (usando per esempio il software Slic3r), in modo da impostare tutti i parametri della CNC, e infine avrai bisogno di un programma (tipo Printer Interface) che invii i segnali (basati sul file g-code) alla macchina affinché questa sappia come muoversi.
Quindi, oltre al codice su cui imposti i vari parametri, quali numero di step, direzione e ritardo, ti servono anche un po’ di programmi per indicare ad Arduino quali motori azionare in base a quello che devi creare.
Se ti serve lo sketch di cui ho parlato prima, dimmelo che te lo invio senza problemi 😉
Ciao Antonello
Convengo con quanto dice Cristian, esiste la possibili far si che Arduino piloti i vari stepper, per fare questo occorre ovviamente convertire le istruzioni GCODE in comandi per pilotare i motori ed eseguire in questo modo i comandi ricevuti.
Per fare questo è possibile implementare la routine all’interno del programma da caricare nella memoria di Arduino che ricevendo le istruzioni GCODE riesce poi a ad interpretarli, e quindi spostare i motori in base ai comandi.
Oltre a questo è possibile inserire degli algoritmi per muovere i motori in contemporanea in modo da ottimizzare il percorso degli utensili.
Se vuoi farti un’idea del programma, puoi vedere questo link, per azionare due motori
http://www.marginallyclever.com/blog/2013/08/how-to-build-an-2-axis-arduino-cnc-gcode-interpreter/
Oppure questo link in cui è visibile l’azionamento di quatto motori/assi
http://www.marginallyclever.com/blog/2013/09/how-to-build-a-4-axis-cnc-gcode-interpreter-for-arduino/
Saluti
Adriano
Ciao Cristian,
Beh se possibile sì, mi piacerebbe vedere un codice di esempio, tanto per capire in concreto quali possono essere le istruzioni impartite ad Arduino… Ma quindi non è propriamente Arduino che pilota i motori: cioè, Arduino sa che per far percorrere una certa distanza alla testina in una certa direzione deve muovere un certo motore in un determinato modo. Però quale distanza e quale direzione non sono istruzioni che provengono da Arduino, ma da un altro programma, che elabora il percorso… Faccio un esempio: Io dico ad Arduino che n step del motore X corrispondono a 1cm. Poi il g-code gli dice di percorrere 10cm verso destra, e allora Arduino azionerà il motore X facendogli fare nx10 giri? E’ così o ho capito male?
Grazie, buona domenica!
Anto
Ciao Antonello
Con gli esempi che ho inserito nel mio precedente messaggio dovresti farti un’idea della programmazione di Arduino.
Saluti
Adriano
Ciao Adriano,
scusa, non mi ero accorto del tuo commento, non mi era comparso al momento in cui ho risposto a Cristian! Grazie anche a te, ho visto i link, appena ho un po’ di tempo li leggo con attenzione! è un po’ che immagino di costruirmi la mia CNC ma per ora le conoscenze che ho sono piuttosto limitate! Magari, chissà, in futuro… 🙂
Grazie a entrambi!
Anto
Esattamente Antonello!
Il programma trasforma il modello 3D che hai creato in un percorso che sa leggere Arduino, per questo tu dovrai impostare i vari parametri nel programma di g-code relativi alla tua macchina. In questo modo il programma saprà cosa ha “in mano” (quanti motori ha, quali sono relativi ad un asse e quali ad un altro ecc ecc) e riuscirà ad inviare quanto più preciso possibile il percorso ad Arduino, che pilota diversi motori con gli step, direzione e blocco che hai inserito tu. 🙂
I link di Adriano sono anche molto interessanti e ti consiglio consultare anche quelli 😉
Ora ti invio lo sketch per due assi così ti fai un’idea 😉
Di nulla e buona domenica anche a te!
Cristian
Grazie Cristian,
il link è arrivato e l’ho letto, meno male che hai inserito le spiegazioni sotto perché altrimenti avrei fatto parecchia fatica! 😀
Comunque è meno complicato di quello che credessi (in teoria… la pratica è sempre un’altra cosa!! :D) Praticamente, mentre nel tuo schema Arduino esegue gli ordini che tu gli dai tramite la tastiera, in una CNC la tastiera sarebbe sostituita dal software che elabora il percorso! Era questo che non capivo, come facesse ad eseguire istruzioni in un linguaggio che non comprende: saltavo il passaggio del collegamento tra Arduino e il programma g-code! 😀
Buona serata!
Di nulla Antonello! 😉
Sì è leggermente più complesso perché giustamente pilota due motori in quel caso, ma alla fine i comandi sono sempre quelli 😉
Nello sketch vengono pilotati da tastiera, come se stessi giocando ad un gioco in pratica 😀
Nella CNC non c’è la tastiera, oddio ho visto alcuni modelli che montano uno schermino sulla macchina dal quale puoi comandarla 😉 Ma di solito è fatto tutto automaticamente via software, serve per forza perché appunto Arduino non riesce a gestire direttamente g-code e quindi ha bisogno di un programmino che tracci il percorso; la stessa cosa accade nelle stampanti 3D 😉 Spero di riuscire, ma l’anno prossimo ho in progetto con qualche amico ing. elettronico di modificare una Reprap implementandogli uno schermino molto user-friendly da cui ognuno può comandare la stampante senza fare tutti i passaggi di conversione al PC 😀
Un po’ come una CNC alla fine 🙂
Felice di esserti stato d’aiuto, buona serata anche a te! 🙂
Devo testare la board con i motori che ho preso su ebay, sul datasheet della scheda c’è espressamente scritto che è meglio non alimentare lo stepper dalla Gailelo, che significa che per fare il test devo trovarmi in laboratorio, ma se mi trovo in laboratorio il capo mi fa lavorare a dell’altro eheheh, forse nelle festività trovo il tempo, e si potrei proprio provare il tuo sketch. Il test mi serve per capire le possibili velocità di movimento e quanto riesco ad essere morbido nel caso in cui volessi impiegare questi motori anche per il puntamento della camera e perchè no anche nell’aventuale gimbal motorizzato, se non ho capito male per la direzione basta invertire la sequenza di accensione, mentre per la velocità basta variare il delay, domanda, nell’esempio è di 500 msec, qual’è il delay minimo ottenibile? 1 msec?
Appena faccio il test comunque aggiorno il tread sul forum
Guarda con Arduino, so che usare l’alimentazione direttamente da lì non sovraccarica la porta usb e quindi si può usare tranquillamente (anche se lo sconsiglia pure sulla pagina dei motori accoppiati al controller). Visto che funzionano a 5V, se ce l’hai, potresti usare un alimentatore ATX di un PC: io uso quello a casa per avere diverse tensioni perché altrimenti è un casino avere diversi piccoli alimentatori. Ora l’ho anche modificato mettendogli un pulsante e degli spinotti a banana per avere le uscite pronte, e mi trovo bene 😉 Così non sei costretto a testare in laboratorio ;D
Per le funzioni sì e no, cioè: per la direzione ok; il delay ha due funzioni: quella di “bloccare” tutto ciò che ha in parentesi per un tot di tempo quindi, variando il tempo, si varia la velocità; oppure stabilire un tempo tra un’azione e l’altra. Per il tempo di solito i programmatori più esperti consigliano di non usare uno stop maggiore di 10ms perché potrebbe influire sul completamento dell’azione, quindi sì il minimo può essere 1ms. La soglia dei 10ms può essere tranquillamente superata (e in questo caso sono addirittura 500) nel momento in cui lo sketch è semplice ed è questo il caso. Ti consiglio comunque di dare uno sguardo anche al thread che ti avevo linkato sul forum riguardo ai motori 28BYJ-48 perché lì spiegavano un po’ come usarli al meglio possibile 😉
Complimenti Cristian, bella guida, utilissima per chi, come me è agli inizi, ancora non ho provato a far girare uno stepper ma intanto ho procurato tutto il necessario, da una vecchia stampante parallela Epson ho recuperato due motori e due driver “dual full bridge PWM” UDN2917 (45V 1,5A).
Dalle informazioni che sono riuscito a reperire sul web pare che, per avere una resa maggiore da questi motori, bisogna moltiplicare X5 la tensione nominale, ora i calcoli alla mano, mi dicono che operando così superiamo di gran lunga la corrente di targa però, a quanto pare, è il driver che si occupa di togliere tensione non appena si raggiunge il valore nominale per poi reinserirla quando diminuisce.
Appena riesco a fare qualche prova posterò i risultati così si potrà aprire un dibattito per imparare insieme.
Ciao
Mario
Grazie mille Mario! 🙂
Anch’io sono alle prime armi e mi sono avvicinato a questo “mondo” proprio perché avevo la necessità di usare questi motori sulla mia stampante 3D.
Oh oh molto interessanti le Epson, non ne avevo mai usata una per procurarmi i motori. Direi che sono più interessanti delle Canon dalle quali ho sempre e solo preso i motori perché i driver non mi piacevano molto e non erano molto utili al mio scopo. Devo procurarmi qualche stampante Epson dal mercatino visto che mi manca qualche motore ancora 😀
Ho letto il suo datasheet e mi pare di aver capito che si occupa lui di dare al motore la corrente giusta (dice 0, 30%, 67% e 100%) quindi penso che funzioni come i caricabatterie moderni che danno la corrente più appropriata che serve alla batteria anche se l’alimentatore non è quello originale.
Fai qualche prova visto che ce l’hai sotto mano perché interessa anche a me 😉
Ciao
Cristian
Grazie mille è stato molto utile!!
E’ un po’ di giorni che ragiono sul come riposizionare gli stepper in caso di spegnimento improvviso. Se per qualche ragione il sistema che mi controlla i motori perde memoria del loro posizionamento, quando riaccendo come fa a riportare i motori al punto zero? Quali soluzioni esistono già in materia? Tu come intendi comportarti con la stampante, l’eventualità di un blackout esiste.
Non conoscendo cosa sia in uso in questi casi ho immaginato due soluzioni, la prima e più logica è quella dell’impiego di una sensoristica a duopo, ma richiede ulteriore lavoro di ricerca della componentistica e progettazione collegata ad essa, la cosa più immediata che mi verrebbe in mente, non prendetemi per i fondelli, è collegare meccanicamente un trimmer multigiro all’albero del motore….. lo so sembra una boiata, ma i miei motori non dovranno fare molti giri… ok ok è una boiata, ma voi cosa proponete?
La senconda soluzione invece, proprio nell’intento di ridurre al massimo lo sbattimento e le mie idee insane, è di utilizzare un reigistro di memoria tipo flash, che immagazzini costantemente l’ultima posizione del motore. Chiaramente da implementare via software, perchè se leggessi i segnali in arrivo al motore non ci capirei un granchè. Magari nello sketch ad ogni comando sul motore imposto anche la comunicazione di un numero da memorizzare nel registro in questione, incrementabile e decrementabile per ogni movimento. Ad ogni accensione poi andrei a rileggermi il numero per capire come sono posizionati i motori.
Oddio non ci avevo mai pensato! 😀 Guarda, non so se esistono degli accorgimenti particolari per le stampanti e non mi pare di averne mai letti nelle documentazioni varie. Comunque sia, ora che mi ci hai fatto pensate, io opterei o per la seconda soluzione, cioè usare una memoria flash o una EEPROM, oppure usare una batteria tampone che possa entrare in funzione per il periodo di blackout facendo in modo che il sistema continui a funzionare.
Forse tra le due, la EEPROM (o la memoria flash) è la soluzione migliore perché occupa meno spazio ed è perfetta per memorizzare dati appena viene a mancare l’alimentazione.
Ciao
Non se il sistema funzioni, intendo quello di memorizzare la posizione attuale, perché il motore non più pilotato potrebbe muoversi per cui non trovarsi più nella posizione in cui era al momento del blocco.
Per questo mi riferisco anche al mondo delle macchine a controllo numerico di tipo industriale.
La macchina all’accensione e in caso di arresti di emergenza, ha bisogno, per ogni asse di tornare a un punto di riferimento (di solito un micro meccanico o magnetico) su cui azzerarsi e impostare tutti i successivi movimenti, tali punti sono creati nel punto di fine corsa secondo le regole degli assi cartesiani e devono essere raggiunti con l’apposito comando, ogni macchina ha un’apposita funzione di ritorno automatico all’origine. Le coordinate macchina sono coordinate assolute, non sono azzerabili o modificabili in altro modo dal programma, questo permette di sapere sempre dove si trova fisicamente l’utensile rispetto ai limiti fisici impostati.
E’da quel punto sono riportati alla posizione di lavoro eseguendo il numero di passi necessari.
Ma questo presupponendo appunto l’azzeramento.
Un saluto, e Buon Anno
Adriano
mm…. mi pare di essere finito nell’ennesimo corridoio di ceffoni eheheh. Dunque, Adrirobot… mi sa che c’hai ragione, se salta la corrente e i motori vengono spostati il sistema a registro di memoria flash non ci capisce più una fava. Guardiamo i casi.
Nel caso di Cristian forse è sufficiente l’utilizzo di un paio di micro di fondo corsa, in fase di accesione fai fare al software un controllo dei micro sui 3 assi, se i micro di fondo corsa sono attivi sei apposto, se no attivi un movimento di ritorno finchè non si attiva il micro. L’unica obiezione che mi viene è se esistano dei micro sufficientemente sensibili da garantire la precisione che serve ad una stamapante, adrirobot che dici?
Nel mio caso però la posizione ‘0’ non è a fondo corsa ma precisamente a metà e come asso di briscola ci mettiamo pure che non esiste un fondo corsa meccanico, possono girare liberi. Gli stepper che ho in dotazione hanno una coppia mostruosa da spenti sono inamovibili…. potrei provare con una pinza ma non vorrei romperli, sono geared. La cosa mi lascia speranza di utilizzare il solo registro flash, che dite? Altrimenti sarei costretto a inventarmi un sensore, ogni proposta è benvenuta.
Ciao a tutti
Se osserviamo bene il funzionamento di una normale stampante sia inkjet che laser, al momento dell’accensione i motori fanno un giro completo, cioè arrivano fino al sensore di fine corsa che, in questo caso servirà per settare la posizione dei motori che poi andranno a posizionarsi nel “punto di attesa comandi”.
Nel caso di Luca che ha la posizione di “0” al centro, la vedo critica perchè non trovo altre soluzioni valide senza i sensori di fine corsa, quindi mi sa che sarà costretto ad implementarli se vuole un corretto controllo dell’apparecchiatura. La spiegazione di Adriano è per me impeccabile e rende benissimo l’idea.
Ciao
Mario
Ciao Cristian
si! come ho scritto prima, appena riesco a fare qualche prova la condividerò senz’altro, la mia meta è modificare la mia fresatrice per metalli autocostruita per trasformarla in stampante 3D ma sarà una modifica che non farò tanto presto per svariati motivi che non mi metto ad elencare, intanto mi interessa imparare a pilotare al meglio questi motori. A tal proposito, mi è venuto un dubbio e non vorrei averti dato un’informazione incompleta, ho sempre comprato accessori Epson per il mio PC e adesso non ricordo più se i componenti su indicati siano stati presi da una stampante o da uno scanner, in pratica ho recuperato parecchia roba da 5 o 6 stampanti e da 3 o 4 scanner, tutti Epson e, l’ultimo ancora non l’ho smontato perchè ha la possibilità di scannerizzare pellicole fotografiche (sia negativi che diapositive) il suo unico problema è che si tratta di uno SCSI quindi difficilmente utilizzabile con i nuovi PC.
Ti faccio sapere appena ho novità 🙂
Ciao
Mario
Ciao Luca
Non credo che ci siano problemi sui sensori di fine corsa, poiché il problema non è tanto la precisione ma la ripetibilità.
Come potrai vedere per esempio nella stampante 3Drag, i sensori di fine corsa sono dei semplici micro a lamella.
http://it.emcelettronica.com/3d-printing-lelettronica-ed-firmware
Mentre nelle stampanti standard i sensori sono di solito del tipo infrarosso a forcella.
http://www.adrirobot.it/sensori/sensore_a_forcella/sensore_a_forcella.htm
Per quanto riguarda la tua problematica dello “0” al centro, bisognerebbe sapere come effettivamente è realizzato meccanicamente il pezzo considerando che la tipologia di sensori è molto estesa e non è detto che si riesca in qualche modo a risolvere eventualmente compiendo la lettura in modo differito.
Un saluto
Adriano
salve, sto cercando di gestire un elevato numero di motori passo unipolari e/o bipolari.
1° domanda il driver UNL2803 ha otto 8 trasnsistor Darlington; in teoria posso collegare due motori passo passo. Come faccio a capire se il driver regge due motori ?
2. sto utilizziando I/Oexpander per aumentare il numero di motori passo passo da collegare. Con questo integrato utilizzando semplicemente due pin (I2C) dell’arduino posso collegare fino a 8 PCF8574 ognuno con il suo indirizzo, quindi posso controllare in teoria fino a 16 motori passo passo. Al momento (testato e funzionante) con un PCF8574 controllo un unipolare (UNL2003) e un bipolare (L293D).
Ora voglio valutare la soluzione con il 74HC595 un altro I/O expander che dovrebbe funzionare mediante la SPI.
Per mantenere il più alto possibile la velocità di rotazione, oltre a limitare il numero di motori passo passo per arduino, esiste qualche altra soluzione, oppure avete dei suggerimenti in proposito ?
grazie.
Al momento collego i motori passo passo unipolari e/o bipolari ha tentativi.
Come faccio a capire qual’è il collegamento corretto dei motori ? Esiste un modo univoco per capire come collegare i cavi ?
naturalmente escludendo i cavi di alimentazione nel caso dei motori unipolari.
I tentativi li ho fatti io, nulla toglie che ognuno di voi fa lo stesso.
Ciao
Prova a vedere questa pagina del mio sito
http://www.adrirobot.it/elettronica/stepper/stepper_motor_theory.htm
Saluti
Hai visto questa scheda di controllo per quattro stepper?
https://www.sparkfun.com/products/10507
Ciao Giuseppe 🙂
Allora con ULN2803 puoi collegare un solo motore stepper o due motori CC, infatti per ogni stepper va messo un transistor. Se hai bisogno di collegare più motori su un’unica scheda, ti conviene prendere una board come quella indicata da Adriano oppure costruirti (o acquistare) la board delle stampanti 3D, la Sanguinololu (http://reprap.org/wiki/Sanguinololu).
Per i tentativi, riguardo ai collegamenti, guarda sul link di Adriano perché spiega la teoria 😉 In linea generale comunque, basta usare il tester e misurare la resistenza su ogni terminale; costruisci una tabella di riferimento e avrai le fasi 😉
Ciao a tutti,
la mia domanda è molto semplice… a differenza della risposta che penso sarà molto complicata: “…e per comandare 2 motori passo-passo con Arduino Uno”?
Esiste secondo voi il sistema per farlo?
Io ho a disposizione due stepper motor bipolari a 4 fili (ma li posso anche sostituire con altri) e vorrei pilotarli con Arduino Uno in modo che potessero compiere le seguenti azioni:
– entrambe nella stessa direzione, stesso numero di step
– uno opposto all’altro, stesso numero di step
– entrambe indipendenti
…e giusto per complicare un po’ la vita, se ne volessi aggiungere poi un terzo?
Grazie a tutti….
Hai provato a vedere la scheda che ho indicato più sopra in questo post?
http://it.emcelettronica.com/pilotare-motori-passo-passo-con-arduino#comment-35558
Comanda sino a 4 stepper.
Per la possibilità di essere gestito da un Arduino UNO il limite è dato credo dal numero di porte disponibili.
Infatti il driver di ogni motore ha bisogno di 8 linee digitali di comando, per cui per tre motori occorrono 24 linee contro le 20 disponibili, considerando anche quelle Analogiche disponibili.
Infatti la scheda è fatta per essere comandata da un Arduino MEGA.
Saluti
Adriano
Grazie Adriano per il suggerimento.
Avevo letto parte delle risposte sull’argomento e mi chiedevo appunto se anche con Arduino Uno esiste la possibilità di pilotare più di un motore passo-passo. Come si sarà capito dalla domanda, sono un neofita sull’argomento e molte cose per me sono ancora tabu.
Mi sto riavvicinando all’elettronica ed alla programmazione vent’anni dopo aver terminato gli studi 🙂
Saluti
Cristian
Ciao a tutti, ho dato una sbirciata veloce volevo portarvi a conoscenza di questi fatti:
il motore che di targa ha i suoi 5volt in realtà se non lo si pilota con una tensione piu generosa
non da i dati ti targa circa la coppia, infatti se va a cercare la sua curva caratteristica si nota che il dato è solitamente fornito con un tests a 24V e mezzo passo di pilotaggio
sistemi di pilotaggio ad onda intera tramite mosfettini uln e compagnia non portano a nulla
utilizzando drive anche a basso costo vedi TB di toshiba o SK di on scoprirete un altro mondo di questi piccoli oggetti, in piu la possibilità di corrente drive regolabile, frequenza di commutazione regolabile
mezzo passo, 1/8 , 1/16 , frenatura regolabile, poi il soft è piu semplice e si possono inserire rampe di accellerazione, il comando ? un clk e un segno +/- èèè….
Lo schedino col TB6560 (mi pare) si trova gia anche bella fatta a 13 eur… serve solo una sezione di alimnetazione e via !
Ho per le mani un certo numero di integrati L295V di recupero. Secondo voi li posso usare per pilotare degli stepper?
Ciao a tutti sono nuovo,
io utilizzo da qualche anno arduino per uso casalingo per animare presepi e cose per i miei bimbi…
Ho però un’esigenza far partire un motore stepper di una vecchia stampante in maniera dolce, se metto un personaggio del presepio o animo un mulino la coppia mi scolla tutto! 🙂
Esiste il modo di addolcire la partenza? Io sono solo un mago del copia incolla non ho basi di informatica ma vi ringrazio se mi potete indicare un link per questo scopo.
Grazie Marco.
Salve Marco,
hai già cercato nella nostra categoria dedicata ad Arduino? Ecco il link: http://it.emcelettronica.com/category/arduino
Ciao Sara, purtroppo da un po di tempo maco sul sito, ma ho notato che non sono più abilitato a scaricare i pdf della rivista come mai? mi sono abbonato a maggio 2015. A quale indirizzo ti posso contattare per chiederti informazioni?
Buona sera,
si ho cercato nella categoria… Sarà l’orario per il quale posso cercare un pò di info sarà la mia ignoranza, ma nella categoria arduino non ho trovato un’articolo che parli di come far partire un motore stepper con un’ accelerazione dolce.
Grazie comunque di avermi risposto, Marco.
Ciao Marco
Per modificare la velocità di rotazione dello stepper ti sarà sufficiente agire sul valore di SetSpeed.
Questa variabile è presente all’interno della libreria Stepper, presente all’interno dell’IDE https://www.arduino.cc/en/Reference/Stepper
Con la libreria potrai gestire facilmente il tuo stepper
Ciao Cristian,
volevo sapere che motore stepper Nema 17 hai usato: unipolari (5, 6 o 8 fili) o bipolari (4 o 8 fili), con quanti fili o lead ?? Vorrei comprarne uno per provare il tuo progetto.
Grazie
complimenti ottima spiegazione l’unico dubbio da parte mia guardando i collegamenti da Arduino quali sono i pin su cui collegarmi , la scheda mi sembra la UNO ma non ne sono sicuro .
Grazie fabry
complimenti, ottima guida mi è servita molto!
Però avrei una curiosità.
Come faccio a far girare il motorino per un tot di tempo? (ad esempio solo per 3 secondi).
Grazie mille!
Puoi sfruttare il comando delay, ovvero ritardare l’esecuzione dei comandi successivi…
va bene grazie mille