NEMA 17 stepper with EasyDriver: how to control steps and stop motion

Customer:

I’m working with a NEMA 17 stepper motor and an EasyDriver. I need to control the stepper so that each time I press a button, it performs a specific number of steps - for example, 200 steps on the first press, 300 steps on the second press - and an LED lights up in parallel. This should repeat 5 times and then return to the start.

Original message (Croatian)

zanima me dali bi bili voljni napraviti kod u arduinu za kontroliranje steppera,te koja bi bila cijena?

Naime imam ideju da kad stisnem tipkalo prvi put stepper napravi 200 koraka,kad stisnem drugi put 300 koraka,te da se paralelno pali led dioda.

I tako recimo 5 puta te da se zatim vrati na pocetak..

Hvala!

Originally submitted via email support on 20 October 2015. Migrated to the forum for community visibility.

Soldered Support:

Have you checked our tutorials page? We have one on exactly this topic: Nauči – Soldered Electronics

Original message (Croatian)

jeste li vidjeli našu stranicu s tutorialima? Imamo jedan upravo za to što VAs zanima: Nauči – Soldered Electronics

Customer:

The problem is that I’m working with a NEMA 17 stepper and an EasyDriver, so that code isn’t helpful.

Original message (Croatian)

Problem je u tome sto ja radim sa nema 17 stepperom te easydriverom..

Tako da mi ovaj kod i nije od neke pomoci..

Soldered Support:

Unfortunately that tutorial won’t help then. However, most EasyDriver versions use the A3976 chip. We have something similar: Soldered: Open-Source Electronics, Boards, Sensors & Modules – Soldered Electronics - that also uses an Allegro chip. I’ll send you sample code.

Original message (Croatian)

Da, nažalost nema onda pomoći od tog tutoriala.
Inače, mislim da sve verzije EasyDrivera koriste A3976? Mi imao nešto slično,: Soldered: Open-Source Electronics, Boards, Sensors & Modules – Soldered Electronics
To je također Allegrov chip. Predvečer ti pošaljem sample kod, nadam se da će upaliti.

Soldered Support:

Try this:

int dir = 7; // dir pin = D7
int stepper = 6; // stepper pin = D6

void setup() {
  pinMode(dir, OUTPUT);
  pinMode(stepper, OUTPUT);
}

//funkcija koja pokreće stepper
void step(boolean smjer,int brojKoraka){
  digitalWrite(dir,smjer);
  delay(50);
  for(int i=0;i<brojKoraka;i++){
    digitalWrite(stepper, HIGH);
    delayMicroseconds(100); //ovaj delay ne diraj
    digitalWrite(stepper, LOW);
    delayMicroseconds(100);
  }
}

void loop(){
  // poziva funkciju step(smjer,broj koraka)
  // true - smjer kazaljke na satu
  step(true, 200);
  delay(300);
  step(false,400);
  delay(300);
}
Original message (Croatian)

Alane,
probaj ovo:
int dir = 7; // dir pin = D7

int stepper = 6; // stepper pin = D6
void setup() {

pinMode(dir, OUTPUT);

pinMode(stepper, OUTPUT);

}
//funkcija koja pokreće stepper

void step(boolean smjer,int brojKoraka){

digitalWrite(dir,smjer);

delay(50);

for(int i=0;i<brojKoraka;i++){

digitalWrite(stepper, HIGH);

delayMicroseconds(100); //ovaj delay ne diraj

digitalWrite(stepper, LOW);

delayMicroseconds(100);

}

}
void loop(){

// poziva funkciju step(smjer,broj koraka)

// true - smjer kazaljke na satu

step(t[address removed]);

delay(300);

step(false,400);

delay(300);

}

Customer:

I’ll try it. I spoke with someone who understands this better, and they suggested creating a subroutine and then calling it in the main program. For example, the subroutine:

digitalWrite(9,HIGH);
delay(100);
digitalWrite(9,LOW);
delay(100);

And then calling it 3000 times in the main code - that was the idea.

Original message (Croatian)

Ok,budem probao.

