Unipolar Stepper Motor Driver Arduino

Posted on by admin

Learn to drive unipolar stepper motors with a homemade transistor driver and easy Arduino code. A stepper motor is a brushless electric motor that rotates in small equal steps, as opposed to the continuous rotation of regular motors. It has the ability to rotate a predefined number of steps, which makes it useful for precision mechanical devices. Nov 18, 2017  Learn to drive unipolar stepper motors with a homemade transistor driver and easy Arduino code. A stepper motor is a brushless electric motor that rotates in small equal steps, as opposed to the continuous rotation of regular motors. It has the ability to rotate a predefined number of steps, which makes it useful for precision mechanical devices. A simple Stepper Motor Control using Arduino UNO and L293D Motor Driver IC is designed in this project. The working of the project is explained here. The stepper motor used in this project is a Bipolar PMH (Permanent Magnet Hybrid) type Stepper Motor. Since it is a bipolar motor, there are only 4 wires corresponding to the end terminals of two. A unipolar stepper motor follows this diagram: Since the two electromagnets have a common wire, only one power source is necessary for a unipolar stepper motor. The common wire is usually connected to ground. The 28BYJ-48 is a unipolar stepper motor, with five pins as shown: For a unipolar motor, the number of coils is equal to its phase. The push button which is connected to Arduino pin 4 is used to change the rotation direction of the stepper motor. Arduino unipolar stepper motor control code: In this example I used Arduino stepper motor library (built-in) which simplifies the code, it’s included in the code using the following line.

One of the easiest and inexpensive way to control stepper motors is to interface L293D Motor Driver IC with Arduino. It can control both speed and spinning direction of any Unipolar stepper motor like 28BYJ-48 or Bipolar stepper motor like NEMA 17. If you want to. So, here I present Uni polar Stepper library in Arduino for all unipolar type stepper motors having 4 phases. The library has 9 different functions that can be used to rotate and control motor as per the requirements.The library is design as per the industrial motion control requirements. Here are some of the features of this library.

One of the easiest and inexpensive way to control stepper motors is to interface L293D Motor Driver IC with Arduino. It can control both speed and spinning direction of any Unipolar stepper motor like 28BYJ-48 or Bipolar stepper motor like NEMA 17.

If you want to learn the basics of L293D IC, below tutorial is invaluable. Consider reading (at least skimming) through this tutorial first.

Control DC Motors with L293D Motor Driver IC & Arduino
If you are planning on assembling your new robot friend, you will eventually want to learn about controlling DC motors. One of the easiest and..

Controlling a Stepper Motor With an H-Bridge

As L293D IC has two H-Bridges, each H-Bridge will drive one of the electromagnetic coils of a stepper motor.

By energizing these electromagnetic coils in a specific sequence, the shaft of a stepper can be moved forward or backward precisely in small steps.

However, the speed of a motor is determined by the how frequently these coils are energized.

Below image illustrates driving stepper with H-Bridge.

Driving Unipolar Stepper Motor (28BYJ-48)

In our first experiment, we are using 28BYJ-48 unipolar stepper rated at 5V. It offers 48 steps per revolution.

Before we start hooking the motor up with the chip, you will need to determine the A+, A-, B+ and B- wires on the motor you plan to use. The best way to do this is to check the datasheet of the motor. For our motor these are orange, pink, blue and yellow.

Note that we will not be using the common center connection(Red) in this experiment.

The center connection is merely used to energize either the left or right side of the coil, and get the effect of reversing the current flow without having to use a circuit that can reverse the current.

The connections are fairly simple. Start by connecting 5V output on Arduino to the Vcc2 & Vcc1 pins. Connect ground to ground.

Motor

You also need to connect both the ENA & ENB pins to 5V output so the the motor is always enabled.

Now, connect the input pins(IN1, IN2, IN3 and IN4) of the L293D IC to four digital output pins(12, 11, 10 and 9) on Arduino.

Finally, connect the stepper motor’s wires A+ (Orange), A- (Pink), B- (Yellow) and B+ (Blue) to the L293D’s output pins (Out4, Out3, Out2 & Out1) as shown in the illustration below.

Driving Bipolar Stepper Motor (NEMA 17)

