Tutorial: EasyDriver Stepper Motor

Qualche mese fa un appassionato utente del Blog mi ha fatto omaggio di un EasyDriver, un driver per motori passo-passo bipolari, a sostegno del Blog.

EasyDriver

Questo driver è prodotto dalla sparkfun e si basa sull’integrato A3967, di cui trovi il DataSheet qui.

Il sostegno va premiato e ho fatto qualche test del driver per poter scrivere questo articolo.

I test li ho realizzati con un motore bipolare, identico a quello mostrato negli articoli del Dolly Project.

Motore passo-passo bipolare

Ti presento due sketch, il primo è un esempio di rotazione oraria e antioraria programmata, ossia già definita che il motore bipolare compie; il secondo sketch fa uso di 4 pulsanti na con cui impartire degli ordini al motore, definisci il verso di rotazione e il numero di step.

Componenti

Iniziamo subito dal materiale utilizzato:

  • n.1 arduino Leonardo, puoi utilizzare qualsiasi scheda Arduino in tuo possesso;
  • n.1 EasyDriver
  • n.1 motore stepper bipolare
  • n. 4 pulsanti na ( normalmente aperti )
  • n. 4 resistenze da 330Ω
  • n.1 breadboard
  • n.1 batteria per alimentare il motore
  • un po di cavi per breadboard

Schema di collegamento dell’EasyDriver

Per collegare l’EasyDriver ad Arduino ed alimentarlo separatamente puoi seguire questo schema:schema collegamentoè valido sia per il primo che per il secondo sketch del tutorial.

In basso a sinistra dell’EasyDriver trovi l’alimentazione del modulo (PWR) che devi collegare al terminale positivo ( + )  e meno ( GND ) della batteria esterna.

Sempre in basso sulla destra ci sono i 4 pin delle 2 fasi ( A e B ) del motore bipolare, se il tuo motore è differente puoi leggere questo articolo per imparare a riconoscere le fasi di un motore bipolare.

I due pin in alto a sinistra sono collegati, partendo da sinistra, rispettivamente al pin 2 e 3 di arduino.

I 4 pulsanti, scorrendo da sinistra a destra, sono connessi ai pin 4,5,6 e 7 di arduino ed al terminale positivo di alimentazione dell’EasyDriver in modo diretto e al terminale negativo mediante una resistenza da 330ohm.

Ricorda di collegare il terminale negativo ( GND ) della batteria ad Arduino per chiuere il circuito, ATTENZIONE: solo il terminale negativo.

Il primo sketch dell’EasyDriver

Questo primo esempio ti mostra come impartire al driver i comandi per far ruotare il motore di 1600 passi in un verso e di 8000 passi nel verso opposto:

int dirPin = 2;
int stepperPin = 3;

void setup() {
  pinMode(dirPin, OUTPUT);
  pinMode(stepperPin, OUTPUT);
}

void step(boolean dir,int steps){
  digitalWrite(dirPin,dir);
  delay(50);
  for(int i=0;i<steps;i++){
    digitalWrite(stepperPin, HIGH);
    delayMicroseconds(100);
    digitalWrite(stepperPin, LOW);
    delayMicroseconds(100);
  }
}

void loop(){
  step(true,1600);
  delay(500);
  step(false,1600*5);
  delay(500);
}

leggilo riga per riga:

linee 01-02: imposta i pin a cui hai collegato il pin relativo ai comandi di direzione e step;

linee 05-06: definisci per ciascun pin definito la modalità di funzionamento OUTPUT con il comando pinMode( pin,mode);

linea 09: definisci la funzione step( direzione,passi ) userai questa funzione in seguito nel loop() per impartire al driver i passi da far eseguire al motore e la direzione in cui farglieli eseguire;

linea 10: scrivi in digitale il valore di direzione al pin corrispondente, in questa funzione la direzione è il primo parametro e il pin a cui inviare il segnale di direzione è dirPin;

linea 11: attendi 50 millisecondi prima di eseguire le linee successive, questo tempo ti garantisce che il driver possa impostare correttamente la direzione come impostata alla linea 10;

linea 12: imposta un ciclo da 0 al valore di passi che hai ricevuto come secondo parametro della funzione;

linea 13: per ciascun ciclo del for definito alla linea 12 imposta il valore del pin stepperPin ad HIGH, lo fai attraverso il comando digitalWrite( pin, valore ) che invia al pin definito il valore che gli passi come secondo parametro;

linea 14: attendi un tempo di 100 miscosecondi prima di passare al comando successivo;

