Arduino + 28BJY-48 Stepper Motor: Simple and Improved

Introduction: Arduino + 28BJY-48 Stepper Motor: Simple and Improved

I love these tiny 28BJY-48 stepper motors. They cost only a few dollars and have so many uses. They are compatible with Arduino, however the example code I have found online has either been overly complicated, or doesn't work quite right with the motor. I've been using these motors in projects a lot lately, so I thought I should share the solution to some of these functionality problems and my code fix to make the motor work well with the built-in Arduino stepper library.

This code fix makes it super easy to incorporate into your code, while improving the functionality of the motor, running smoother and quieter without getting hot.

Step 1: What You Will Need

You will need the following things:

1x Arduino (You can use any arduino, I'm using an Arduino UNO R3)

1x USB cable (to connect Arduino to the computer)

1x 28BJY-48 Stepper motor (from ebay)

1x ULN2003 driver (usually comes with motor on ebay)

6x Male to female jumper wires

Arduino IDE (can be downloaded from

Step 2: Understanding the ULN2003 Driver Module

The ULN2003 module is used to control the stepper motor. The chip on the board is a ULN2003A darlington array, which is essentially a bunch of transistors in a single package. This module saves us having to wire up NPN transistors individually. The IN pins (1-4) connect to the Arduino Digital pins (8-11). The VCC pin connects to the Arduino's 5V pin, and the GND pin to theArduino's GND pin.

When digital pins D8-11 on the Arduino are written HIGH, the driver allows current to flow through that motor winding.

There is a metal jumer between the <-> pins which connects the motor to 5V. If you remove this jumper, the motor will not have power.

There are also 4 led lights and resistors connected to visualise the steps, but you can only really see this at low speeds.

Step 3: Wiring It Up

The wiring for this project is simple.








Connect the motor to the driver using the supplied connector.

Step 4: Code

The code makes improvement on Michael Schoeffler's tutorial using the ULN2003 driver module and Arduino's built-in stepper library. The problem with the stepper library is that it doesn't write the digital pins LOW after completing the movement. This drains more current, makes a buzzing noise, and causes the motor to heat up rapidly. To stop this, I have included a new function called halt(), which is called immediately after stepper.step()

Before the setup() in the code, a stepper object is define with pins 8,10,9,11. This is not an error, but is rather the correct firing order for the 28BJY-48 motor. This is only a code change, do not change the wiring. Do not change the code back to 8,9,10,11. It will not work properly.

I have also defined an int called 'revolution' as 2038. This is the correct number of steps to complete one revolution of this motor.

You need three functions needed to make the motor move:

stepper.setspeed(); Between the brackets, add a number between 1 and 18. 18 is the maximum speed without a load, but I would recommend a maximum speed of 10, as it is quiet, yet fast.

stepper.step(); Between the brackets, add the number of steps to take, keeping in mind that a full revolution is 2038 steps. For example, to turn 180 degrees, you could use either stepper.step(1019); or stepper.step(revolution/2);
To turn the opposite direction, use a negative number, e.g. stepper.step(-546);

halt(); Call this function after stepper.step() to write all motor pins LOW. Do not put anything between the brackets.

In the main loop() of the code below, we first set the speed to 10, then move forward 2038 steps, then wait 1000 milliseconds, then turn 2038 steps backwards, then wait another 1000 milliseconds, then repeat.


1. Open the Arduino IDE

2. Click FILE > NEW to create new sketch

3. Copy and paste the code below into the sketch.

4. Connect your Arduino to the computer via the USB cable.

5. Click TOOLS > BOARD and select your board. For me, thats 'Arduino/Genuino Uno'

6. Click TOOLS > PORT and select your port. For me, that's 'COM1'. If you are using a Mac you may see different port names to a PC.

7. Click FILE > UPLOAD to upload your code. If all was successful, you should see the message 'Done Uploading' after a few seconds.

8. That's it! The motor should begin running the code straight away.

9. (optional) Remove the USB cable and power Arduino directly from an external power source.

<p>// Original stepper code by (c) Michael Schoeffler 2017,   <a href="" rel="nofollow"></a><br>// Updated stepper code by Joel Tonks,   <a href="" rel="nofollow"></a></p><p>/*-----------------------------
ARDUINO | ULN2003A DRIVER BOARD              // Arduino pin connections
5V      | VCC                                // Jumper must be placed between '<->' pins to enable stepper motor
GND     | GND
pin 8   | IN1  
pin 9   | IN2
pin 10  | IN3
pin 11  | IN4
#include                                     // include stepper library      </p><p>int revolution = 2038;                       // the number of steps in one revolution of your motor (28BYJ-48)</p><p>Stepper stepper(revolution, 8, 10, 9, 11);   // the correct stepping order for your motor (28BYJ-48)</p><p>void setup() {                               // set driver pins as OUTPUT
  pinMode(8, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(11, OUTPUT);
}</p><p>void loop() {      
  stepper.setSpeed(10);        // 18 = max working speed for this motor. 10 is max recommended speed.
  stepper.step(revolution);    // move motor one revolution anti-clockwise (2038 steps)
  halt();                      // call 'halt()' function to write motor pins LOW
  delay(1000);                 // wait one second (optional)
  stepper.setSpeed(10);        // set speed to 5
  stepper.step(-revolution);   // move motor one revolution clockwise (-2038 steps)
}</p><p>void halt() {                  // This writes all motor pins LOW, preventing the motor from drawing current when idle.
  digitalWrite(8, LOW);       
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);

Be the First to Share


    • Teach With Tinkercad Contest

      Teach With Tinkercad Contest
    • Metal Contest

      Metal Contest
    • Microcontroller Contest

      Microcontroller Contest



    2 years ago

    Hello all, the problem I am having with my setup is the stepper wasn't moving at all. It would just hum. I was only running it at 10RPM , then I moved it down to 5 RPM and it started to move. At about half way around it will start to stutter and then stop. I found this page and dropped the steps pre revolution from 2048 to 2038 and it made one complete revolution and started to stutter again on the reverse trip about half way , then stops completely. I just got my Arduino Uno kit a month ago and have been working through the lessons. So this is the first time I have even connected the stepper motor up and ran code for it. please help.
    I was also thinking I could just have gotten a bad motor , not sure.


    3 years ago

    perfect thank you


    3 years ago

    Keep in mind that setting the pins low after movement shuts off current to that winding and now the motor will not have any holding power and can move under an external force.


    Reply 3 years ago

    Yes, thanks for the heads up. There is enough friction in the internal gear ratio to prevent moving under light external forces.

    Penolopy Bulnick
    Penolopy Bulnick

    3 years ago

    Nice! Thanks for sharing how to do this :)