In our next experiment, we are using NEMA 17 bipolar stepper rated at 12V. It offers 200 steps per revolution, and can operate at 60 RPM.

Before we start hooking the motor up with the chip, you will need to determine the A+, A-, B+ and B- wires on the motor you plan to use. The best way to do this is to check the datasheet of the motor. For our motor these are red, green, blue and yellow.

The connections are fairly simple. Start by connecting external 12V power supply to the Vcc2 pin and 5V output on Arduino to the Vcc1 pin. Make sure you common all the grounds in the circuit.

You also need to connect both the ENA & ENB pins to 5V output so the the motor is always enabled.

Now, connect the input pins(IN1, IN2, IN3 and IN4) of the L293D IC to four digital output pins(12, 11, 10 and 9) on Arduino.

Finally, connect the A+ (Red), A- (Green), B+ (Blue) and B- (Yellow) wires from the stepper motor to the L293D’s output pins (Out4, Out3, Out2 & Out1) as shown in the illustration below.

Arduino Code – Controlling Stepper Motor

The following sketch will give you complete understanding on how to control a unipolar or bipolar stepper motor with L293D chip and is same for both the motors except stepsPerRevolution parameter.

Change this parameter as per your motor’s specification before trying the sketch out. For example, for NEMA 17 set it to 200 and for 28BYJ-48 set it to 48.

The sketch starts with including Arduino Stepper Library. The stepper library comes packaged with the Arduino IDE and takes care of sequencing the pulses we will be sending to our stepper motor.

After including the library we define a variable named stepsPerRevolution. As the name suggests it’s the number of steps per revolution that our motor is rated at. Change this parameter as per your motor’s specification. For example, for NEMA 17 set it to 200 and for 28BYJ-48 set it to 48.

Listen to and download old Malayalam songs, popular & hit Malayalam evergreen Malayalam music albums on from various artists on Saregama.com. Listen to and download old Malayalam songs, popular & hit Malayalam evergreen Malayalam music albums on from various artists on Saregama.com. Toggle navigation. Malayalam old hit songs download.

Next, we create an instance of the stepper library. It takes the steps per revolution of motor & Arduino pin connections as parameter.

In setup section of code, we set the speed of stepper motor by calling setSpeed() function and initialize the serial communication.

In loop section of code, we simply call step() function which turns the motor a specific number of steps at a speed determined by setSpeed() function. Passing a negative number to this function reverses the spinning direction of motor.

This article includes everything you need to know about controlling a stepper motor with the A4988 stepper motor driver and Arduino. I have included a wiring diagram, a tutorial on how to set the current limit and many example codes.

Although you can use this driver without an Arduino library, I highly recommend you also take a look at the example code for the AccelStepper library at the end of this tutorial. This library is fairly easy to use and can greatly improve the performance of your hardware.

After each example, I break down and explain how the code works, so you should have no problems modifying it to suit your needs.


If you would like to learn more about other stepper motor drivers, then the articles below might be useful:

About the driver

At the heart of the A4988 driver you will find a chip made by Allegro MicroSystems: the A4988 DMOS Microstepping Driver with Translator and Overcurrent Protection. This integrated motor driver makes interfacing with a microcontroller super easy as you only need two pins to control both the speed and the direction of the stepper motor.

The driver has a maximum output capacity of 35 V and ± 2 A which is great for driving small to medium sized stepper motors like a NEMA 17 bipolar stepper motor.

If you need to control larger stepper motors like NEMA 23, take a look at the TB6600 stepper motor driver. This driver can be used with the same code as the A4988 and has a current rating of 3.5 A.

The chip has several safety functions built-in like overcurrent, short circuit, under voltage lockout and over temperature protection. You can find more specifications in the table below.

A4988 Specifications

Minimum operating voltage8 V
Maximum operating voltage35 V
Continuous current per phase1 A
Maximum current per phase2 A
Minimum logic voltage3 V
Maximum logic voltage5.5 V
Microstep resolutionfull, 1/2, 1/4, 1/8 and 1/16
Reverse voltage protection?No
Dimensions15.5 × 20.5 mm (0.6″ × 0.8″)
CostCheck price

For more information you can check out the datasheet here.

