Stepper Motor Control

By Renpeng Zhang

Demoing control of a stepper motor.

Table of Contents

Overview

In this demo, I tested the 28BYJ-48 stepper motor with the ULN2003 stepper motor driver. I used one Arduino for the control of the stepper motor. Since it’s recommended to use an external power source, I just used another Arduino solely for the purpose of providing 5V DC to the motor driver. I was able to control the stepper motor to do rotate clockwise and counter clockwise.

Picture of demo

Arduino Code

Arduino code:

/*

* 28BYJ48 stepper motor code

* Connect:

* IN1>>D8

* IN2>>D9

* IN3>>D10

* IN4>>D11

* Vcc 5V source, prefered external 5V source

* Gnd

*/

 

#define IN1  8

#define IN2  9

#define IN3  10

#define IN4  11

int Steps=0;

boolean Direction=true;// gre

unsigned long last_time;

unsigned long currentMillis;

int steps_left=4095;

long time;

 

void setup() {

 Serial.begin(115200);

 pinMode(IN1, OUTPUT);

 pinMode(IN2, OUTPUT);

 pinMode(IN3, OUTPUT);

 pinMode(IN4, OUTPUT);

 // delay(1000);

}

 

void loop() {

 while(steps_left>0){

currentMillis = micros();

if(currentMillis-last_time>=1000){

  stepper(1);

  time=time+micros()-last_time;

  last_time=micros();

  steps_left–;

}

 }

 Serial.println(time);

 Serial.println(“Wait…!”);

 delay(2000);

 Direction=!Direction;

 steps_left=4095;

}

 

void stepper(int xw){

 for (int x=0;x<xw;x++){

switch(Steps){

  case 0:

    digitalWrite(IN1, LOW);

    digitalWrite(IN2, LOW);

    digitalWrite(IN3, LOW);

    digitalWrite(IN4, HIGH);

  break;

  case 1:

    digitalWrite(IN1, LOW);

    digitalWrite(IN2, LOW);

    digitalWrite(IN3, HIGH);

    digitalWrite(IN4, HIGH);

  break;

  case 2:

    digitalWrite(IN1, LOW);

    digitalWrite(IN2, LOW);

    digitalWrite(IN3, HIGH);

    digitalWrite(IN4, LOW);

  break;

  case 3:

    digitalWrite(IN1, LOW);

    digitalWrite(IN2, HIGH);

    digitalWrite(IN3, HIGH);

    digitalWrite(IN4, LOW);

  break;

  case 4:

    digitalWrite(IN1, LOW);

    digitalWrite(IN2, HIGH);

    digitalWrite(IN3, LOW);

    digitalWrite(IN4, LOW);

  break;

  case 5:

    digitalWrite(IN1, HIGH);

    digitalWrite(IN2, HIGH);

    digitalWrite(IN3, LOW);

    digitalWrite(IN4, LOW);

  break;

  case 6:

    digitalWrite(IN1, HIGH);

    digitalWrite(IN2, LOW);

    digitalWrite(IN3, LOW);

    digitalWrite(IN4, LOW);

  break;

  case 7:

    digitalWrite(IN1, HIGH);

    digitalWrite(IN2, LOW);

    digitalWrite(IN3, LOW);

    digitalWrite(IN4, HIGH);

  break;

  default:

    digitalWrite(IN1, LOW);

    digitalWrite(IN2, LOW);

    digitalWrite(IN3, LOW);

    digitalWrite(IN4, LOW);

  break;

}

SetDirection();

 }

}

 

void SetDirection(){

 if(Direction==1){Steps++;}

 if(Direction==0){Steps–;}

 if(Steps>7){Steps=0;}

 if(Steps<0){Steps=7;}

}

Video

Video