Arduino Bipolar Stepper Motor Control

This small post shows how to control speed and direction of rotation of bipolar stepper motor using Arduino UNO board and L293D motor driver chip.
The stepper motor used in this example is just a PC CD-ROM (or DVD-ROM) drive which has 4 wires.
Proteus simulation of the example is provided at the end of the topic.

Basically there are two types of stepper motors: bipolar and unipolar. The bipolar stepper motor is a two-phase brushless motor which has two coils (windings), this motor has 4 wires (2 wires for each coil).
The other type is the unipolar stepper motor, it is 4-phase brushless motor which has 5 or 6 wires.

The popular controlling modes of of the stepper motor are: full step and half step. The full step can be divided into 2 types: one-phase and two-phase.

In full step one-phase mode the driver energizes one coil at a time. This type of controlling requires the least amount of power but provides the least torque.

In full step two-phase mode the driver energizes the two coils at the same time. This mode provides the highest torque but it requires twice as much power as one-phase mode.

Half step mode is a combination of the two full step modes (one-phase and two-phase). This mode increases accuracy by dividing each step by 2. it requires power in-between one-phase and two-phase modes, torque also is in-between.

There is another controlling type called microstepping, this type is more accurate than the half step mode, it requires two sinusoidal current sources with 90° shift.

In this example I’m going to use the full step two-phase mode for controlling the bipolar stepper motor.

The following image shows a simple schematic of the bipolar stepper motor:

Bipolar stepper motor windings

To be able to control the bipolar stepper motor, two H-bridge circuits are required. In this example I’m going to use L293D quadruple half-H driver which can work as dual H-bridge driver. This chip is small, low cost and easy to use, these make it a good choice for students and hobbyists, in this blog, I used it in some DC motor control projects.

In the full step control mode always both windings are energized at the same time according to the following two tables where first table shows the driving sequence for one rotation direction and second table for the other direction:

Bipolar stepper motor direction 1

Bipolar stepper motor direction 2

Related Projects:
Arduino Unipolar Stepper Motor Control

Hardware Required:

  • Arduino UNO board
  • Bipolar stepper motor
  • L293D motor driver chip   —-> datasheet
  • 10k ohm potentiometer
  • Pushbutton
  • Power source with voltage equal to motor nominal voltage
  • Bread board
  • Jumper wires

Arduino bipolar stepper motor control hardware circuit

Arduino bipolar stepper motor control circuit:
Example circuit diagram is shown below.

Arduino bipolar stepper motor control circuit

All grounded terminals are connected together.

The L293D chip has 16 pins with 4 inputs (IN1, IN2, IN3 and IN4) and 4 outputs (OUT1, OUT2, OUT3 and OUT4). The 4 outputs are connected to the bipolar stepper motor as shown in the circuit diagram.

The 4 inputs are connected as follows:
IN1 to Arduino pin 8
IN2 to Arduino pin 9
IN3 to Arduino pin 10
IN4 to Arduino pin 11

The L293D has 2 VCC pins: VCC1 (pin #16) and VCC2 (pin #8). VCC1 is connected to Arduino +5V pin. VCC2 is connected to another power source (positive terminal) with voltage equal to motor nominal voltage, it’s labeled in the circuit diagram as V_Motor (V_Motor = motor voltage). So if we have a stepper motor with nominal voltage of 5V we’ve to connect VCC2 to +5V (Arduino 5V output shouldn’t be used) and if the stepper motor nominal voltage is 12V we’ve to connect VCC2 to +12V (negative terminal of this source is connected to circuit ground)…

The 10k ohm potentiometer is used to control the speed of the stepper motor, its output pin is connected to Arduino analog pin 0.

The push button which is connected to Arduino pin 4 is used to change the rotation direction of the stepper motor.

Arduino bipolar stepper motor control code:
In this example I used Arduino stepper motor library (built-in) which simplifies the code, it is included in the code using the following line:

The stepper motor which I used in this project has 20 steps per one revolution, it is defined in the code as shown below:

and the connection of the control lines of the stepper motor are defined as:

Using the function stepper.step(direction_) the stepper motor moves according to the variable direction_, in this example this variable may be 1 or -1. If direction_ = 1 the motor will move in the first direction and if direction_ = -1 the motor will move in the other direction.

When ever the pushbutton is pressed, the variable direction_ will be inverted (1 or -1).

Rest of code is described through comments.

The following video shows a simple hardware circuit of the project:

and this video shows Proteus simulation

Arduino + stepper motor Proteus simulation:
Simulation file download link is below.
Arduino + Bipolar stepper motor


  1. Hi, could you send me the file of protues simulation for Arduino + Bipolar stepper motor please? i cant download it.

  2. not working
    ISIS Release 8.09.00 (Build 27865) (C) Labcenter Electronics 1990- 2019.
    Compiling design ‘C:\Users\DELL\Desktop\Arduino + Bipolar stepper motor.pdsprj’.
    Netlist compilation completed OK.
    Netlist linking completed OK.
    Partition analysis completed OK.
    Simulating partition 1
    PROSPICE 8.08.00 (Build 27367) (C) Labcenter Electronics 1993-2019.
    mixed model AVR2.DLL failed to authorize – Missing or invalid Customer Key.. [AU1]
    Loaded netlist ‘C:\Users\DELL\AppData\Local\Temp\LISA9501.SDF’ for design ‘Arduino + Bipolar stepper motor.pdsprj’
    Real Time Simulation failed to start.
    Simulation FAILED due to fatal simulator errors.

    this much error is coming

  3. where do you get the arduino’s library for proteus?

    i’m using different library, but can’t running like simulation in your videos.

    could you help me, please!

  4. Hey. Thanks for this!
    1. Is there a way I could replace the direction button with Number of steps the stepper motor moves before reversing its direction?
    2. Plus how can I remove the loop?

    I am stuck on this in my FYP with a deadline reaching soon. Haven’t used or learned Proteus in my entire degree. Your help will be appreciated

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.