Differences between the A4988 and DRV8825

The DRV8825 is quite similar to the A4988 but there are some key differences:

  • The DRV8825 offers 1/32 microstepping, whereas the A4988 only goes down to 1/16-step. Higher microstepping results in smoother, quieter operation but is not always needed.
  • The current limit potentiometer is at a different location
  • The relation between the reference voltage and the current limit is different.
  • The DRV8825 requires a minimum STEP pulse duration of 1.9µs; the A4988 requires 1µs minimum.
  • The DRV8825 can be used with higher voltage motor power supply (45 V vs 35 V). This means it is less susceptible to damage from LC voltage spikes.
  • The DRV8825 can deliver slightly more current than the A4988 without any additional cooling.

Note that the pinout of the DRV8825 is exactly the same as for the A4988, so it can be used as a drop in replacement!

Microstep settings

Stepper motors typically have a step size of 1.8° or 200 steps per revolution, this refers to full steps. A microstepping driver such as the A4988 allows higher resolutions by allowing intermediate step locations. This is achieved by energizing the coils with intermediate current levels.

For instance, driving a motor in quarter-step mode will give the 200-step-per-revolution motor 800 microsteps per revolution by using four different current levels.

The resolution (step size) selector pins (MS1, MS2, and MS3) allow you to select one of the five step resolutions according to the table below.

MS1MS2MS3Microstep resolution
LowLowLowFull step
HighLowLow1/2 step
LowHighLow1/4 step
HighHighLow1/8 step
HighHighHigh1/16 step

All three inputs have internal 100kΩ pull-down resistors, so leaving the three microstep selection pins disconnected results in full-step mode.

I often use a CNC-shield or expansion board in combination with these drivers. The expansion board has 3 dip switches to set MS1 – MS3 high or low and on the CNC-shield you can install jumpers. If you are using the driver with a breadboard, you can just use jumper wires to connect the selector pins to 5V.

Things used in this tutorial:

To follow this tutorial you will need the following components:

Hardware components

Arduino UNO R3If you want to control many stepper motors, you can use an Arduino Mega.x 1
A4988 stepper motor driverx 1
NEMA 17 stepper motorx 1
BreadboardI highly recommend to buy at least 1 good quality breadboard like the BusBoard Prototype Systems BB400 or BB830.x 1
Jumper wires~ 10
USB Type-B cablex 1
100µF capacitorx 1
Power supply (8-35V)x 1

Tools

Arduino Stepper Motor Driver Code

Multimeter
Small screwdriverI like the Wiha PicoFinish.
Alligator test leads(Optional but very handy)

Software

Arduino IDE

Makerguides.com is a participant in the Amazon Services LLC Associates Program, an affiliate advertising program designed to provide a means for sites to earn advertising fees by advertising and linking to products on Amazon.com. Amazon and the Amazon logo are trademarks of Amazon.com, Inc, or its affiliates.

As I mentioned earlier, I like to use this driver in combination with a CNC-shield or expansion board. Such a shield already includes capacitors and offers an easy way to select the microstepping resolution. It makes wiring much easier and is a great option if you need a more permanent solution than a breadboard.

Where to get parts from AliExpress?

I often buy many of the parts for my projects on Aliexpress. I have had many good and some bad experiences while shopping on Aliexpress but I have finally found a store that I can highly recommend.

If you need parts for your projects, check out All goods are freeshipping Store. They offer good quality parts and some fast shipping options. The main thing I like is that you can save a lot of money on shipping by buying multiple items at once and selecting the same shipping method for all the items.

Shipping time varies, for me it is around 10 days when I select AliExpress Standard Shipping (this strongly depends on the country you want to ship to).


Wiring – Connecting A4988 to Arduino and stepper motor


The wiring diagram/schematic above shows you how to connect the A4899 driver to a stepper motor and the Arduino.

The connections are also given in the following table:

A4988 Connections

