drv8825 stepper driver arduino

In questi giorni ho provato un nuovo driver per motori passo-passo il drv8825 stepper driver prodotto dalla pololu.

drv8825 stepper driver

Il drv8825 stepper driver ha delle interessanti caratteristiche elettriche ed è sufficientemente piccolo per essere impiegato anche nei progetti in cui lo spazio è ridotto.

Caratteristiche del drv8825 stepper driver

Sul sito del produttore pololu puoi trovare molte informazioni su questo drriver per motori stepper o passo-passo bipolari:

drv8825 stepper driver caratteristiche

nella tabella riportata sopra avrai notato che il drv8825 stepper driver può controllare motori stepper fino a 45v e 2,2A per fase con una risoluzione fino a 1/32 di passo semplicemente variando il segnale presente sui pin definiti M0,M1 ed M2 secondo lo schema seguente:

drv8825 stepper motor tabella

Collegamento del drv8825 stepper driver

Il drv8825 stepper driver è dotato di 16 pin a cui collegare:

  • il motore stepper bipolare;
  • il microcontrollore, io uso arduino;
  • l’alimentazione esterna;
  • l’alimentazione del driver stesso;
  • il pin di reset;
  • il pin per attivare la modalità sleep;

per collegare il motore puoi seguire la seguente figura:

drv8825 stepper motor collegamenti

in cui ho fotografato le connessioni delle 2 fasi del motore rispettando i colori dei fili uscenti dal motore.

I pin RESET e SLEEP puoi collegarli direttamente al pin positivo come riportato nello schema di collegamento del produttore oppure puoi controllarli da arduino portanto ad HIGH i pin a cui li colleghi.

Nei collegamenti per questo progetto ho riutilizzato i 5 pulsanti collegati tra loto mediante la rete di resistenze da 330ohm in cascata, tecnica mostrata in questo tutorial:

drv8825 stepper driver pulsanti

ciascun pulsante invia una tensione differente al pin A0 di arduino per effetto della rete di resistenze.

Misurando il singolo valore rilevato puoi dedurre quale pulsante è stato premuto e legare la pressione del pulsante ad una azione dello sketch.

Lo sketch di controllo con 5 pulsanti

Per il controllo del motore passo passo mediante il drv8825 stepper driver ed i cinque pulsanti ho realizzato questo sketch:

#define DIR 2
#define STEP 3
#define BUTTON A0

#define M0 4
#define M1 5
#define M2 6



int SELECT[]  =  {0,20};     // pulsante A
int LEFT[]    =  {500,520};  // pulsante B
int RIGTH[]   =  {670,690};  // pulsante C
int UP[]      =  {760,780};  // pulsante D
int DOWN[]    =  {810,830};  // pulsante E

int dPause    =  100;
int dirLevel  = HIGH;

/**********************************************************/

void setup() {
  pinMode(DIR, OUTPUT);
  pinMode(STEP, OUTPUT);
  pinMode(M0, OUTPUT);
  pinMode(M1, OUTPUT);
  pinMode(M2, OUTPUT);

  pinMode( BUTTON,INPUT );

  Serial.begin( 9600 );
  Serial.println( "Test" );
}

/**********************************************************/

void loop()
{
  int buttonPress = ctrlButton( analogRead( BUTTON ) );

  if ( buttonPress == 1 ) { 
    // 1/2 Step
    dPause = 50;
    digitalWrite(M0, HIGH );
    digitalWrite(M1, LOW  );
    digitalWrite(M2, LOW  );
  }

  if ( buttonPress == 2 ) { 
    // 1/4 Step
    dPause = 25;
    digitalWrite(M0, LOW  );
    digitalWrite(M1, HIGH );
    digitalWrite(M2, LOW  );
  }

  if ( buttonPress == 3 ) { 
    if ( dirLevel == HIGH ) dirLevel = LOW;
    else                    dirLevel = HIGH;
  }

  if ( buttonPress == 4 ) { 
    digitalWrite(M0, LOW  );
    digitalWrite(M1, LOW  );
    digitalWrite(M2, LOW
    );
  }

  if ( buttonPress == 5 ) { return; }
  
  digitalWrite( DIR,dirLevel );
  stepGo();
}

/**********************************************************/

int ctrlButton( int button ) {

  if ( SELECT[0] <= button && button <= SELECT[1] )  { return 1; }
  if ( LEFT[0] <= button && button <= LEFT[1] )      { return 2; }
  if ( RIGTH[0] <= button && button <= RIGTH[1] )    { return 3; }
  if ( UP[0] <= button && button <= UP[1] )          { return 4; }
  if ( DOWN[0] <= button && button <= DOWN[1] )      { return 5; }

  return 0;

}

/**********************************************************/

void stepGo() {
  Serial.println( dPause );
  
  digitalWrite(STEP, HIGH);
  delayMicroseconds(dPause);
  digitalWrite(STEP, LOW);
  delayMicroseconds(dPause);
}

la prima osservazione che puoi fare è che lo sketch presenta pezzi di codice che hai già incontrato in altri sketch e progetti presentati, ma andiamo con ordine, alle linee 01-07 definisci i pin Arduino a cui è collegato il drv8825 stepper driver, il pin 2 al pin di direzioe ( DIR ) ed il pin 3 al pin di step ( STEP ), i pulsanti sono collegati tutti al pin A0 ed i pin 4,5 e 6 sono connessi rispettivamente ai pin M0,M1,M2 con cui puoi controllare la risoluzione del motore.

int SELECT[]  =  {0,20};     // pulsante A
int LEFT[]    =  {500,520};  // pulsante B
int RIGTH[]   =  {670,690};  // pulsante C
int UP[]      =  {760,780};  // pulsante D
int DOWN[]    =  {810,830};  // pulsante E

linee 09-13: sono le stesse viste negli articoli dedicati ai pulsanti collegati come in questo progetto e simili a quelle che hai incontrato per la connessione della KeyPad LCD, che utilizza il medesimo sistema per ridurre al minimo il numero di pin necessari;

void setup() {
  pinMode(DIR, OUTPUT);
  pinMode(STEP, OUTPUT);
  pinMode(M0, OUTPUT);
  pinMode(M1, OUTPUT);
  pinMode(M2, OUTPUT);

  pinMode( BUTTON,INPUT );

  Serial.begin( 9600 );
  Serial.println( "Test" );
}

linee 20-31: definisci la funzione setup() il cui scopo è impostare la modalità di funzionamento per i pin DIR, STEP,M0,M1,M2,BUTTON e attivare il Monitor Seriale;

linea 37: richiama la funzione ctrlButton() il cui scopo è restituire il valore un valore numerico da 0 a 5 in funzione del pulsante premuto, è la funzione che si occupa di eseguire tutte le verifiche necessarie alla pressione di un pulsante. Assegna il valore restituito dalla funzione alla variabile buttonPress;

  if ( buttonPress == 1 ) { 
    // 1/2 Step
    dPause = 50;
    digitalWrite(M0, HIGH );
    digitalWrite(M1, LOW  );
    digitalWrite(M2, LOW  );
  }

linee 39-45: controlli che il valore restituito dalla ctrlButton() sia 1, che indica la pressione del primo pulsante ed imposti a 50 il tempo di pausa tra uno step ed il successivo oltre alla combinazione HIGH,LOW,LOW dei pin M0,M1 ed M2 che secondo lo schema del produttore indicano al DRV8825 stepper driver di lavorare con il 1/2 passo;

  if ( buttonPress == 2 ) { 
    // 1/4 Step
    dPause = 25;
    digitalWrite(M0, LOW  );
    digitalWrite(M1, HIGH );
    digitalWrite(M2, LOW  );
  }

linee 47-53: similmente alle linee 39-45 verifichi la pressione del 2° pulsante e imposti a 25 il tempo di pausa tra gli step e i pin M0,M1 ed M2 in modalità 1/4 di passo.

linee 55-58: alla pressione del 3° pulsante cambi la direzione di rotazione del motore;

linee 60-65: imposta il ciclo di rotazione a paso intero portando a LOW tutti e tre i pin M0,M1 ed M2;

linea 67: la pressione del 5° pulsante invia allo sketch un segnale di return che blocca il loop() e lo fa ripartire, è un trucco per interrompere il moto del motore;

linee 69-70: imposta la direzione di rotazione in funzione della variabile dirLevel impostata alle linee 56-57 e richiama la funzione StepGo() che comunica al drv8825 stepper driver di compiere un passo nella direzione stabilita;

void stepGo() {
  Serial.println( dPause );
  
  digitalWrite(STEP, HIGH);
  delayMicroseconds(dPause);
  digitalWrite(STEP, LOW);
  delayMicroseconds(dPause);
}

linee 89-96: definisci la funzione stepGo() che invia i segnali al driver per far avanzare il motore, per farlo invia un segnale HIGH al pin STEP, attende il tempo impostato nella variabile dPause e riporta a LOW tale pin, attende quindi un altro tempo dPause in Microsecondi.

