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 !!!

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

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

97 pings

Skip to comment form

  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.