A4988Connection
VMOT8-35V
GNDMotor ground
SLPRESET
RSTSLP
VDD5V
GNDLogic ground
STPPin 3
DIRPin 2
A1, A2, B1, B2Stepper motor
  • The motor power supply is connected to GND and VMOT (top right).
  • The two coils of the stepper motor are connected to A1, A2 and B1, B2 (see below).
  • The GND pin (lower right) is connected to the ground pin of the microcontroller and VDD is connected to 5V.
  • The STP (step) and DIR (direction) pin are connected to digital pin 3 and 2 respectively. You can choose a different digital pin if you want, but these are the ones I used for this tutorial and the example code.
  • The SLP pin is an active low input. Meaning, pulling this pin low puts the driver in sleep mode, minimizing the power consumption. RST is also an active low input. When pulled low, all STEP inputs are ignored until you pull it high. If you are not using the pin, you can connect it to the adjacent SLP/SLEEP pin to bring it high and enable the driver.
  • The EN (enable) pin can be left disconnected, it is pulled low by default. When this pin is set high the driver is disabled.

In the rest of this tutorial I have left MS1, MS2 and MS3 disconnected, so the driver operates in full step mode. This makes explaining the code a bit easier. Normally I would use 1/8 or 1/16 microstepping and connect the appropriate pins to 5V (see table in introduction).

Warning

The A4988 carrier board uses low-ESR ceramic capacitor, which makes it susceptible to destructive LC voltage spikes, especially when using power leads longer than a few inches.

To protect the driver you can connect an electrolytic capacitor between VMOT and GND. Pololu suggests a capacitor of 47µF or more (I used a 100 µF capacitor). I like these assortment boxes from Amazon, this way I always have some capacitors of the right size on hand.

How to determine the correct stepper motor wiring?

If you can’t find the datasheet of your stepper motor, it can be difficult to figure out how to wire your motor correctly. I use the following trick to determine how to connect 4 wire bipolar stepper motors:

The only thing you need to identify is the two pairs of wires which are connected to the two coils of the motor. The wires from one coil get connected to 1A and 1B and the other to 2A and 2B, the polarity doesn’t matter.

To find the two wires from one coil, do the following with the motor disconnected:

  1. Try to spin the shaft of the stepper motor by hand and notice how hard it is to turn.
  2. Now pick a random pair of wires from the motor and touch the bare ends together.
  3. Next, try to spin the shaft of the stepper motor again.

If you feel a lot of resistance, you have found a pair of wires from the same coil. If you can spin the shaft freely, try another pair of wires. Now connect the two coils to the pins shown in the wiring diagram above.

(If it is still unclear, please leave a comment below, more info can also be found on the RepRap.org wiki)

How to set the current limit?

Before you start programming your Arduino and start using the driver there is one very important thing you need to do that a lot of people forget: set the current limit!

This step is not very complicated but absolutely necessary to protect your stepper motor and the driver. If you do not set an appropriate current limit, your motor can draw more current than it or your driver can handle, this is likely to damage one or both of them.

To set the current limit you need to measure a reference voltage and adjust the on-board potentiometer accordingly. You will need a small screwdriver, a multimeter to measure the reference voltage and alligator test leads (optional but very handy).

To measure the reference voltage, the driver needs to be powered. The A4988 only needs power via VDD (5V) and you need to connect RST and SLP together, otherwise the driver won’t turn on. It’s best to disconnect the stepper motor while you do this.

If you have already wired up the driver, you can leave everything but the stepper motor connected. You can apply power through the USB port of the Arduino.

Required connections to set the current limit
A4988Connection
VDD5V
RSTSLP
SLPRESET
GNDGround

Current limit formula

The next step is to calculate the current limit with the following formula:

Current Limit = Vref ÷ (8 × Rcs)

The Rcs is the current sense resistance. If you bought a A4988 driver from Pololu before January 2017, the Rcs will be 0.050 Ω. Drivers sold after that have 0.068 Ω current sense resistors.

So this means that for a current limit of 1A for a board with 0.068 Ω current sense resistors, the Vref should be 540 mV.

To select the right current limit, take a look at the datasheet of your stepper motor. If you can’t find the current rating of your motor, I recommend starting with a current limit of 1A. You can always increase it later if your motor/driver is missing steps.

Bonus info: When using the driver in full-step mode, the current through each coil is limited to approximately 70% of the set current limit. This means that you would need to set the current limit 40% higher or 1.4 A in full-step mode. When using microstepping, the formula above applies.