Pitao sam jednog covjeka koji se razumije u to i kaze da bi trebalo napraviti potprogram i onda ga u glavnom programu samo pozvati..

Recimo

Potprogram

digitalWrite(9,HIGH);

delay(100);

digitalWrite(9,LOW);

delay(100);

I onda ga pozvati 3000 puta u glavnom kodu recimo,to je bila ideja..

Soldered Support:

Here’s how to do it:

//funkcija koja pokreće stepper
void step(boolean smjer,int brojKoraka){
  digitalWrite(dir,smjer);
  delay(50);
  for(int i=0;i<brojKoraka;i++){
    digitalWrite(stepper, HIGH);
    delayMicroseconds(100); //ovaj delay ne diraj
    digitalWrite(stepper, LOW);
    delayMicroseconds(100);
  }
}

You call it like this:

step(direction, repetitions);

where you put 1 or 0 for the direction depending on which way you want to rotate, and the number of steps in the second parameter.

Original message (Croatian)

Evo je Alene:
//funkcija koja pokreće stepper

void step(boolean smjer,int brojKoraka){

digitalWrite(dir,smjer);

delay(50);

for(int i=0;i<brojKoraka;i++){

digitalWrite(stepper, HIGH);

delayMicroseconds(100); //ovaj delay ne diraj

digitalWrite(stepper, LOW);

delayMicroseconds(100);

}

}
pozivaš ga s:
setup(ovdje napišes 1 ili 0, ovisno koji smjer okretanja želiš, ovdje upišeš broj ponavljanja)

Customer:

The problem now is that it keeps repeating those 400 steps continuously, and I can’t figure out how to stop it after that. Could you help me add something to this function to stop it?

Original message (Croatian)

Hvala puno!

nego problem je sto on ponavlja tih 400 koraka sad cijelo vrijeme,a nikako da skuzim kako da ga zaustavim nakon toga,bi li vam bio problem napisati sto jos moram dodati na ovu funkciju?

HVALA!

Soldered Support:

It depends on what you want to do after. For example, you can call the step function in void setup instead of loop (void setup only runs once, void loop runs continuously).

Or, create a new function within loop that executes the function only once, for example:

int dir = 7; // dir pin = D7
int stepper = 6; // stepper pin = D6
boolean boolStop = false;

void setup() {
  pinMode(dir, OUTPUT);
  pinMode(stepper, OUTPUT);
}

//funkcija koja pokreće stepper
void step(boolean smjer,int brojKoraka){
  digitalWrite(dir,smjer);
  delay(50);
  for(int i=0;i<brojKoraka;i++){
    digitalWrite(stepper, HIGH);
    delayMicroseconds(100); //ovaj delay ne diraj
    digitalWrite(stepper, LOW);
    delayMicroseconds(100);
  }
}

void loop(){
  if(boolStop == false){
    step(true, 200);
    //now change bool to true so the condition above won't execute again
    boolStop = true;
  }
}
Original message (Croatian)

Ovisi što planiraš nakon toga raditi. Npr., možeš pozvati funkciju step u void setup umjetu u loop-u (void setup se izvršava samo jednom, void loop beskonačno).
ili,
napraviti novu funkciju unutar loop-a koji će izvršiti funkciju samo jednom, npr.
int dir = 7; // dir pin = D7

int stepper = 6; // stepper pin = D6

boolean boolStop = false;
void setup() {

pinMode(dir, OUTPUT);

pinMode(stepper, OUTPUT);

}
//funkcija koja pokreće stepper

void step(boolean smjer,int brojKoraka){

digitalWrite(dir,smjer);

delay(50);

for(int i=0;i<brojKoraka;i++){

digitalWrite(stepper, HIGH);

delayMicroseconds(100); //ovaj delay ne diraj

digitalWrite(stepper, LOW);

delayMicroseconds(100);

}

}
void loop(){
if( boolStop == false){

step(t[address removed]); //ili što već žališ

//sada promjeniš bool u true kako se više ne bi izvodio uvjet gore

boolStop = true;

}

}