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:

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:

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:

C

1

#include <Stepper.h>

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

C

1

#define STEPS 20

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

C

1

Stepper stepper(STEPS,8,9,10,11);

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.

C

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

/*

* Bipolar stepper motor speed and direction control with Arduino.

* Full step control.

* This is a free software with NO WARRANTY.

* https://simple-circuit.com/

*/

// include Arduino stepper motor library

#include <Stepper.h>

// change this to the number of steps on your motor

#define STEPS 20

// create an instance of the stepper class, specifying

// the number of steps of the motor and the pins it's

// attached to

Stepper stepper(STEPS,8,9,10,11);

constintbutton=4;// direction control button is connected to Arduino pin 4

constintpot=A0;// speed control potentiometer is connected to analog pin 0