Note that you need to re-calibrate the current limit if you change the motor power supply voltage. If your motor is making a lot of noise, try to lower the current limit. It’s best to set the current limit just high enough so the motor doesn’t miss steps.

Measuring Vref

Now you will need to measure the reference voltage (Vref) between the two points marked on the picture below (GND and the potentiometer) and adjust it to the value you calculated.

I recommend using alligator test leads clamped to the screwdriver to set the current limit. This allows you to adjust the potentiometer and measure the reference voltage at the same time.

Note: There is another way to measure the current limit and that is to directly measure the current draw of the stepper motor. Personally I find the above method a lot easier.

Pololu mentions the following on their website:

“Note: The coil current can be very different from the power supply current, so you should not use the current measured at the power supply to set the current limit. The appropriate place to put your current meter is in series with one of your stepper motor coils.”

Current limit FAQ

Do I need to have the stepper motor connected or not?
No, you don’t need to connect te stepper motor to the driver when setting the current limit. To be on the safe side, disconnect your motor, it sometimes interferes with measuring the Vref voltage.

Do I need to turn the motor by running the Arduino motor sketch?
No, see question above.

Do I need to turn the potentiometer clock- or counterclockwise to raise Vref?
This depends on the manufacturer of the driver. If you have genuine Polulu breakout boards of the DRV8825 or A4988 you turn the potentiometer clockwise to raise Vref and counterclockwise to lower it.


Cooling the driver

The A4988 driver IC has a maximum current rating of 2 A per coil, but without a heat sink it can only supply about 1 A per coil before it starts to overheat.

The driver usually comes with a small adhesive-backed heat sink, which I recommend you to install right away. You can also buy a bunch of small heat sinks from Amazon for really cheap.

Basic Arduino example code to control a stepper motor

Now that you have wired up the driver and set the current limit, it is time to connect the Arduino to the computer and upload some code. You can upload the following example code to your Arduino using the Arduino IDE. For this specific example you do not need to install any libraries.

This sketch controls both the speed, the number of revolutions and the spinning direction of the stepper motor.

You can open the code in a new window by clicking on the button in the top right corner.

How the code works:

The sketch starts with defining the step and direction pins. I connected them to Arduino pin 3 and 2.

The statement #define is used to give a name to a constant value. The compiler will replace any references to this constant with the defined value when the the program is compiled. So everywhere you mention dirPin, the compiler will replace it with the value 2 when the program is compiled.

I also defined a stepsPerRevolution constant. Because I set the driver to full step mode I set it to 200 steps per revolution. Change this value if your setup is different.

In the setup() section of the code, all the motor control pins are declared as digital OUTPUT with the function pinMode().

In the loop() section of the code, we let the motor spin one revolution slowly in the CW direction and one revolution quickly in the CCW direction. Next we let the motor spin 5 revolutions in each directions with a high speed. So how do you control the speed, spinning direction and number of revolutions?

Control spinning direction:

To control the spinning direction of the stepper motor we set the DIR (direction) pin either HIGH or LOW. For this we use the function digitalWrite(). Depending on how you connected the stepper motor, setting the DIR pin high will let the motor turn CW or CCW.

Control number of steps or revolutions:

In this example sketch, the for loops control the number of steps the stepper motor will take. The code within the for loop results in 1 step of the stepper motor. Because the code in the loop is executed 200 times (stepsPerRevolution), this results in 1 revolution. In the last two loops, the code within the for loop is executed 1000 times, which results in 1000 steps or 5 revolutions.

Note that you can change the second term in the for loop to whatever number of steps you want. for(int i = 0; i < 100; i++) would result in 100 steps, or half a revolution.

Control speed:

The speed of the stepper motor is determined by the frequency of the pulses we send to the STEP pin. The higher the frequency, the faster the motor runs. You can control the frequency of the pulses by changing delayMicroseconds() in the code. The shorter the delay, the higher the frequency, the faster the motor runs.


AccelStepper library tutorial

The AccelStepper library written by Mike McCauley is an awesome library to use for your project. One of the advantages is that it supports acceleration and deceleration, but it has a lot of other nice functions too.

You can download the latest version of this library here or click the button below.

