Motori passo-passo, pilotarli con arduino – seconda parte

In questo articolo inizieremo analizzando lo schema di collegamento del nostro circuito.

Consultando il sito ufficiale Arduino possiamo trovare lo schema consigliato.

Riporto lo schema per poterlo commentare senza costringerti a cambiare pagina nel browser di continuo:

unipolar_stepper_four_pinsL’integrato che viene mostrato è composto da un array di Darlinghton (ad esempio ULN2003A visto nell’articolo precedente)

Utilizziamo i pin 1,2,3,4 come canali di input ciascuno dei quali ha effetto sui rispettivi pin 16,15,14,13 il pin 8 sarà collegato a massa (GND) ed il pin 9 al teminale comune del motore ed all’alimentazione dello stesso.

Sull’alimentazione sia dell’ULN2003A sia dei motori possiamo fare una piccola digressione in quanto possiamo alimentare sia i motori che l’integrato con una sorgente esterna, tollerata da entrambi, oppure possiamo utilizzare l’alimentazone prelevata direttamete da Arduino ( 5v ) che a sua volta la preleva dalla porta usb del computer o da una sorgente di alimentazione collegata ad Arduino.

Per comprendere meglio lo schema di collegamento del motore unipolare all’ULN2003A ed ad una fonte di alimentazione esterna puoi osservare l’immagine seguente, sempre dal sito Arduino:

 

Schema di collegamento 1In questa configurazione noterai che la sorgente di alimentazione non è prelevata da Arduino, pur essendoci un collegamento tra i 5v della scheda Arduino e la BreadBoard che stiamo utilizzando per il nostro schema.

L’alimentazione per l’ULN2003A ed il motore è prelevata da una fonte esterna; prima di alimentare il nostro circuito ricordiamoci di consultare il data sheet del costruttore dell’integrato, nel mio caso ST il data sheet riporta la possibilità di alimentarlo con tensioni fino a 30v.

A questo punto il limite sull’alimentazione è dettato dal motore che stiamo utilizzando.

Avendo dei motori in grado di funzionare con una tensione di 5v e 0,44 A ho provato ad alimentare il circuito con la tensione proveniente da Arduino collegata alla sola porta usb del mio computer, il risultato è stato soddisfacente in quanto il computer è riuscito ad alimentare tutto egregiamente senza sovraccarichi per la porta USB.

Lo schema riportato è molto intuitivo:

i pin 8,9,10 e 11 di arduino sono rispettivamente collegati ai pin di input 1,2,3 e 4;

i pin 13,14,15 e 16 dell’ULN2003A sono rispettivamente collegati alle 4 fasi successive individuate nel motore;

il pin 8 dell’ULN2003A è connesso a massa;

il pin 9 è connesso al comune dei motori e all’alimentazione positiva ( + )  in questo caso esterna.

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/motori-passo-passo-pilotarli-con-arduino-%e2%80%93-seconda-parte.html

45 comments