linea 15: riporta a LOW il valore del pin stepperPin annullando quindi il segnale inviato precedentemente;

linea 16: attendi un tempo di 100 microsecondi prima di passare al ciclo successivo.

Il passaggio HIGH -> LOW con un tempo di 100 microsecondi di attesa tra il primo ed il secondo serve ad impartire l’ordine di fare un passo nella direzione specificata alla linea 10, quindi ogni ciclo di for è un passo;

linea 20: definisci la funzione loop();

linea 21: richiama la funzione step( dir,passi ) vista alle linee 09-18 passando come direzione true interpretato come HIGH, e come passi 1600;

linea 22: attendi 500 millisecondi prima di eseguire il passaggio successivo;

linea 23: richiama la funzione step ( dir,passi ) questa volta passando come valore di direzione false e come numero di passi 1600*5 = 8000;

Ecco il risultato di questo sketch in pratica:

Il secondo sketch dell’EasyDriver

ecco come con 4 pulsanti cambiano le cose:

int dirPin = 2;
int stepperPin = 3;

int buttOrario = 5;
int buttAntior = 4;

int buttPiu  = 6;
int buttMeno = 7;

int stepNumber = 100;
int direzione = true;

void setup() {
  pinMode(dirPin, OUTPUT);
  pinMode(stepperPin, OUTPUT);

  pinMode( buttOrario, INPUT );
  pinMode( buttAntior, INPUT );
  pinMode( buttPiu, INPUT );
  pinMode( buttMeno, INPUT );
}

void step(boolean dir,int steps){
  digitalWrite(dirPin,dir);
  delay(50);
  for(int i=0;i<steps;i++){
    digitalWrite(stepperPin, HIGH);
    delayMicroseconds(100);
    digitalWrite(stepperPin, LOW);
    delayMicroseconds(100);
  }
}

void loop(){

  if ( digitalRead(buttPiu) == HIGH ) {
    stepNumber = (stepNumber + 100);
  } else if ( digitalRead(buttMeno) == HIGH ) {
    stepNumber = (stepNumber - 100);
  }
  if (stepNumber <= 0) stepNumber = 0;

  if ( digitalRead(buttOrario) == HIGH ) {
    direzione = true;
  } else if ( digitalRead(buttAntior) == HIGH ) {
    direzione = false;
  }
  step( direzione,stepNumber );

}

non riprenderò la descrizione delle linee che già hai visto, ma descriverò solo quelle differenti o nuove:

linee 04-05: definisci i pin a cui colleghi i pulsanti di direzione, orario e antiorario;

linee 07-08: definisci i pin a cui colleghi i pulsanti più e  meno;

linea 10: definisci la variabile stepNumber, preimpostata a 100, contenete il numero di step da eseguire;

linea 11: definisci la variabile direzione, preimpostata a true, in cui memorizzerai il valore di direzione in cui il motore deve ruotare;

linee 17-20: imposta la modalità di funzionamento dei pin legati ai pulsanti, saranno pin in modalità INPUT in quanto leggono il segnale proveniente da un input esterno;

linee 23-32: definisci la funzione step( dir,passi ) in modo del tutto identico al primo sketch;

linea 36: con il comando digitalRead( pin ) leggi il valore del pulsante connesso al pin buttPiu se tale valore è HIGH vuol dire che è stato premuto;

linea 37: la pressione del pulsante Più causa un incremento di 100 passi della variabile stepNumber;

linea 38: esegui la medesima verifica della linea 36 ma per il pin a cui è collegato il pulsante buttMeno;

linea 39: se il pulsante Meno è stato premuto decrementa di 100 il valore di stepNumber;

linea 41: è un controllo impostato per evitare che il valore della variabile stepNumber possa andare sotto al valore 0;

linee 43-47: esegui le stesse operazioni viste per i pulsanti buttMeno e buttPiu con la sola differenza che invece di incrementare o decrementare una variabile ne cambi il valore da true a false;

linea 48: richiama la funzione step( dir,passi ) passandogli i valori memorizzati nelle rispettive variabili direzione e stepNumber.
Ecco il video demo di questo secondo sketch:

Buon divertimento !!!

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

Permanent link to this article: https://www.mauroalfieri.it/elettronica/easydriver-stepper-motor.html

81 pings

Skip to comment form

  1. […] hai già letto il mio tutorial sull’EasyDriver sai di cosa sto parlando e sai che anche in questo articolo potrai leggere come pilotare i motori […]

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.