Unipolar Stepper Motor Driver Arduino Connection

You can install the library by going to Sketch > Include Library > Add .ZIP Library… in the Arduino IDE.

Another option is to navigate to Tools > Manage Libraries… or type Ctrl + Shift + I on Windows. The Library Manager will open and update the list of installed libraries.

You can search for ‘accelstepper’ and look for the library by Mike McCauley. Select the latest version and then click Install.

1. Continuous rotation example code

The following sketch can be used to run one or more stepper motors continuously at a constant speed. (No acceleration or deceleration is used).

How the code works:

The first step is to include the library with #include <AccelStepper.h>.

The next step is to define the A4988 to Arduino connections and the motor interface type. The motorinterface type must be set to 1 when using a step and direction driver. You can find the other interface types here.

The statement #define is used to give a name to a constant value. The compiler will replace any references to this constant with the defined value when the the program is compiled. So everywhere you mention dirPin, the compiler will replace it with the value 2 when the program is compiled.

Next, you need to create a new instance of the AccelStepper class with the appropriate motor interface type and connections.

In this case I called the stepper motor ‘stepper’ but you can use other names as well, like ‘z_motor’ or ‘liftmotor’ etc. AccelStepper liftmotor = AccelStepper(motorInterfaceType, stepPin, dirPin);. The name that you give to the stepper motor will be used later to set the speed, position and acceleration for that particular motor. You can create multiple instances of the AccelStepper class with different names and pins. This allows you to easily control 2 or more stepper motors at the same time.

In the setup() section of the code we define the maximum speed in steps/second. Speeds of more than 1000 steps per second can be unreliable, so I set this as the maximum. Note that I specify the name of the stepper motor (‘stepper’), for which I want to define the maximum speed. If you have multiple stepper motors connected, you can specify a different speed for each motor:

In the loop() we first set the speed that we want the motor to run at. For this we use the function setSpeed(). (you can also place this in the setup section of the code).

stepper.runSpeed() polls the motor and when a step is due, executes 1 step. This depends on the set speed and the time since the last step. If you want to change the direction of the motor, you can set a negative speed: stepper.setSpeed(-400); turns the motor the other way.


2. Example code to control number of steps or revolutions

To let the motor rotate a specific number of steps I prefer to use a while loop in combination with stepper.currentPosition(). You can use the following example code, to let the motor run back and forth.

Code explanation:

The first part of the code up to the loop() section is exactly the same as in the previous example.

In the loop I make use of a while loop in combination with the currentPosition() function. First, I set the current position of the stepper motor to zero with stepper.setCurrentPosition(0).

Next we make use of the while loop. A while loop will loop continuously, and infinitely, until the expression inside the parenthesis, () becomes false. So in this case I check if the current position of the stepper motor is not equal to 400 steps (!= means: is not equal to). While this is not the case, we run the stepper motor at a constant speed as set by setSpeed().

In the rest of the loop, we do exactly the same, just with a different speed and target position.

3. Acceleration and deceleration example code

With the following sketch you can add acceleration and deceleration to the movements of the stepper motor, without any complicated coding. In the following example, the motor will run back and forth with a speed of 200 steps per second and an acceleration of 30 steps per second per second.

Code explanation:

In the setup(), besides the maximum speed, we need to define the acceleration/deceleration. For this we use the function setAcceleration().

In the loop section of the code, I used a different way to let the motor rotate a predefined number of steps. The function stepper.moveTo() is used to set the target position. The function stepper.runToPostion() moves the motor (with acceleration/deceleration) to the target position and blocks until it is at the target position. Because this function is blocking, you shouldn’t use this when you need to control other things at the same time.


Driver

Conclusion

In this article I have shown you how to control a stepper motor with the A4988 stepper motor driver and Arduino. I hope you found it useful and informative. If you did, please share it with a friend who also likes electronics and making things!

I have personally used this driver a lot for a bunch of 3D printers and other CNC related projects but I would love to know what projects you plan on building (or have already built) with this driver. If you have any questions, suggestions or if you think that things are missing in this tutorial, please leave a comment down below.

Note that comments are held for moderation in order to prevent spam.

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Unipolar Stepper Motor Driver Arduino Sketch

Beginner