Il video del drv8825 stepper driver in azione

Ecco un video del funzionamento di questo progetto:

Buon divertimento !!!

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/drv8825-stepper-driver-arduino.html

94 comments

1 ping

Skip to comment form

    • Maurizio on 4 settembre 2013 at 08:45
    • Reply

    Buongiorno Mauro,

    sono agli inizi con Arduino e ho un problema su un progetto che ho effettuato.
    Ho Arduino UNO che gestisce la shiel motori di Arduino con collegato un motore stepper.
    Devo effettuare un numero di step precisi in direzione orario e antiorario alla pressione di due tasti.
    Fin qui tutto bene, il mio sketch funziona perfettamente e anche di controllare lo stato di un micro che deve inibire la rotazione se premuto.
    Devo però proseguire con la mia applicazione ottenendo lo stesso risultato anche quando su un PIN di Arduino ricevo un segnale o LOW o HIGH, in poche parole quando arriva un segnale sul PIN devo fare ruotare orario lo stepper, ad un altro segnale sempre su stesso PIN deve ruotare antiorario.
    Qui mi sono bloccato perchè non riesco a fare funzionare sia i tasti che il segnale LOW/HIGH del PIN.
    Grazie mille anticipatamente per la collaborazione e complimenti per tutto il tuo lavoro.

    1. Ciao Maurizio,
      mi piacerebbe comprendere di che progetto si tratta in quanto descritto come hai fatto ho difficoltà a capire cosa tu voglia ottenere.
      Se non ho interpretato male la tua esigenza vuoi che al cambio di stato di un pin accada qualcosa, ti consiglio di valutare l’uso degli interrupt di arduino su cui trovi un articolo nel Blog.

      Mauro

    • marco on 5 settembre 2013 at 13:57
    • Reply

    Caro Mauro, complimenti per l’aiuto che ci dai.
    Sto provando a connettere un Nema 17 alla scheda Arduino 1 mediante il Pololu DRV8825, esattamente quello che hai presentato tu il 2 settembre. Potresti inviarmi lo schema di dettaglio come hai fatto in passato con la BigEasyDriver? Nel mio caso vorrei solo muovere un motore. Saluti e grazie in anticipo

    1. Ciao Marco,
      lo schema di collegamento lo trovi sul sito del produttore: pololu di cui ho inserito il link nell’articolo.
      Mi è sembrato superfluo duplicare l’immagine o peggio copiarla 🙂

      Mauro

    • marco on 5 settembre 2013 at 17:38
    • Reply

    Perfetto! Sì ho visto dal sito, ma poiché mi è capitato di vedere altre varianti, pensavo avessi utilizzato altro schema. Grazie mille.

    Marco

    • Ugo on 2 novembre 2013 at 10:49
    • Reply

    Buongiorno Mauro,
    ho iniziato da poco a divertirmi con Arduino e ora vorrei realizzare il mio primo progetto, un sistema di puntamento.
    Inizialmente vorrei poter semplicemente orientare un laser utilizzando dei pulsanti.
    Ho quindi la necessità di muovere, magari anche in maniera rapida, il laser o qualsiasi altro oggetto (massimo 5-6 kg) sugli assi x e y.
    Mi trovo davanti due problemi:
    – utilizzare motori stepper come quello dell’articolo o motori dc
    – quale driver abbinare ai motori per controllarli con arduino
    Spero tu mi possa aiutare.
    Grazie
    Ugo

    1. Ciao Ugo,
      il tuo progetto è interessante.
      Per la scelta del driver è necessario che tu definisca prima che tipo di motore intendi utilizzare in quanto non solo varia da motore stepper a motore DC ma sopratutto varia tra differenti motori passo-passo.
      Ti consiglio di leggere i miei articoli dedicati ai motori passo passo per comprendere come funzionano e che caratteristiche possiedono.
      Ho scritto anche un articolo in cui trovi le differenze tra un motore passo-passo, un motore DC ed un servomotore che ti consiglio di leggere.

      Nel tuo caso potrebbero andar bene tutti e tre i tipi la differenza la farà il livello di precisione che vuoi raggiungere e la meccanica che utilizzi per spostare il puntatore.

      Mauro

  1. Ciao Mauro, innanzitutto Buon Anno,
    Sto realizzando un braccio robotico (un po bizzarro) per il mio Rover.
    Ho scelto per lo spostamento Destra Sinistra un motore Passo Passo che avevo un Bipolare un 23LM-C355V, come controller ho usato un DRV8825 Stepper Motor Driver Carrier, High Current, ne ho già bruciato uno e prima di continuare la mia domanda è questa :
    Come alimentazione per il motore ho usato quella del rover cioè 12 volt 35 Ampere, mentre come alimentazione logica ho presa quella da Arduino cioe’ 5V.
    Ho caricato lo sketch preso da internet come esempio prima di creare uno adeguato, ma era solo per vedere se girava, ma aimè ha solo fatto alcune vibrazioni e poi più niente, ho notato che il chip del Driver scottava ed ho staccato tutto.
    Dalla tua esperienza sai dove ho sbagliato ? Forse non dovevo alimentarlo con una batteria da 35 A ? o dovevo pilotare il motore con una tensione molto piu’ bassa ?

    Scusami se per te è banale questa mia perplessità su questi motori, ma è la prima volta che affronto un problema del genere.

    Grazie per il tuo aiuto !!!

    1. Ciao Ciro,
      la domanda non é affatto banale, io stesso posso solo ipotizzare delle cause:

      1. assorbimento del motore, controlla che il motore abbia bisogno di una corrente (A) inferiore a quella massima erogabile dal DRV8825 che mi sembra sia di 2A

      2. fasi invertite: controlla di aver collegato correttamente le fasi del motore, puoi leggere i miei articoli su come riconoscere le fasi di un motore bipolare, se due fasi successive si oppongono alla rotazione potresti avere un assorbimento eccessivo da parte del motore

      3. passi troppo ravvicinati: ogni motore passo passo ha bisogno di un tempo minimo per compiere uno step, di solito io uso il delay, se hai ridotto o annullato il tempo di attesa tra una fase e la successiva potresti aver causato eccessivo assorbimento del motore

      4. riduzione dei passi: il driver DRV8825, se non ricorso male, può eseguire 1/2,1/4,1/8,1/16 di passo, controlla di non aver impostato una riduzione non attuabile che manda in crisi il driver quando tenta di spostare l’albero motore.

      Mauro

      1. Grazie della tua risposta, ho letto il tuo tutorial su come trovare le fasi, anche se i colori nei cavetti sono diversi ma essendo un motore di recupero i cavetti già erano saldati in un connettore e controllando i terminali con il tester come hai fatto tu stavano anche messi in sequenza giusta cioè due a due ROSSO GIALLO – BLU ARANCIO, ho provato anche con un alimentatore 5 volt ed ho visto che il motore ad ogni impulso faceva uno scatto in avanti e dopo la sequenza ne faceva uno indietro, questo mi fa capire che almeno le connessioni erano fatte bene.
        domani faccio un ulteriore prova controllando le connessi dei contatti sul driver.
        Mauro una domanda, ma devo solo utilizzare i contatti DIR e STEP per il movimento, B1 / B2 – A1 / A2 per i contatti del motore, VMOT e GND tensione motore e per la logica?? io ho utilizzato lo schemino che porta la 5v di arduino su RESET e SLEEP del DRV8825 (non è che questo lo ha fatto saltare ?
        Mi puoi indicare per il tuo Sketch‎ che connessioni hai usato ?
        PS: Da premettere che io non userò bottoni per l’azionamento, mi basterà farlo girare fino a quando non lo decido da programma quando arrestarlo.

        Grazie ancora.

        1. Ciao Ciro,
          non mi è chiara la frase: “il motore ad ogni impulso faceva uno scatto in avanti e dopo la sequenza ne faceva uno indietro” lo scatto indietro non è corretto a mano che tu non abbia sbagliato la sequenza.
          Per il RESET e SLEEP è uno degli schemi di collegamento suggeriti dal produttore ed anche io li ho utilizzati senza problemi, la fusione del driver è imputabile ad un eccessivo assorbimento delle fasi a mio avviso.

          Nel mio scketch ho utilizzato proprio il collegamento che hai visto in foto e suggerito dalla Pololu, vedi sopra, ho aggiunto i controlli M1,M2 ed M3 per impostare le riduzioni di fase secondo la tabella riportata dal sito della pololu.

          Mauro

            • Ciro on 6 gennaio 2014 at 13:30

            I dati dello Stepper sono :
            Step Angle 1.8 , Rated Voltage 2,50, Rated Current 2.00 A
            Credo che questi dati siano compatibili con questo Driver.
            L’unia cosa Mauro, ma i terminali A1 A2 e B1 B2 li decidiamo noi al momento che troviamo
            la coppia o è una sequenza stabilita dal fornitore, ti dico questo perchè il fornitore indica i colori delle due bobine
            ma non i 2 terminali.
            Se i dati che ti ho fornito anche per te vanno bene , mi resta solo pensare che forse (non ne sono sicuro) avrò invertito 1 delle due fasi, rivedrò la tua clip, perchè non riesco a vedere la sequenza che usi.
            Grazie

          1. Ciao Ciro,
            i dati sono buoni, il driver drv8825 regge carichi superiori ai limiti che mi hai fornito.
            La sequenza delle fasi puoi ricavarla con un altro mio tutorial che mostra un video su come farlo.
            Prova a leggere anche gli altri tutorial sui motori passo-passo che ho scritto, verifica che tutto sia corretto sul tuo motore.

            Se il costruttore non ti indica la fase A e la fase B puoi solo provare empiricamente a ricavartele tu.

            Mauro

  2. Ciao Mauro, solo una Info, ho letto qualche tuo Thread dove si parlava di motori Stepper, ho visto che per i tuoi motori usi le coppie di colori Giallo-Blu’ / Verde-Rosso.
    Io ho acquistato un motore questo http://www.robot-italy.com/it/stepper-motor-unipolar-bipolar-200-steps-rev-57-56mm-3-6v-2-a-phase.html
    ma non mi trovo con i colori che usi tu. Secondo lo schema fornito dal fornitore, mi confermi che devo usare i colori Nero-Verde 1° Bobina e Rosso-Blu’ 2° Bobina??
    NB: Userò questo stepper come Bipolare.

    Grazie ancora.

    1. Ciao Ciro,
      ti consiglio di leggere i miei post su come riconoscere le fasi per capire come collegare il tuo motore.
      Non avendolo mai visto rischio di darti un errato suggerimento.

      Mauro

    • Aynur on 4 maggio 2014 at 15:16
    • Reply

    Dear Mauro, what models of the engine and power supply did you used?

    1. Hi Aynur,
      I use one LiPo battery 11,1v as power supply.

    • marco on 6 maggio 2014 at 20:09
    • Reply

    Ciao Mauro mi potresti togliere un dubbio che mi perseguita da un pò?
    Volevo acquistare questo driver, essendo abbastanza potente. Ma leggendo i vari datasheet dei motori mi accorgo che vengono alimentati a 12V (per esempio questo http://www.robot-italy.com/it/nema-17-stepper-motor-with-cable.html) oppure 2,4V come questo(http://www.robot-italy.com/it/42byghw811-nema-17-bipolar-48mm-stepper.html). Il rated voltage è la tensione che devo applicare alla scheda per far funzionare il motore?
    Vedo che questa scheda funziona DA 8,2V in su.
    O il rated volt indicato nei datasheet dei motori non è importante?
    Grazie in anticipo per le risposte

    1. Ciao Marco,
      in nessuna parte dell’articolo mi riferisco al “related voltage” e non ho trovato questa dicitura neppure sul datasheet del produttore.
      L’alimentazione del motore che questo driver accetta va da 8.25v a 45v applicata al VMOT

        • marco on 7 maggio 2014 at 19:20
        • Reply

        grazie Mauro,
        infatti il mio problema era capire se potevo utilizzare questo driver nonostante su alcuni datasheet riportano la rated voltage di 2,5V, ma a quanto pare la risposta è negativa
        Grazie ancora

        1. Si Marco, la risposta é negativa. Prova con la BigEasy Driver a memoria non ricordo il voltaggio minimo.

    • Luca on 7 settembre 2014 at 10:34
    • Reply

    Ciao Mauro,
    anche io, come Ciro, ho problemi di surriscaldamento.
    Dopo pochi secondi il driver scotta, dopo una ventina di secondi il motore non gira più e dopo un minuto circa riprende a funzionare.
    Suppongo quindi, non essendo previsto nel tuo sketch un tale ritardo, sia a causa di una protezione del circuito.
    Il motore é un Wantai NEMA 17 42BYGHW811 e il driver DRV8825 é in grado di erogare gli ampere richiesti.
    Ho letto il tuo articolo sulle fasi, le ho individuate e corrispondono agli schemi della pololu e della wantai.
    Dopo aver letto la risposta che hai dato a Ciro, ho aumentato nello sketch il delay tra le fasi ed evito di ridurre i passi.

    Ho controllato mille volte i collegamenti ed anche provato ad inserire un condensatore da 100 tra VMOT e GND, come suggerito dalla pololu qui:
    http://www.pololu.com/product/2133

    Cosa può essere?

    L’ alimentatore che uso é recuperato da un vecchio pc e non sono noti gli ampere, potrebbe essere la causa?
    Grazie mille
    Luca

    1. Ciao Luca,
      da datasheet il motore riporta 2,5A per fase e il drv8825 2,2A ( With sufficient additional cooling. ) penso sia in questa differenza che tu debba cercare il problema.
      Inoltre se il motore è collegato meccanicamente ad un sistema di trazione o meccanico in genere controlla che tale sistema non opponga elevata resistenza.

        • Luca on 8 settembre 2014 at 18:47
        • Reply

        Grazie mille Mauro,
        ho controllato anche io é vero!!!!
        ho acquistato entrambe su reprapworld ma prima ho chiesto se il driver fosse ok con i motori.
        la risposta: “DRV8825 is great. High current and acceptable heat production.”
        Strano pensavo fossero affidabili.
        Spero di poterglieli restituire, comunque dovrei acquistarne altri, ma quali?
        Se li usassi comunque brucerei tutto?

    • Rodolfo on 23 ottobre 2014 at 12:02
    • Reply

    Ciao Mauro,

    sono alle primissime armi con Arduino e l’elettronica in generale…ho avuto in prestito dei componenti per sperimentare e fare studi.
    Ora sto usando il driver DRV8825 con questo motore: https://www.sparkfun.com/datasheets/Robotics/SM-42BYG011-25.pdf alimentato con un trasformatore universale (di quelli con la rotellina per selezionare i V) da 1A settato su 12v.
    Vorrei sapere se e come posso farlo andare più veloce, e fargli cambiare direzione e velocità a piacere tramite script.
    Devo cambiare motore o c’è modo di farlo andare più veloce? Come posso capire la velocità massima raggiungibile dal motore che sto usando? Se non è indicato il motore che sto utilizzando potresti linkarmi un motore che mi permetta di far muovere un pannello di legno/forex di circa 300/400gr velocemente?
    Grazie in anticipo per il supporto e complimenti per gli articoli!
    Saluti
    Rodolfo

    1. Ciao Rodolfo,
      per variare la velocità del motore devi agire sul delay tra le fasi riducendolo o aumentandolo.
      Per la direzione esiste il pin apposito che trovi descritto nell’articolo e nello sketch.

    • Alejandro on 24 ottobre 2014 at 00:27
    • Reply

    Mauro
    tendrías el esquema eléctrico del circuito que publicaste aquí?

    1. Ola Alejandro,
      El esquema para conectar el drv8825 es publicado el fabricante.
      Los botones están conectados en serie con las resistencias a 330ohm

    • Roberto on 2 novembre 2014 at 18:02
    • Reply

    Ciao Mauro, Io ho un Sanguinololu V1.3a con assemblati i driver: “CoolDRV8825 Stepsticks”
    Posso pilotare motori nema 23 o nema 24 o nema 34 senza avere problemi????
    Grazie mille!!

    Roberto

    1. Ciao Roberto,
      dipende dall’assorbimento dei motori.
      NEMA23, NEMA24 e NEMA34 indica solo uno standard meccanico, della stessa famiglia di motori trovi tensioni e correnti differenti.
      Devi valutare le caratteristiche dei motori che scegli con quelle supportate dal datasheet del drv8825

  3. Ciao Mauro e complimenti per il tuo sito. Ieri sera ho provato il tuo sketch con un DRV8825 ed un NEMA17 12V 200 passi ma non ho avuto il tempo di approfondire il testing perche’ vorrei modificare lo sketch per provare le altre modalita’ di microstepping fornite dal driver, lo faro’ stasera. Una premessa. Ho da poco realizzato una scheda GoTo per telescopi basata sul progetto open chiamato PicGoto (gruppo spagnolo, il sito ) con una coppia di questi NEMA17 pilotati appunto dagli 8825. I motori pero’ hanno un comportamento strano, quando vengono utilizzati a microsteps superiori ad 1/4, ‘saltellano’. Nel senso che, prima di completare ogni ciclo completo di alimentazione delle fasi, sembra ‘stallare’ per un attimo, per poi riprendere ma con uno step piu’ ampio per recuperare la rotazione. Una sorta di singhiozzo … Non sapendo come viene effettivamente pilotato lo stepper via software dai PIC mi sono detto, proviamo su breadboard il comportamento con il nostro amato Arduino, ed eccomi qui. Mi sembra che pilotati con il tuo sketch questo comportamento ‘a singhiozzo’ non accada. E’ quindi una questione software o, come ho letto da qualche parte dipende dalle caratteristiche intrinseche del motore e/o driver? Avrei poi un paio di domande sul tuo sketch ma le rimando ad altro post, mi sembra di essermi dilungato gia’ troppo …
    Grazie ancora per la tua disponibilita’.

    1. Ciao Gigi,
      se con arduino il comportamento a singhiozzo non avviene escluderei il problema meccanico e mi dirigerei verso quello sw o elettrico ( collegamenti )

  4. Ora i dubbi sullo sketch. Hai definito dPause all’inizio uguale a 100us, quindi dPause conserva questo valore fino a quando non si preme uno dei pulsanti 1 o 2 (1/2 e 1/4 steps) che lo ridefiniscono a 50 e 25us rispettivamente. Questo e’ per mantenere la velocita’ del motore costante? In secondo luogo, perche’ nella condizione buttonPress=4 (Full steps) non si ridefinisce dPause=100?
    Perdona per il mio post precedente che e’ un po’ ‘out of topic’ …
    Ciao

    1. Ciao Gigi,
      hai ragione ho dimenticato di ridefinirlo, non ricordo il perché al tempo in cui ho scritto questo articolo non mi sono accorto della dimenticanza.

      1. Grazie per le risposte speedy, Mauro.
        La velocita’ dei motori si regola variando il dPause, giusto?

        1. Si Gigi,
          se vuoi approfondire il perché e come gestirla ti consiglio di leggere anche gli altri articoli che ho dedicato ai motori passo-passo.
          Scoprirai i limiti e le potenzialità di questi motori.

    • Roberto on 3 gennaio 2015 at 21:22
    • Reply

    Ciao.
    Mi sto arrovellando il cervello da un giorno perché non capisco come devo alimentare i driver per avere una giusta tensione di alimentazione sul motore. Devo alimentare questo motore che va a 12V.

    (http://www…..com/item/5x-DC-12V-4-phase-5-wire-gear-stepper-motor-full-metal-Gear-reduction-step-motor/1591883814.html)

    Se uso gli easy driver devo alimentarli ad una tensione ben superiore ai 12V , perché l’easy si “mangia” una parte di alimentazione. Ora ho acquistato dei driver come quelli della pololu con il A4988.

    http://www……..com/item/4PCS-LOT-Pololu-StepStick-A4988-stepper-motor-driver-Heatsink-for-3D-Printer-Reprap-RAMPS1-4-Sanguinololu/1801708257.html

    La mia domanda è la seguente: anche i driver che ho comprato si “mangeranno” della tensione?
    oppure se li alimento con 12V i motori verranno alimentati a 12V?

    Un ultima cosa: i motori che ho comprato hanno 5 fili con uno in comune agli avvolgimenti.
    Posso utilizzare questo motore come un semplice bipolare non utilizzando il filo on comune?

    Ti ringrazio anticipatamente per l’attenzione.

    1. Ciao Roberto,
      ti chiedo la cortesia di non incollare link nei commenti quando ti riferisci a siti che non vendono materiale originale o certificato dal produttore, mi spiacerebbe far pubblicità su google a tali venditori.
      Per quanto riguarda l’uso dei driver che hai acquistato devi provarli in quanto non solo non sono quelli da me descritti e provati in questo articolo, forse ho recensito i driver originali pololu A4988, ma sopratutto non essendo essi orginali il comportamento potrebbe rivelarsi completamente differente da quello dei driver da me testati.

      In merito all’uso di un motore unipolare come bipolare la risposta è si puoi usarlo escludendo il comune, trovi numerosi articoli dedicati ai motori stepper sul blog in cui descrivo come sono fatti e come funzionano.

    • Giovanni on 25 maggio 2015 at 15:19
    • Reply

    Ciao Mauro
    Sono dilettante in elettronica (scuola radio elettra), con i capelli bianchi e tante idee per passare bene il mio tempo libero ovviamente con i miei limiti.
    Da poco tempo (meno di un anno) mi sono avvicinato ad arduino ed è subito diventato un robusto interesse, anche perché si capisce che è un mondo che permette, con pazienza, di ottenere risultati.
    Mi è parso utile presentarmi per far capire la mia preparazione… scarsa… con una robusta volontà.
    Vorrei essere più preciso per la ragione del mio dire sono un camperista ed attualmente per vedere la TV utilizzo un kit della LIDL che devo dire funziona benissimo considerato anche il costo molto basso.
    Attualmente il suo sistema di puntamento è affidato alle mie mani e un po’ della mia pazienza. Devo dire che dopo un certo numero di tentativi riesco ad ottenere dei risultati soddisfacenti.
    Purtroppo i limiti sono facilmente intuibili, la scomodità di orientare e poter vedere il risultato sulla TV mentre si cerca il satellite.
    La mia idea sarebbe quella di far muovere l’antenna parabolica satellitare rinviando in cabina i comandi per il movimento senza dover soffrire troppo.
    La mia intenzione e di utilizzare un sistema che utilizzi due arduino Nano, date le sue ridotte dimensioni, e due drv 8825 per comandare i due motori passo passo e per fare muovere i motori e utilizzare dei potenziometri (encoder).
    Per visualizzare i movimenti vorrei usare un visore a cristalli liquidi che lavori in I2c.
    Io ho già iniziato a mettere insieme i pezzi che mi sono procurato su ebay a prezzi contenuti.
    In sostanza ho realizzato due circuiti con i millefori, che dovrebbero comunicare tra di loro via onde radio.
    Uno con arduino nano, il visore a cristalli liquidi e i due encoder per i movimenti, da mettere in cabina.
    Uno con arduino, i due drv 8825 e un dispositivo di orientamento tipo GY80 che vorrei allontanarlo dal contenitore per non soffrire del magnetismo dei passo passo e posizionarlo a bordo della parabola dell’antenna e tramite il nano trasmettere i dati da visualizzare sul display dell’altro nano.
    Per la comunicazione tra i due circuiti ho pensato a due circuiti a a 2,4 Ghz anch’essi comperati su ebay
    Credo che l’impegno per me si tantissimo forse molto ambizioso ma io vorrei provarci.
    Ho pazienza e spero anche il tempo.
    Ovviamente per me le difficoltà maggiori sono nella programmazione dei due nano in modo che possano parlarsi e ricevere tra di loro e comandare i vari dispositivi.
    Ho cominciato a raccogliere alcuni programmi su internet e cerco di metterli insieme.
    Purtroppo le difficoltà sono tantissime cerco di non arrendermi.
    Puoi dirmi se è possibile, puoi darmi dei consigli, puoi aiutarmi?
    se del caso ti allego delle immagini sul fin qui eseguito.

    Grazie

    Giovanni

    1. Ciao Giovanni,
      il tuo progetto è ambizioso ma con buona volontà penso realizzabile.
      Hai tanto da studiare, ne avrei anche io, ma sopratutto il dubbio maggiore che ho è la possibilità di controllare due encoder con arduino.
      Da quanto ne so io ogni encoder ha bisogno di 2 interrupt per essere controllato ed arduino uno, nano, micro ha a disposizione una sola coppia di pin per l’interrupt.

        • Giovanni on 27 maggio 2015 at 10:03
        • Reply

        Ciao Mauro
        Grazie per la tua disponibilità e cortesia.
        Per la mia scelta degli arduino nano sono state le dimensioni ridotte ed una forte similitudine con l’arduino uno che avevo inizialmente visto ed acquistato su ebay.
        La mia scarsissima conoscenza degli arduino e degli encoder non mi ha permesso di fare delle scelte migliori.
        Diciamo che ho una buona manualità nell’eseguire le cose, circuiti, saldature ecc… e data la mia origine pochissimo la programmazione.
        Ho anche una buona manualità per quanto concerne la meccanica che in parte ho già disegnato e che credo di riuscire a realizzare.
        Spero con pazienza e qualche aiuto di riuscire nel mio intento, ho una robusta volontà e se non dovessi riuscire nell’intento pazienza ho passato parte del mio tempo libero facendo delle cose che mi piacciono ed affascinano.
        Naturalmente sono disponibile a rivedere la mie scelte iniziali nell’ipotesi che siano irrealizzabili.
        Ovviamente sarà mia premura comunicare i progressi che riuscirò ad ottenere.
        Volevo anche sapere è possibile allegare delle foto?

        Grazie

        Giovanni

        1. Ciao Giovanni,
          nei commenti no, questo perché manca la funzionalità ed i link a siti temporanei che ti permettono di allegare foto sono sconsigliati per non inficiare la corretta informazione e il degrado del ranking sui motori di ricerca.

            • Giovanni on 1 giugno 2015 at 11:39

            Ciao Mauro
            Ho fatto tesoro delle tue indicazioni sugli interrupt disponibili per il nano, solo due e ogni encoder ne vuole due.
            Va da se che devo cercare un arduino con più possibilità di interrupt magari con un ingombro maggiore..
            Guardando nel sito arduino sono stato attratto da arduino Yun se no sbaglio con 5 interrupt,.
            E’ dotato di I2C.
            7 pin in PWM.
            Oltremodo dispone di Wi Fi che potrei usare per fare dialogare i due YUN.
            Cosa ne pensi?
            E’ il caso che io mi orienti sui due yun, una in cabina, con il display, i due encoder e uno sul tetto con i due drv8825 e il Gy-80?
            Grazie
            Giovanni

          1. Ciao Giovanni,
            certamente la Yùn è una delle schede che preferisco e le caratteristiche che evidenzi sono interessanti per il tuo progetto.
            Ho solo il dubbio che una comunicazione WIFi su TCP con protocollo da definire possa complicarti il progetto in un ambiente ridotto in cui i moduli XBee o RF potrebbero renderlo una passeggiata 🙂
            LA Yùn è basata sulla Leonardo per cui se ti occorrono 5 interrupt la Leonardo potrebbe essere ideale.
            Controlla bene l’uso dell’I2C mi sembra che sia la Leonardo sia la Yùn utilizzino 2 pin destinati agli interrupt per l’I2C, riducendo a soli 3 interrupt utilizzabili se vuoi sfruttare la comunicazione I2C.

    • Giovanni on 1 giugno 2015 at 16:05
    • Reply

    Ciao Mauro
    Guardando nel sito arduino Leonardo come dici tu ha 5 interrupt,.
    E’ dotato di I2C.
    7 pin in PWM.
    L’I2C lo pensato per fare dialogare sia il display sia il GY-80, che vorrei mi desse la posizione dell’antenna visualizzata sul display, sui due assi zenit e azimut.
    Direi che avendo io già due moduli rf non ho bisogno di WiFi perché i due arduino possano parlarsi e in questo caso il numero dei fili da cabina a tetto sono solo il + e – del 12 volt e l’antenna.
    Cosa ne pensi?
    E’ il caso che io mi orienti sui due Leonardo, una in cabina, con il display, i due encoder e uno sul tetto con i due drv8825 e il Gy-80?
    Oppure il Leonardo in cabina ed il nano sul tetto avendo io già due nano?
    Grazie
    Giovanni

    1. Ciao Giovanni,
      io farei tutto con un unico controllore, Leonardo, portando sul tetto sia i fili di alimentazione sia quelli di controllo dei motori.
      Se non vuoi portarti dei fili per i motori puoi ripiegare per un Leonardo in cabina ed un nano, dei due che già possiedi, per il controllo dei motori.

    • Giovanni on 1 giugno 2015 at 23:14
    • Reply

    Ciao Mauro
    Scusami ma guardando con più attenzione nel sito arduino ho visto un arduino Mega 2560 con 6 interrupt, 2, 3, 18, 19, 20, 21 che potrebbe essere messo in cabina, anche se è più voluminoso.
    Cosa ne pensi?
    Grazie
    Giovanni

    1. Ciao Giovanni,
      l’arduino MEGA è di sicuro un ottimo prodotto e con 6 interrupt puoi leggere 3 encoder, anche se mi sembra che anche in questo caso i pin 20 e 21 siano I2C o Seriali.

    • Giovanni on 3 giugno 2015 at 15:45
    • Reply

    Ciao Mauro
    Avendo io bisogno, in cabina, di due soli comandi per l’orientamento della parabola per mezzo degli encoder gli interrupt che mi servono sono 4.
    Naturalmente ho bisogno dell’I2C per collegarmi al display, che ho già a mie mani, con solo due fili, ovviamente più l’alimentazione, al fine di visualizzare i dati forniti dal GY-80 che mi dovrebbe dire come è orientata la parabola e di conseguenza, grazie alle numerose tabelle sull’orientamento dei satelliti ruotarla per mezzo degli encoder fino al valore richiesto.
    Ora in cabina mi serve ancora connettere al Mega, che a questo punto sarà l’arduino giusto, il modulino RF per le comunicazioni da cabina a tetto.
    Ora l’insieme dei componenti fisici per la cabina dovrebbe andare bene.
    Per il tetto io devo, per mezzo di arduino e dei due DRV8825, movimentare la parabola (ovviamente in questa fase tralasciando tutta la parte meccanica) ma devo anche collegare il gy-80 e il modulo RF per la comunicazione tra gli arduino.
    Ora il mio dubbio è:
    Quale arduino usare per il tetto?

    1. Ciao Giovanni,
      penso tu possa usare per il tetto l’arduino nano se ti bastano i pin per collegare tutto ciò che hai previsto.

        • Giovanni on 3 giugno 2015 at 23:47
        • Reply

        Ciao Mauro
        Mi scuso se non ho precedentemente spiegato il perché io parli di alcuni componenti come i DRV 8825, il GY-80 ecc., la ragione vera e che io avendo una disponibilità economica limitata ed avendo fatto un giro su ebay di fornitori di componenti cinesi mi sono fatto una idea… e mi sono lasciato attrarre dal prezzo per pezzo molto allettante e dal fatto che non vi era costo per la spedizione e da una sbagliata fretta di fare.
        Purtroppo ho comperato uno schermo LCD I2c, due drv8825 due moduli rf a 2.4 GHz con micro della NORDIC il nRF24LU1P, due encoder e due nano, credendo andassero bene.
        Alcune scelte come il cercare di ridurre al minimo i fili è dettata dalla difficolta nel fare passare i fili in posti molto stretti e difficoltosi con l’aumentare del diametro del cavo.
        Ora cerco di vedere se posso utilizzare i componenti che ho e ovviamente correggendo gli errori grossolani, cercando di spendere il meno possibile..
        Ragionando per un attimo senza pensare a che arduino utilizzare sul tetto penso che per ogni DRV8825 servano due pin, uno per lo step e uno per il dir ma non so se devo usare dei pin PWR o no, e quindi servono quattro pin… .
        Del GY-80, che dovrebbe dialogare tutto in I2c, mi servono solo due componenti, il HMC55883L (bussola) e il ADSL345 (accelerometro) e qui aumentano le mie indecisioni nell’utilizzo dei pin, a questo si aggiunge un’altra incertezza sul modulo a RF della NORDIC.
        Ora decidere che arduino scegliere mi diventa difficile, e non vorrei continuale a sbagliare… €€€€€€€.
        Quale arduino usare?
        Cosa mi consigli?
        Grazie
        Giovanni

        1. Ciao Giovanni,
          mi era sembrato avessimo già superato la scelta di quale arduino utilizzare.
          Io potrei studiare almeno 3 soluzioni differenti per il medesimo problema e crearti tanta confusione in più.
          Se vuoi un vero consiglio è “fermati”, “ragiona su quello che desideri fare”, “valuta la strada migliore per le tue conoscenze” e solo dopo agisci.
          Qualche tempo fa ho scritto un articolo che ti invito a leggere: http://www.mauroalfieri.it/elettronica/progetto-arduino-dove-iniziare.html

            • Giovanni on 4 giugno 2015 at 21:20

            Ciao Mauro
            Ho letto l’articolo Ok, mi fermo, rifletto e ragiono e vediamo.

            Grazie

            Giovanni

          1. Giusto atteggiamento 🙂

    • Andrea on 22 settembre 2015 at 08:46
    • Reply

    Ciao Mauro, prima di tutto: GRAZIE!!

    Vorrei un semplice chiarimento. Ho utilizzato una scheda Easy driver per comandare uno sTEPPER NEMA 16, ora desidero utilizzare la scheda DRV8825 con un altro stepper appena più potente del precedente. Leggendo gli sketch mi è tutto abbastanza chiaro, ma vorrei una conferma:
    nella Easy Driver potevo impostare il numero di Steps che il motore doveva compiere sia in una direzione sia nell’opposta. In questo sketch
    void stepGo() {
    Serial.println( dPause );

    digitalWrite(STEP, HIGH);
    delayMicroseconds(dPause);
    digitalWrite(STEP, LOW);
    delayMicroseconds(dPause);
    }

    Il numero di Steps è rappresentato dalla variabile “STEP”? Quindi se voglio far compiere 1800 step in una direzione mi basterà assegnare alla variabile STEP il valore 1800?

    Te lo chiedo solo perchè dall’esempio pubblicato il motore gira in continuo fino a quando non riceve un comando diverso, quindi nell’esempio riportato credo che la variabile STEP valga sempre 1 , è corretto?

    Grazie!
    Andrea

    1. Ciao Andrea,
      ti invito a leggere meglio la descrizione dello sketch. La funzione stepGo() non definisce il numero di step da compiere ma controlla solo il pin STEP del driver.

        • Raffaele on 29 novembre 2016 at 23:47
        • Reply

        Ciao Mauro ,potresti gentilmente spiegarmi come posso far girare normalmente un motore passo passo senza usare M1-M2-M3 cioe facendolo girare sempre full step ?

        1. Ciao Raffaele, basta lasciarli non collegati o inviare loro il segnale LOW, se ricordo a memoria la tabella.

            • Raffaele on 30 novembre 2016 at 21:29

            Ti ringrazio , a questo punto mi bastano solo DIR e STEP ora nelle righe di programma come dovrei scrivere ?non so perche non trovo nulla il problema lo ho solo con lo STEP perche DIR e solo un 1,0 per la direzione se protrsti scrivere 4 righe per farlo giare normalmente ,Grazie

          1. Ciao Raffaele,
            è scritto nella descrizione riga per riga come fare.
            Non saprei cosa altro scrivere.

    • Andrea on 22 settembre 2015 at 10:20
    • Reply

    Grazie.
    Vuoi dire cioè che i passi da compiere si esprimo in unità di tempo anzichè in numero di step?
    ovvero 1/4 di step ogni 25 ms per impostazioni a 1/4 e così via?
    Scusa ma devo ricredermi sul fatto che sia tutto abbastanza chiaro…. HIHI..
    In sostanza non mi è chiaro come impartire l’istruzione di compiere un certo numero di step al motore….

    1. Ciao Andrea,
      forse il codice può ingannare tuttavia ho scritto dei commenti per chiarire i punti critici.
      La funzione stepGo() si occupa di eseguire solo il passo, ossia di fornire l’impulso al driver, quante volte la chiami lo definisci tu nel loop() o in qualsiasi altro punto dello sketch che scrivi.

    • Andrea on 23 settembre 2015 at 11:10
    • Reply

    Grazie Mauro, ieri sera ero giunto a questa conclusione pensando di inserire un ciclo for …. che richiamasse la funzione stepGo() per ogni step che desidero far compiere al motore a prescindere dalla direzione… credo sia questo il metodo, grazie mille!!

    • Romeo on 11 novembre 2015 at 20:05
    • Reply

    Io non capisco, ho collegato tutto come hai detto, bobine del motore ok, m0 m1 m2 ok, gnd sleep e reset ok, V in ingresso 12V ..appena collegato fumatina grigia..è andato? Non so se riprovare a collegare mi fa abbastanza paura ricollegare la batteria solo per provare.. Grazie..

    1. Ciao Romeo,
      sei certo di possedere il medesimo driver e che sia originale della pololu come il mio?
      Bastano poche differenze e le connessioni potrebbero non essere corrette, inoltre ricordo male o tu avevi già avuto problemi simili con la easy-driver, non sei nuovo alla fusione dei driver perchè connessi in modo errato.

    • Davide on 1 dicembre 2015 at 15:17
    • Reply

    Ciao Mauro, grazie dell’utilissimo sito!
    Sto provando un mototre nema 17 1,7(A) 200step (1,8geg/step) con una confiugrazione uguale alla tua (arduino e drv8255)

    Collegando un potenziometro su A0 collegato direttamente alla variabile delay dello sketch sto provando a cambiare variare la velocità del motore. Purtroppo sto riscontrando che il motore ha dei range in cui entra in crisi (l’albero motore invece di continuare a girare più lentamente o più velocemente inizia a tremare e va avanti e indietro in maniera incontrollato), poi uscito da questi piccoli range torna “normale”.

    Cambiare linearmente la velocità del motore senza “intoppi” mi servirebbe per creare uno slider motorizzato per una fotocamera. La precisione è importante e anche la fluidità.

    1. Ciao Davide,
      i range in cui il motore “entra in crisi” sono dovuti, probabilmente, ai limiti meccanici del motore stesso, dovresti trovarli nel sito del produttore.
      Premesso che il motore passo-passo è il meno indicato per uno slider di precisione a causa delle vibrazioni e della scarsa fluidità a regimi lenti, ti consiglio di scegliere un motore che possa supportare i regimi che ti interessa raggiungere.

    • Giuseppe on 25 febbraio 2016 at 23:30
    • Reply

    Ciao Mauro volevo farti una domanda se potevo alimentare a 24 volt ramps1.4 e mega 2560 .prima di bruciare tutto. Grazie in anticipo.

    1. Ciao Giuseppe,
      devi consultare il datasheet del costruttore perché so che alcune lo supportano ma non è una info valida in assoluto.

    • Cesare on 2 marzo 2016 at 20:48
    • Reply

    Salve Mauro,
    dallo schema di collegamento fornito dal produttore viene indicato di inserire un condensatore elettrolitico sull’alimentazione del motore. Dal video che hai postato non mi sembra che tu lo abbia inserito nel circuito, (o per lo meno non lo vedo io?)

    1. Ciao Cesare,
      sarebbe utile inserirlo, io negli esperimenti, poiché sono progetti che durano pochi minuti lo ometto usando una alimentazione stabilizzata.

    • Andrea on 20 marzo 2016 at 16:34
    • Reply

    Ciao Mauro,
    Se volessi pilotare tre motori stepper contemporaneamente , con tre driver separati, potrei impartire in modo sequenziale tre istruzioni “StepGo”, una per ogni set di pin relativi ad ogni motore?
    Ovvero un loop che chiama in sequenza una funzione StepGo1 per far compiere uno step al primo driver, una funzione StepGo2 per far compiere uno step al secondo driver ed una funzione StepGo3 per far compiere uno step al terzo driver, ?

    In questo caso le pause immagino che dovrebbero essere diminuite, considerando che prima che lo stesso motore riceva la successiva istruzione deve attendere che anche gli altri due stepper ricevano le relative istruzioni.

    In questo modo il comportamento sarebbe quasi simile ad un movimento simultaneo dei tre motori.
    Grazie

    1. Ciao Andrea,
      come teoria è corretta.

    • Giuseppe on 17 aprile 2016 at 23:05
    • Reply

    Ciao Mauro,
    Ho 45 anni e sono un appassionato di Informatica ed Elettronica.
    Da parecchi Anni Avevo qualche progettino in mente ma putroppo il tempo che posso deicare alle mie passioni è pochissimo. Qualcosa avrei voluto realizzare con i PIC e mi ero anche organizzato con un emulatore e un programmatore, ma poi voui per il tempo a disposizione vuoi per altri motivi è rimasto tutto irrealizzato. Ma Vengo al dunque , ho scoperto Arduino un anno fa circa ed ho deciso di iniziare con uno dei progetti :un Inseguitore Solare Astronomico. Grazie ai tuoi consigli ed a tanto materiale recuperato in rete sono riuscito, in modo abbastanza facile a realizzare tutta la parte elettronica e buona parte di quella Meccanica. Preciso che Non sono un Teorico, più che altro ho una buona manualità con la meccanica e l’elettronica ed essendo un ex programmatore PASCAL mi è risultato facile imparare quel po di “C” che serve per usare ARDUINO.
    Ho scelto di utilizzare La versione Nano di Arduino e per la parte dei motori /driver ho utlizzato appunto il Driver che hai provato tu usandoli in accoppiata ad ei Motori recuperati da vecchie stampanti ad aghi, questi sono targati come 5V 1,1A. – 1.8 gradi Ho letto che questi driver hanno un’escursione di tensione così estesa in modo da poter aumentare la velocià di motori che lavorano con tensioni minori. Infatti con tensioni basse 9-12v non riesco ad aumentare la velocità se non perdendo coppia.
    Il problema che ho riscontrato e per cui sto quì a chiderti un consiglio è il seguente:
    Nella routine di Inseguimento faccio calcolare la posiizione Teorica, Azimuth ed Elevazione, dopo di che la trasformo in passi da Eeguire per i motori, a questo punto se i passi da eseguire sono 1 o 2 succede che il motore fa come se volesse muoversi ma in relaltà non si muove, anzi sembra che a volte vada nel senso opposto in modo quasi impercettibile, o meglio, ogni volta che do un passo singolo da fare si comporta in modo differente: o non si muove, o va indietro oppure va in avanti in moto quasi impercettibile . Tieni conto che per minimizzare i consumi ho sfruttato la funzione SLEEP che abilito subito prima di dare la sequenza dei passi e disabilito subito dopo . I motori sono comunque accoppiati a riduttori meccanici e sono momentanemente senza alcun carico. Per quanto riguarda il Delay ne ho scelto uno che mi desse una coppia al motore tale da non riuscire qualsi a fermarlo con le dita. L’alimentazione che sto usando è 16V con batterie al piombo con un delay di 1200 MicroSec..
    Quando invece do da fare più di 6/7 passi il motore si muove in modo corretto (non sono però sicuro se sto perdo passi per qualche motivo) . Ti posso dire però che se lo faccio andare in manuale in una direzione con la stessa tensione e lo stesso Delay ha una coppia bestiale.
    i due driver sono stati montati su una mille fori con un unico Condensatore da 220mF e li sto pilotando in modalità Full-Step.

    Spero tu mi possa aiutare a risolvere questo intoppo e di aver dato tutte le informazioni necessarie.
    Attendo impaziente un tuo riscontro.
    Ciao
    Giuseppe

    1. Ciao Giuseppe,
      prova ad utilizzare una libreria per il controllo degli stepper, io ho provato la AccelStepper e mi sembra abbia una ottima risposta anche con questi driver, che uso anche io riscontrando talvolta i tuoi problemi su pochi passi.
      Prossimamente pubblicherò degli articoli proprio sull’uso di alcune librerie di controllo degli stepper.

        • Giuseppe on 19 aprile 2016 at 22:28
        • Reply

        … dimenticavo…
        Visto che sto usando la versione nano e che sono arrivato oltre l’80% della memoria , il compilatore ha iniziato a darmi un’ allarme …. tipo: “Attenzione – potrebbero esserci problemi di stabilità” … mi devo preoccupare? Inoltre l’uso della libreria accelstepper utilizza parecchie risorse?
        Non vorrei essere costretto a cambiare modello di Arduino adesso che avevo quasi terminato la parte software.
        Grazie ancora
        Giuseppe

          • Giuseppe on 22 aprile 2016 at 00:17
          • Reply

          Ciao Mauro,
          Ti aggiorno sui progressi che sto facendo , se così li vogliamo chiamare.
          Sto utilizzando la libreria da te suggerita , riesco a fargli fare le accellerazioni anche se in questa fase ci sono molte vibrazioni (forse dovrei regolre la corrente del DVR8825 ?) ma non riesco a fargli fare il singlo passo.
          Ho provato ad impostare 2 passi al secondo e li esegue correttamente in un unico “RUN” di oltre 2000 passi, Se invece gli chiedo di farmi un passo in un RUN si comporta come ti ho spiegato nel primo post.
          la routine che faccio eseguire per ogni asse è la seguente dopo ovviamente aver calcolato una nuova posizione:

          MOT_AZ.moveTo(OBTstepAZ);
          if (MOT_AZ.distanceToGo()!=0) {
          MOT_AZ.enableOutputs();delay(50);
          while (MOT_AZ.run()==true) {} ;
          delay(50);
          MOT_AZ.disableOutputs();
          }
          AZ_pos=OBTstepAZ;

          ho immesso dei ritardi prima e dopo l’abilitazione del PIN sleep pensando che la corrente avesse bidogno di stabilizzarsi , ma niente da fare.
          Sono al punto di partenza.
          non riesco prprio a capire dov’è il problema.
          se puoi dammi un’indizio … una strada da percorrere… qualche altro tentativo da fare…
          grazie in anticipo
          un saluto
          Giuseppe

          1. Ciao Giuseppe,
            non ho compreso cosa tu stia facendo con il codice che mi invii.
            Certamente impostare la corrente di controllo è un buon punto di partenza, poi ti suggerirei di verificare con un motore differente ed infine anche con un driver differente, potrebbe essere un problema meccanico del motore od elettrico del motore o del DRV8825 che stai utilizzando.
            Un altro suggerimento è di dotare il drv8825 di una aletta di raffreddamento con apposito bi-adesivo che trasferisca correttamente il calore.

        1. Ciao Giuseppe,
          una risposta alla volta:
          1. l’80% della memoria evidenzia un uso eccessivo di questa risorsa che potrebbe portare a saturarla con relativo innesco di reset;
          2. se la libreria suggerita occupa troppe risorse prova a cercarne una meno esosa;
          3. se cambi per andare verso una Mega, ad esempio, non dovrai cambiare molto.

    • Giuseppe on 19 aprile 2016 at 21:49
    • Reply

    Ciao Mauro,
    Intanto grazie per la tua disponibilità.
    Mi stai quindi suggerendo che si tratta di un problema di timing?
    Ho incominciato a dare un occhiata alla libreria che mi hai suggerito ed ho visto che usa una funzione per gestire anche il pin SLEEP…. mi pare si chiami Enable
    Approfitto per chiederti visto che gia usi questa libreria : uso giá il protocollo I2c per il display e l’orologio che so impegna gli interrupt. Questa libreria fa uso di interrupt o vado liscio senza problemi?
    Grazie ancora
    Giuseppe

    1. Ciao Giuseppe,
      mi indichi le fonti da cui hai letto che la I2C della RTC impegni degli interrupt, non ho trovato info nel web.
      So, ed ho scritto anche un articolo, dedicato ai TIMER ( 3 su arduino/genuino uno e 6 sulla Mega ).

        • Giuseppe on 27 aprile 2016 at 01:00
        • Reply

        Ciao Mauro,
        Intanto scusami … ho fatto un pò di confusione con i post.
        Vado in ordine :

        1)
        In effetti non avevo letto sul WEB il fatto che la Libreria I2C facesse uso di Interrupt … In effetti se me lo chiedi così è molto probabile che la mia fonte era poco attendibile. Tuttavia ho dato un’occhiata adesso sul WEB ed ho trovato sul Forum di Arduino un Topic titolato ” Hardware Interrupt and I2C interference – how to resolve (Read 1 time)” nel quale Leggo :” The data coming in and going out with I2C is with interrupts, those interrupts will delay other interrupts.”
        E’ probabile che stia facendo io confusione o che non mi sia spiegato correttamente.
        Cerco di spiegarmi meglio :
        Da quel che mi ricordo gli interrupts Hardware sono delle procedure la cui attivazione è legata ad un evento esterno su un determinato Pin. (sinceramente non ho studiato di recente mi perdonerai e mi correggerai se dico qualche castroneria) Credevo quindi che la libreria I2C usasse qualche interrupt per creare la comunicazione sincronizzata fra il Master e lo Slave.
        In passato mi ricordo di aver letto anche che una Routine di Interrupt non può essere interrotta se non da un’altra con priorità maggiore (almeno era così sui PC quando giravano gli MS-DOS sugli Intel 8088).
        Avevo quindi il timore che la libreria AccelStepper usasse Interrupt e che potesse interferire con la comunicazione I2C, ecco perchè la domanda.

        2)
        In effetti hai ragione : la parte di sketch così postata (soprattutto senza commenti ) non dice niente….
        provo a spiegarmi meglio.

        Quello che segue si trova in un Ciclo, e succede alla parte dove faccio calcolare la posizione del Sole e la trasformo in passi-motore.

        MOT_AZ.moveTo(OBTstepAZ); //Assegno posizione da raggiungere (calcolata) per l’asse AZIMUTH
        if (MOT_AZ.distanceToGo()!=0) { // Se ho movimento da fare allora entro nel blocco del ciclo del RUN
        MOT_AZ.enableOutputs(); // Abilito il PIN nSLEEP
        delay(50); // Aggiungo ritardo (se non erro il datasheet dice 1.7ms min)
        while (MOT_AZ.run()==true) {} ; // Ciclo RUN fino al raggiungimento della posizione
        delay(50); //Altro Delay per stabilizzare la posizione del motore
        MOT_AZ.disableOutputs(); // disabilito il PIN nSLEEP
        }

        Prima di fare altre prove ho regolato la corrente con il trimmer del Driver che ha avuto come effetto la riduzione delle vibrazioni durante le rampe di accellerazione e decellerazione.
        Inoltre ho verificato che il driver non scalda per niente quindi per adesso direi niente dissipatore.

        Le prove che ho eseguito sono le seguenti :

        1)Eliminato l’uso del Pin nSLEEP dallo sketch. Quindi col Motore sempre eccitato la proceura di insguimento funziona alla grande: il motore segue ogni singolo passo che gli viene impartito dal Driver.

        2)
        Testato lo sketch come sopra postato e commentato. Quando ho un singolo passo da fare esso provoca :
        un passo nel senso opposto nel momento in cui abilito nSLEEP, dopo di che esegue il singolo passo col RUN(). Risultato : il motore ha perso un passo ed è sempre allo stesso posto. Ho provato ad aumentare i delay per osservare meglio il fenomeno e posso confermarti quanto suddetto : al momento che vengono rieccitate le Bobine fa un passo indietro, dopo di che esegue correttamente il passo con il comando RUN();

        3)
        Ho provato a gestire la sequenze come riportato nel DataSheet nella parte dove mostra la sequenza del Timing. Ho introdotto quindi anche l’uso del Pin ENBL come recita il Datasheet : non è cambiato nulla. il motore si comporta allo stesso modo.

        Come avrai capito è fondamentale nel mio progetto che riesca a non perdere passi tenendo nel contempo i consumi a bada .

        A questo punto non mi resta che fare i tentativi da te suggeriti : cambio Driver e Cambio motore. … e vediamo l’effetto che fa.

        Adesso sono al 92% della memoria ma dovrò ottimizzare un po di codice …. spero di riuscire a tenere il Nano altrimenti dovrò cambiare il layout Hardware.

        Non so se posso postarti Foto di quello che sto realizzando ma mi piacerebbe avere un tuo parere/giudizio visto che è la prima volta che mi cimento. Avrei piacere, magarì quando e se riuscirò a completare il progetto, di condividere l’esperienza.

        Un saluto ed un ringraziamento per la tua Attenzione
        alla prossima
        Giuseppe

        1. Ciao Giuseppe,
          cerco di rispondere seguendo la tua numerazione, iniziamo dai chiarimenti su quanto scritto in precedenza:
          1. ho letto l’articolo, quello che deduco io, anche dai link di approfondimento contenuti, è che arduino impiega del tempo per eseguire le ISR ( Interrupt Service Request ) come l’I2C che devono essere ridotte e quanto più atomiche è possibile per evitare lunghe pause nell’esecuzione del codice.
          Se ho interpretato bene ti è sufficiente ridurre le routine di comunicazione al minimo per evitare interferenze sui tempi. Nel tuo caso usi l’I2C per interrogare l’ora dell’RTC per cui il tempo impiegato è nell’ordine dei microsecondi e non dovresti incorrere in problemi.

          2. Adesso il dice mi è più chiaro a parte la linea “delay(50); // Aggiungo ritardo (se non erro il datasheet dice 1.7ms min)” non comprendo il valore 1.7ms = 50 detto che il delay funziona in millisecondi

          Passando poi alle prove che hai eseguito:

          1. ok
          2. l’abilitazione dell’nSLEEP potrebbe essere un effetto causato dal driver in fase di attivazione, francamente nei miei progetti non ho mai utilizzato la modalità nSLEEP in quanto sono movimenti continui ( tipo stampanti 3D ) in cui una volta partito il driver funziona fino al termine dell’opera. Tuttavia se è un effetto che ottieni sempre potresti usare un workaround: quando attivi nSLEEP imposti che i passi siano n+1 in cui n è il numero da compiere a cui sommi 1 per compensare il movimento contrario eseguito dal motore.
          3. direi che se si tratta di un effetto del fw presente sul driver non puoi correggerlo dal microcontrollore, dovresti sostituire il fw del driver, ma non sono certo sia possibile.

          Se vuoi risparmiare energia lasciando i motori “non alimentati” durante i periodi di sleep puoi provare con il suggerimento al punto 2.

          Mi farebbe molto piacere ricevere un articolo scritto da te da condividere a tuo nome, magari anche con un video del sistema in funzione. Puoi, quando il progetto sarà ultimato, inviarmi tutto il materiale come descritto nella pagina: http://www.mauroalfieri.it/collabora.html

  5. Ciao Mauro,

    Ho provato il tuo sketch per testare il DRV8825, e devo dire che continua a darmi problemi su problemi.
    Per fare le prove sto alimentando il driver con un alimentatore da banco e gli fornisco 12V perchè successivamente alimenterò tutto con una batteria ad acido a 12V

    Inanzitutto il motore rimane a vibrare o a fischiare e non parte se non premo il primo o secondo pulsante, e non avverto la riduzione dei passi del motore nè tantomeno la riduzione della sua velocità quando premo gli altri tasti.
    Sembra proprio non funzionare correttamente tant’è che spesso ignora pure gli input di alcuni dei bottoni.

    Un altro problema ricorrente è che dopo un po’ di tempo il driver crasha, e smette di funzionare. Dopo un po’ torna ad andare, ma non ho capito con criterio si blocca nè tantomeno con che criterio riparte.

    Non riesco a capire quale possa essere il problema, ho provato anche altri sketch online ma il motore non sembrava mai perfettamente funzionante, e la storia dei crash è davvero fastidiosa.

    Hai qualche idea di quale possa essere il problema?
    Ti ringrazio in anticipo!

    1. Ciao Christian,
      Stai usando un arduino originale e dei driver pololu e non clonati giusto? Le anomalie che mi segnali io non le ho mai riscontrate, mi riferisco ai crash, per i movimento del motore potrebbe essere un errore sui tempi troppo ristretti tra comando e pause di step.

        • Christian on 28 luglio 2016 at 14:24
        • Reply

        Ciao Mauro e grazie della tua risposta.

        L’Arduino è originale, ma forse i driver non sono Pololu, sto usando questa versione: [ link rimosso ]

        Per quanto riguarda il movimento del motore, se il porblema fosse quello da te menzionato, come potrei fare per risolverlo?

        1. Ciao Christian,
          Ti chiedo il semplice rispetto delle regole del blog tra queste é vietato incollare link a siti di vendita non-line generalisti o non originali.
          Per i tempi puoi aumentarli, nello sketch é spiegato come funziona per aiutarti a capire come eseguire le modifiche.
          Per i malfunzionamenti dei driver, crash come li chiami tu, sono più orientato ad un problema legato alla manifattura del driver.
          Non mi hai detto che motore usi, intendo le caratteristiche elettroniche e meccaniche, potrebbe essere la causa.

            • Christian on 29 luglio 2016 at 11:42

            Chiedo scusa, non sapevo dell’esistenza di questa regola.

            I motori che utilizzo sono dei Nema 17, modello 42BYGHW609 a 1.7A., dovrebbero andare bene con questo tipo di driver.
            Nel frattempo proverò ad aumentare i tempi per gli step del motore.

          1. Ciao Christian, le regole sono scritte in fondo ad ogni articolo che leggi, ti consiglio sempre di leggere bene ciascuna descrizione perché oltre alle regole ci sono dei piccoli trucchi o descrizioni che pubblico proprio per aiutarti con i tuoi esperimenti.

    • Fulvio on 20 aprile 2017 at 09:59
    • Reply

    Ciao Mauro, prima di tutto complimenti per il sito e per il tuo lavoro, trovo sempre articolari chiari e molto utili.

    Secondo, sto riscontrando parecchi problemi nel far funzionare il driver DRV8825: dopo aver eseguito tutti i collegamenti seguendo le istruzioni riportate sul sito della Polulu ed aver tarato la Vref il motore continua a non funzionare (lo stepper è un Nema 17 con un assorbimento di 1.5A). Quello che noto è che anche collegando arduino al driver senza aver carico nessuno sketch, giusto per alimentare la logica, si sente un “bip” intermittente emesso dal motore (la cosa si verifica anche con lo sketch caricato poi); il suono si stoppa quando scollego o il pin SLEEP o RESET dai 5v. Ho provato anche a verificare le fasi del motore e sono corrette. Altro particolare che ho notato è che scambiando l’ordine di alimentazione della singola fase (A1 con A2) il motore da qualche segno di vita in più, ma non gira proprio come se le fasi fossero invertite (giustamente), ma almeno fa vedere di “ricevere corrente”, mentre nella configurazione giusta ho solo il bip e nessun segno di movimento. Infine ho provato anche ad aumentare di poco la Vref per vedere cosa succedeva, ma il motore emetteva un fischio continuo.
    Sapresti cosa c’è che non va e cosa sto sbagliando?

    Ti ringrazio in anticipo per il tuo aiuto, un saluto
    Fulvio

    1. Ciao Fulvio,
      prova ad aumentare i tempi tra una fase e la successiva, a titolo di test metti 1000 millisecondi.
      Spesso il sibilo che senti è legato all’alternarsi delle fasi che sono troppo veloci e non eseguibili dal motore.

    • Luigi Ravello on 14 giugno 2017 at 12:54
    • Reply

    Ciao Mauro,
    ho quasi finito di montare un robot x orto di precisione (www.farmbot.io) . Vorrei sostituire motore Nema 17 stepper
    ed encoder delle seguenti caratteristiche
    Motor resolution: 200 steps/revolution(1.8 deg/step)
    winding type:bipolar
    voltage:12V
    Current draw: 1.68A
    Wiring: 4 wire
    Shaft diameter :5mm diameter
    Mount Hole pattern: 4x M3 holes,standard 17 pattern

    Encoder Resolution : 360 lines revolution
    Encoder output :differential

    sono alla prima esperienza di montaggio e probabilmente ho fulminato qualcosa (il resto funziona bene).
    Ti chiedo cortesemente da quale fornitore (non americano) potrei fornirmi .
    Grazie comunque x l’attenzione e cordiali saluti
    Luigi

    1. Ciao Luigi,
      io solitamente acquisto da robotics-3d.com i miei stepper, sono a Roma, indica pure che te li ho indicati così ti possono dare dei consigli su cosa acquistare.

    • Dallai on 19 settembre 2018 at 15:39
    • Reply

    Grazie Mauro dei tutorial ti seguo sempre con attenzione!

  1. […] Gli ultimi progetti a cui sto lavorando, tipo il Dolly, utilizzano i motori passo-passo e richiedono un driver di controllo come il pololu md20a che ho acquistato tempo fa e provato in questo articolo. […]

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.