Skip to comment form

  1. Ciao, ho visitato il tuo blog e mi piace molto. Complimenti davvero!!!

    1. Grazie.

  2. Ciao, complimenti davvero per il blog.

    1. Grazie, se sei ineteressato a contribuire scrivimi 🙂

    • Sebb on 4 Giu 2011 at 12:12
    • Reply

    Ciao, anch’io sono interessato ad utilizzare motori con Arduino.. volevo chiederti quanto verrà a costare circa un collegamento come quello visto sopra con motori a 5V quindi senza alimentazione esterna.. all’incirca.. e se qst è l’unico modo x collegare..
    grazie ciao 🙂

    1. Ciao,
      il collegamento mostrato non è l’unico, è quello mostrato nel forum ufficiale Arduino.
      Negli articoli successivi puoi vedere l’assemblaggio del circuito prova, io ho alimentato tutto dai 5v dell’usb x fare i test, non consiglio questa soluzione ottimale per un circuito non di test.
      Il costo dei componenti è di circa una decina di euro se non ricordo male, escluso arcuino, breadboard, cavi di collegamento e i motori.
      Se ti occorrono altre info scrivimi, se hai voglia di condividere con altri i tuoi esperimenti documentali e inviameli

    • Mario Abbruscato on 24 Ott 2011 at 07:21
    • Reply

    Ciao Mauro complimenti per l’articolo è spiegato in maniera davvero semplice. Mi sto avvicinando all’elettronica con Arduino e grazie al tuo tutorial sono riuscito al volo a comandare il motore passo passo preso da una stampante non più utilizzata. Ho usato anche 2 fotoresistenze con le quali riesco a misurare la luce presente nell’una o nell’altra fotoresistenza in modo che se il valore di ritorno di una fotoresistenza è maggiore dell’altra fotoresistenza, faccio ruotare il motore verso destra in caso contrario lo faccio ruotare verso sinistra. In poche parle ho fatto un inseguitore solare che funziona a meraviglia. Il problema è che non ho abbastanza potenza.Cosi ho reperito l’integrato ULN2003AC (ha una c finale) ma pur seguendo le tue indicazioni non riesco a far muovere il motore. Sto usando un motore con 4 fili ognuno dei quali se connesso direttamente ad un’altra uscita digitale di arduino funziona perfettamente. Inserendo tra le uscite digitali e il motore , l’integrato collegato al gnd con il connettore 8 e all’alimentazione 5v di arduino il connettore 9 (nel tuo esempio gnd e com) non ottengo nulla, nessun movimento. ***Come posso testare il funzionamento di questo integrato?*** Sono molto ferrato in programmazione con molti linguaggi, ma in elettronica sono davvero alle prime armi. Ciao.

    1. Ciao Mario,
      grazie per i complimenti, a prima lettura mi sembra di aver capito che il motore in tuo possesso è un bipolare, con l’integrato ULN2003A o AC non puoi pilotare quel tipo di motore, se guardi tra gli esempi presenti sul sito arduino (http://www.arduino.cc/en/Reference/StepperBipolarCircuit) vedrai che loro consigliano un L293D, ponte H, o un SN754410NE io ne ho acquistati alcuni per fare un progetto simile al tuo, ma non ho ancora trovato il tempo di sperimentare.
      Ti invito a seguire anche questa serie di articoli: http://www.mauroalfieri.it/bricolage/fotovoltaico-inseguitore-solare-prima-parte.html e se vorrai pubblicare il risultato dei tuoi esperimenti sarò lieto di dartene la possibilità su questo blog, più siamo e più consigli ci scambiamo e più ci divetiamo, è questo lo spirito del mio blog.

    • Alessandro on 20 Dic 2011 at 08:25
    • Reply

    Ciao Mauro. Ho visto sul tuo sito degli interessanti articoli sui motori stepper. Ti spiego brevemente cosa vorrei realizzare. Praticamente tramite arduino vorrei realizzare un dolly, ovvero un binario per muovere una Reflex ed effettuare Timelapse. Ho capito che il motore giusto è uno stepper. Ho visto inoltre che gli integrati ULN2003 o ULN2083 possono gestire corrente per massimo 500mA. Ho trovato un motore da 1.7A per fase quindi non credo sia possibile gestirlo con il metodo che hai fatto vedere tu giusto? Invece se riuscissi a trovare un motore che eroga 300mA la potenza per far muovere il dolly sarebbe sufficiente? Grazie anticipatamente.

    1. Ciao Alessandro,
      un altro utente mi ha già chiesto info in merito e gli ho dato dei consigli, recupero le indicazioni che ho dato a lui, intanto se vuoi cerca tra i commenti del blog sicuramente troverai le nostre conversazioni.

      Ciao
      Mauro

    • Alessandro on 20 Dic 2011 at 08:27
    • Reply

    Ho visto i commenti, e mi sono schiarito abbastanza le idee. Ho trovato questo motore che dovrebbe fare al caso mio:

    http://www.robot-italy.com/product_info.php?cPath=159&products_id=1449 e dovrei riuscire a comandarlo con ULN2083A che non dovrebbe essere molto diverso dal 2003.
    Ho visto uno che ha fatto un progetto simile utilizzando proprio un mostre Nema 17 senza andare sui 32 e quindi avere più corrente da gestire ed utilizzare driver più costosi come easydriver!
    Spero di riuscire in questo progetto!

    1. Ciao Alesandro,
      l’integrato ULN2003A non è sufficente per le correnti in gioco, devi andare su un ULN2004A che a 5v lavora tipicamente a 0,35A (350mA) con max di 500mA.
      Dell’integrato ULN2083A non ho trovato un Datasheet leggibile, tutti PDF sgranati in cui si leggono male le caratteristiche,verifica se può gestire le corenti in gioco.

      Ciao
      Mauro

    • Angelo Cristallini on 20 Nov 2012 at 07:50
    • Reply

    Ciao Mauro,
    grazie per il tuo tempo, grazie al tuo scritto, mi sto avvicinando ad un mondo a me sconosciuto, che reputo molto affascinante. Cercando ( nella mia profonda ignoranza ) di capire le connessioni dell’immagine “schema di collegamento 1” mi sorge un dubbio:
    – I 5 volt di Arduino non sono connessi a nulla, come mai il cavo rosso e’ inserito nella breadboard ?
    Ti ringrazio per il tempo che vorrai utilizzare per me.
    Buon lavoro
    Ciao
    Angelo

    1. Ciao Angelo,
      hai ragione, non sei per nulla ignorante, la connessione puoi evitarla io di default parto sempre da uno schema in cui i +5v di Arduino e Gnd sono connessi perché nella maggior parte delle volte servono, in questo schema no.

      Mauro

    • leonard on 29 Gen 2013 at 14:37
    • Reply

    ciao complimenti per il sito volevo sapere come si fa a programmare questi motori tramite shild e librerie che nonostante abbia cercato in molte parti non ho capito molto bene il funzionamento … grazie

    1. Ciao Leonard,
      prova a cercare nel blog “passo-passo” troverai tutti gli articoli dedicati ai motori passo-passo e come pilotarli.

      Mauro

    • Roberto on 22 Mar 2013 at 10:46
    • Reply

    Ciao Mauro!
    come posso aggiungere un potenziometro a questo schema? magari utilizzarlo con un pulsante n. aperto, quando premo il pulsante il motore inizia a girare e la velocità la regolo col potenziometro…pensi sia possibile?

    1. Ciao Roberto,
      cerca nel blog ci sono già esempi che fanno questo 🙂

      Mauro

    • arnaldo on 30 Mag 2013 at 16:12
    • Reply

    Ciao Mauro,
    sarà perché sono una capra ma non riesco a far funzionare uno steppe unipolare M42SP-5 con un L293NE….
    Ho individuato le fasi ( almeno credo provando con il multimetro…la resistenza misurata tra le fasi è 100 OHM..
    cosi leggo )ho fatto le connessioni così come da tue istruzioni ma sono due giorni che mi danno senza risultati.
    Alimento Arduino con 9 volt esterni ed utilizzo la Vin per l’ingresso ).
    Ho il dubbio che il problema sia la connessione con l’ L293NE…Io ho adoperato il tuo schema che mi pare utilizza un ULN 2003A…è la stessa cosa?….Credo di dover ancora apprendere molto.
    Puoi farmi una spiegazione facile facile?
    Un grazie di cuore per il tuo aiuto.
    Arnaldo

    1. Ciao Arnaldo,
      mio padre mi ha insegnato che: “nessuno nasce imparato” ovviamente l’errore grammaticale è voluto a sottolineare la veridicità della frase.
      L’impegno e la volontà aiutano tanto e penso tu possa farcela, se usi due integrati differenti dovrai procurarti i datasheet di entrambi, confrontare i pin e i segnali ed adattare i circuiti.
      Solo perché sono simili non vuol dire che funzionino allo stesso modo, anzi quasi mai è così.

      Il mio esempio è con un ULN2003A e non puoi usarlo con un L293NE, dovrai trovare un altro esempio.
      Non so se nel mio armamentario possiedo tale integrato, forse no, in ogni caso ti invito a studiare e provare prima di arrenderti.

      Mauro

    • arnaldo on 30 Mag 2013 at 16:47
    • Reply

    Ciao Mauro,
    ho controllato l’integrato che ho io L293NE ed ha due piedini in meno del ULN2003A …..credo sia ovvio che il mio problema è qui…Come fare quindi i collegamenti con il mio?
    Grazie ancora.
    Arnaldo

    1. Ciao Arnaldo,
      non sono solo il numero di piedini a variare tra i due integrati.
      Ti occorrono i Datasheet di entrambi e un sano confronto per riscrivere lo sketch di controllo.

      Mauro

    • arnaldo on 30 Mag 2013 at 18:49
    • Reply

    Ciao Mauro, grazie….
    Intanto avevo un po smanettato ed in effetti sono riuscito a combinare qualcosa….Adesso con il tuo sketch il motore mi fa due passi avanti e due indietro…Va bene?..
    Mi puoi suggerire qualche altro sketch per vedere se è tutto a posto? per esempio fargli fare un giro completo in avanti ed uno indietro..Il motore è M42SP-5 7.5 Step 50 Ohm..
    Scusami la scocciatura..
    Arnaldo

    1. Ciao Arnaldo,
      bravo, ora puoi seguire altri esempi presenti sul blog, comprendere il codice e come scrivere il codice per i tuoi progetti.

      Mauro

    • Michele on 3 Lug 2013 at 17:49
    • Reply

    Ciao Mauro, complimenti per il blog!
    Sto cercando di far muovere un motore passo passo unipolare a 6 fili con Arduino Uno.
    Ora che ho eseguito le varie misure delle resistenze e quindi ottenuto la tabella come nell’ esempio del tuo articolo “Motori passo-passo unipolari, riconoscerne le fasi – seconda parte “, non riesco a capire come associare i colori dei cavetti del motore con i pin di arduino. Ad esempio, il cavetto blu del motore (che effettuando la misura con il multimetro mi da 40 con il rosso e 20 con il nero), non so se collegarlo al pin 8,9,10 o 11.
    Aspetto un gentile risconstro, Grazie!

    1. Ciao Michele,
      sul blog trovi altri articoli dedicati ai motori passo-passo ed alle fasi, trovi anche come collegarli con un video che spiega tutto.

      Da quello c’è mi scrivi blu e nero formano una fase, probabilmente rosso e nero un’altra.

      Mauro

    • Damiano on 5 Nov 2013 at 19:36
    • Reply

    Salve sig. Mauro Alfieri
    volevo chiedere una piccola delucidazione premetto che me la cavo abbastanza bene con l’elettronica non tantissimo col c++ sfortunatamente.Mi e stato regalato un arduino uno da un amico con il quale vorrei comandare un motore passo passo di un vecchio lettore floppy o quello di una vecchia stampante sulla componentistica non ho alcun problrma il problema sorge sul codice ,il motore mi servirebbe per ruotare una piccola antenna direzionale di un grado per volta partento dal punto 0 fermarsi e ripartire solo ad un mio imput da quanto ho potuto spulciare nei vari post del blog il motore si ferma solo per un tempo definito poi riparte automaticamente cosa che dovrei evitareed in piu compie 360 gradi che a me non servono poiche a 360 gradi dovrebbe tornare a zero .Ora mi chiedo quale parte del codice dovrei implementare o modificare per avere uno step di un grado ?? e come posso aggiungere un ingresso che dica ad arduino di attivare il grado successivo?? potresti davvero per favore illustrarmi qualche guida che possa aiutarmi e se non chiedo tantissimo qualche guida possibilmente in italiano su come funziona la programmazione te ne sarei davvero grato

    1. Ciao Damiano,
      sul mio blog trovi moltissimi articoli dedicati ai motori passo-passo ed in tutti una dettagliata descrizione del funzionamento logico dello sketch.

      Nel tuo caso ti consiglierei di leggere uno di quelli dedicati ai motori passo-passo e pulsanti, tuttavia leggere anche gli altri potrà darti molte informazioni utili.

      I motori passo-passo sono di solito da 200passi per giro da cui deduci che il grado é complesso da realizzare in quanto ogni step é 1,8gradi. Ti consiglio di utilizzare un driver tipo l’easydriver o i pololu per controllare il 1/2 step che ti permette movimenti di 0.9gradi per step.

      Mauro

        • Damiano on 6 Nov 2013 at 13:46
        • Reply

        ti ringrazio grazie mille per le dritte do una spulciata al blog e provo a cavare il ragno dal buco si auspica un impresa difficile ma non impossibile vediamo cosa riesco a fare grazie mille per le delucidazioni 🙂 vedo un po nelle sezioni dedicate

        1. Ottimo Damiano.

          Mauro

    • Renato on 19 Feb 2014 at 19:09
    • Reply

    Sono arrivato solo adesso ad Arduino ed al tuo sito.Favoloso tutto,penso che ci incontreremo spesso.Grazie

    1. Bene Renato, sono contento.

    2. Grazie Renato.

    • Gianni on 28 Mag 2014 at 21:03
    • Reply

    Complimenti per la semplicità e chiarezza nellespozioni degli argomenti..Mi sto avvicinando al mondo di arduino e trovo questi articoli veramente interessanti.
    Grazie

    1. Grazie Gianni,
      ogni suggerimento è ben accetto.

    • Marco on 8 Ago 2014 at 10:46
    • Reply

    Ciao Mauro, ti ringrazio per l’aiuto che mi sta dando questo sito, sono un principiante ti vorrei chiedere se possibile un aiuto su 1 problema, ho una scheda motor shield L293D ed ho copiato il codice da internet per far muovere 2 motori CC ma alla pratica non parte, il codice funziona perché Arduino non mi da nessun errore però vorrei capire se il codice che avrei inserito deve essere costruito a seconda della scheda che utilizzo x far muovere i motori il codice sarebbe questo, da come l’ho trovato era per quello scopo lì, farlo muovere con la motor shield

    1. Ciao Marco,
      leggendo il mio articolo avrai capito che le motor shield non sono tutte uguali anche se il 90% usano lo stesso chip L293D.
      In funzione della tua shield dovrai impostare i pin di direzione e potenza ( PWM ) come descritto nella spiegazione dello sketch.

        • Marco on 11 Ago 2014 at 22:36
        • Reply

        Ciao Mauro, dallo schema unifilare della scheda motor shield L293D sono riuscito a capire quali pin di Arduino usa per pilotare i diversi motori.
        Questa scheda motor shield che posseggo può pilotare 2 servo, 2 stepper e 4 motori DC, questa scheda ha 4 uscite più un collegamento ad un’alimentazione esterna.
        Per fare un esempio ci ho collegato 1 motore passo passo da 5V il 28BYJ-48 unipolare acquistato su eBay sul motore di ricerca google si trova facile le sue caratteristiche,
        ho cambiato il valore dei pin sul codice per farli corrispondere a quelli che usa la motor shield
        il risultato è che sull’uscita dei morsetti la corrente ci arriva non 5V come richiede il motore ma circa 3V, lo scambio delle fasi lo fa il motore è da 5 fili e il comune (rosso) l’ho collegato al +
        questo è il codice che ho provato a fare:

        [codice rimosso in automatico]

        1. Ciao Marco, innanzitutto ti prego di rispettare l’unica semplice regola del blog ” non incollare codice nei commenti” la trovi in tutti gli articoli, in fondo se leggi bene.

          Non conosco la shield che stai usando e non saprei risponderti in merito al voltaggio che rilevi, potrebbe essere dovuto ad un malfunzionamento o al rapido susseguirsi delle fasi via codice che impedisce alla shield di raggiungere i 5v erogati prima di doverli sottrarre.
          Prova con fasi molto distanti ( 1sec o più ) e controlla se raggiungi i 5v

            • Marco on 12 Ago 2014 at 11:07

            scusa,non lo farò più, ma se per qualche motivo per farmi capire devo farti vedere il codice?
            e se posso, poi, avere delle correzioni, in merito?
            Non Voglio che mi capisci male non me l’ho presa a male, chiedo solo se puoi farlo e se vuoi farlo, cioè aiutarmi in questo modo
            Nel caso proverò in un altro modo,
            comunque Grazie x questa spiegazione

          1. Ciao Marco,
            non preoccuparti a molti capita di non leggere fino in fondo i miei articoli.
            Non correggo codice che scrivete perché siete in troppi e non posso rispondere a tutti, per testare i codici che inviate mi occorrerebbe troppo tempo.
            Ho scelto di aiutarVi rispondendo a domande sui codici e gli esperimenti che pubblico io.
            Per le correzioni dei codici c’è il forum arduino in cui tanti appassionati, anche più bravi di me, rispondono tutto il giorno.

    • Michele on 17 Set 2014 at 11:35
    • Reply

    Ciao Mauro,

    prima di tutto grazie per le preziose informazioni che metti a disposizione di tutti, sono molto utili per chi come me sta tentando di avvicinarsi al complicato mondo dell’elettronica (sono un meccanico).
    Volevo capire il principio di funzionamento del ULN2003A. Se non ho capito male dando il 5V su in1 chiudo il circuito tra out1 e GND, è corretto? Ma se così fosse a cosa serve collegare COM all’alimentazione? Il sistema funzionerebbe lo stesso eliminando questo collegamento?

    Grazie

    1. Ciao Michele,
      comprendo le tue difficoltà essendo anche io un autodidatta.
      Tuttavia è complesso spiegare in una risposta ad un commento il funzionamento dell’ULN2003A senza addentrarci nel mondo dei DARLINGTON, è senza dubbio meglio se fai riferimento al datasheet che puoi trovare qui: http://www.ti.com/lit/ds/symlink/uln2003a.pdf

      In merito al COM ( comune ) il concetto è più semplice: si chiama comune perché deve essere “in comune” ad un circuito elettrico; nel caso di motori passo-passo unipolari si fa riferimento a questo collegamento come comune a tutte le fasi del motore.

    • michele on 13 Ott 2014 at 17:52
    • Reply

    ciao mauro,
    scusa la domanda stupida che sto per farti: come mai i pin di arduino devono passare per l’integrato per poter gestire il motore? i cavi dei motori non potrebbero essere gestiti direttamente da arduino senza usare come ponte l’integrato?

    grazie

    1. Ciao Michele,
      purtroppo arduino gestisce carichi esigui sui suoi pin ed ogni richiesta di corrente superiore ai 30-40mA potrebbe causare la rottura di arduino stesso; per questo motivo usiamo dei driver di controllo, senza contare che con driver specifici come l’EasyDriver, ad esempio, puoi usare solo 2 pin per controllare in modo molto semplice i motori passo-passo bipolari

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.