EasyDriver (A3967) collegare un motore passo passo.

Vediamo in questo articolo come collegare un motore stepper ad un Easy Driver (A3967) per pilotarlo con Arduino.

Tensione, corrente, temperatura e frequenza massima di step. Easy Driver (A3967)

Sito ufficiale Easy Driver.
Il datasheet dell’A3967 riporta i seguenti dati:

Voltage Current Temperature Maximum STEP Frequency
7V ÷ 30V ± 750mA -20°C ÷ +85°C 500 kHz

Pinout Easy Driver (A3967)

EasyDriver A3967

Motore: direzione e step

L’ Easy Driver ci facilità anche in questo (ovviamente) ci mette a disposizione per la direzione del motore il pin denominato DIR e per avanzare di un passo il pin STEP.

Come aumentare il numero di passi/steps al motore: Microstep select MS1 MS2

L’ Easy Driver dispone di questi due pins MS1 MS2 che ci permettono in modo abbastanza semplice di aumentare la risoluzione del motore, ovvero andiamo ad aumentare il numero di passi da eseguire per effettuare una rotazione completa.
A dire il vero non è che andiamo ad aumentare gli steps ma andiamo a dividere il passo, che effettivamente sembrano aumentare di conseguenza.
In che modo? Invece di alimentare una fase per volta si va ad operare con più fasi, ottenendo così i seguenti passi:

easydriver_ms1_ms2

Ovviamente non saremo noi ad alimentare le varie fasi ma ci penserà l’ Easy Driver, noi dobbiamo intervenire solo sui pin MS1 MS2, secondo la tabella appena vista. Basterà semplicemente mettere ad HIGH o LOW i rispettivi pin di Arduino che saranno collegati a MS1 e MS2.

Easy Driver schema collegamenti.

easydriver_collegamento_stepper

Sketch Easy Driver FULL STEP

Sketch Easy Driver FULL STEP
byte DIR = 2;
byte STEP = 3;
byte MS1 = 4;
byte MS2 = 5;

const int stepSleep = 750; // microSeconds

void setup() {
  Serial.begin(9600);
  pinMode(DIR, OUTPUT);
  pinMode(STEP, OUTPUT);
  pinMode(MS1, OUTPUT);
  pinMode(MS2, OUTPUT);

  /*
    FULL STEP
  */
  digitalWrite(MS1, LOW);
  digitalWrite(MS2, LOW);
}

void loop()
{
  // decide il verso di rotazione
  digitalWrite(DIR, HIGH);
  delay(250);

  for (int i = 0; i < 100; i++) {
    digitalWrite(STEP, HIGH);
    delayMicroseconds(stepSleep);
    digitalWrite(STEP, LOW);
    delayMicroseconds(stepSleep);
  }



  // cambio il verso di rotazione
  digitalWrite(DIR, LOW);
  delay(250);

  for (int i = 0; i < 100; i++) {
    digitalWrite(STEP, HIGH);
    delayMicroseconds(stepSleep);
    digitalWrite(STEP, LOW);
    delayMicroseconds(stepSleep);
  }
}

Sketch Easy Driver HALF STEP

 

byte DIR = 2;
byte STEP = 3;
byte MS1 = 4;
byte MS2 = 5;

const int stepSleep = 750; // microSeconds

void setup() {
  Serial.begin(9600);
  pinMode(DIR, OUTPUT);
  pinMode(STEP, OUTPUT);
  pinMode(MS1, OUTPUT);
  pinMode(MS2, OUTPUT);

  /*
    HALF STEP
  */
  digitalWrite(MS1, HIGH);
  digitalWrite(MS2, LOW);
}

void loop()
{
  // decide il verso di rotazione
  digitalWrite(DIR, HIGH);
  delay(250);

  for (int i = 0; i < 100; i++) {
    digitalWrite(STEP, HIGH);
    delayMicroseconds(stepSleep);
    digitalWrite(STEP, LOW);
    delayMicroseconds(stepSleep);
  }



  // cambio il verso di rotazione
  digitalWrite(DIR, LOW);
  delay(250);

  for (int i = 0; i < 100; i++) {
    digitalWrite(STEP, HIGH);
    delayMicroseconds(stepSleep);
    digitalWrite(STEP, LOW);
    delayMicroseconds(stepSleep);
  }
}
 

Sketch Easy Driver QUARTER STEP

 

byte DIR = 2;
byte STEP = 3;
byte MS1 = 4;
byte MS2 = 5;

const int stepSleep = 750; // microSeconds

void setup() {
  Serial.begin(9600);
  pinMode(DIR, OUTPUT);
  pinMode(STEP, OUTPUT);
  pinMode(MS1, OUTPUT);
  pinMode(MS2, OUTPUT);

  /*
    QUARTER STEP
  */
  digitalWrite(MS1, LOW);
  digitalWrite(MS2, HIGH);
}

void loop()
{
  // decide il verso di rotazione
  digitalWrite(DIR, HIGH);
  delay(250);

  for (int i = 0; i < 100; i++) {
    digitalWrite(STEP, HIGH);
    delayMicroseconds(stepSleep);
    digitalWrite(STEP, LOW);
    delayMicroseconds(stepSleep);
  }



  // cambio il verso di rotazione
  digitalWrite(DIR, LOW);
  delay(250);

  for (int i = 0; i < 100; i++) {
    digitalWrite(STEP, HIGH);
    delayMicroseconds(stepSleep);
    digitalWrite(STEP, LOW);
    delayMicroseconds(stepSleep);
  }
}
 

Sketch Easy Driver EIGHT STEP

 

byte DIR = 2;
byte STEP = 3;
byte MS1 = 4;
byte MS2 = 5;

const int stepSleep = 750; // microSeconds

void setup() {
  Serial.begin(9600);
  pinMode(DIR, OUTPUT);
  pinMode(STEP, OUTPUT);
  pinMode(MS1, OUTPUT);
  pinMode(MS2, OUTPUT);

  /*
    HEIGHT STEP
  */
  digitalWrite(MS1, HIGH);
  digitalWrite(MS2, HIGH);
}

void loop()
{
  // decide il verso di rotazione
  digitalWrite(DIR, HIGH);
  delay(250);

  for (int i = 0; i < 100; i++) {
    digitalWrite(STEP, HIGH);
    delayMicroseconds(stepSleep);
    digitalWrite(STEP, LOW);
    delayMicroseconds(stepSleep);
  }



  // cambio il verso di rotazione
  digitalWrite(DIR, LOW);
  delay(250);

  for (int i = 0; i < 100; i++) {
    digitalWrite(STEP, HIGH);
    delayMicroseconds(stepSleep);
    digitalWrite(STEP, LOW);
    delayMicroseconds(stepSleep);
  }
}
 

Vantaggi/Svantaggi a modificare il passo/step

Sicuramente un vantaggio è l’aumento della precisione, ma un grosso svantaggio è l’aumento del consumo di corrente che ne implica in automatico un aumento di calore e rischiamo di bruciare sia il motore che il driver, questo perché pilotiamo lo stepper non più una fase alla volta, ma più fasi contemporaneamente.

Limitare la corrente

EasyDriver_current_adjust


Grazie ad un trimmer posto sulla parte superiore dell’ EasyDriver possiamo andare ad aumentare o diminuire la corrente che deve circolare nelle fasi come indicato nel datasheet del motore stesso.
Fate attenzione che se state utilizzando lo stepper in modalità HALF, QUARTER o HEGIHT la corrente assorbita sarà quasi sicuramente doppia perché lavora più di una fase.

Se volete approfondire qualcosina sui motori stepper potete leggere questo post.
Per qualsiasi chiarimento scrivete qui sotto nei commenti.
Buon lavoro e buona sperimentazione 😉