The 28BYJ-48 is a 5V unipolar stepper motor that dominates the hobbyist space for low-cost, high-precision positioning. Priced between $2 and $5, it is the default choice for Arduino-driven pan-tilt camera mounts, automated blinds, and small robotic arms. However, its internal 64:1 gear reduction and unipolar coil architecture demand specific driving logic and power management. If you treat it like a standard DC motor or a high-torque NEMA 17, you will end up with a stalled, overheating component. This guide covers the exact load calculations, the required ULN2003 driver topology, and the failure signatures you need to recognize on the bench.

Is the 28BYJ-48 the Right Motor for Your Load?

Before wiring up your Arduino, you must verify that the 28BYJ-48 fits your mechanical profile. It excels at low-speed, high-precision holding, but it is not a high-speed or high-torque solution. Below is a comparison of common hobby motors to contextualize where the 28BYJ-48 sits.

Motor Type Holding Torque (Typical) Control Needs Cost (2026) Best Use Case
28BYJ-48 Stepper ~1.5 kg·cm (geared output) Unipolar driver (ULN2003), step sequencing $2 - $5 Pan-tilt mounts, blind actuators, slow conveyors
SG90 Micro Servo ~1.8 kg·cm PWM signal (50Hz), internal potentiometer $3 - $6 RC steering, robot grippers, fast 180° sweeps
NEMA 17 Stepper ~4.0 kg·cm (40 N·cm) Bipolar driver (A4988/DRV8825), high current $12 - $25 3D printers, CNC routers, high-load linear actuators
TT Brushed DC Gearmotor ~0.8 kg·cm H-Bridge (L298N) for direction/speed $2 - $4 Differential drive robot chassis, continuous rotation

Sizing Rule of Thumb and Worked Load Example

The golden rule for stepper sizing is to calculate your required holding torque and multiply it by a 2.0 safety factor to account for friction, acceleration inertia, and voltage sag.

Worked Example: You are building an automated window blind actuator. The blind pull-cord spool has a radius of 4 cm (0.04 m), and the total weight of the blinds is 150 grams (0.15 kg).

  1. Calculate Force: 0.15 kg × 9.81 m/s² = 1.47 Newtons.
  2. Calculate Required Torque: 1.47 N × 0.04 m = 0.0588 N·m.
  3. Convert to kg·cm: (0.0588 N·m / 9.81) × 100 = 0.6 kg·cm.
  4. Apply Safety Factor: 0.6 kg·cm × 2.0 = 1.2 kg·cm required.

The 28BYJ-48 outputs approximately 1.5 kg·cm at the geared shaft. Because 1.5 > 1.2, this motor is correctly sized for the load.

Wiring, Pinout, and the ULN2003 Driver

The 28BYJ-48 is a 5-wire unipolar stepper. Arduino GPIO pins can only source about 20mA safely, while each coil phase of the 28BYJ-48 draws roughly 160mA. Connecting it directly to an Arduino will instantly fry the microcontroller's ATmega328P chip. You must use a driver, and the standard for this motor is the ULN2003A Darlington transistor array.

Terminal Identification

The motor terminates in a standard 5-pin JST connector. Here is the exact pinout and coil mapping:

Wire Color Pin Number Function / Coil ULN2003 Board Input
Orange 1 Coil B2 (Phase 4) IN4
Yellow 2 Coil B1 (Phase 3) IN3
Pink 3 Coil A2 (Phase 2) IN2
Blue 4 Coil A1 (Phase 1) IN1
Red 5 VCC (Common Center Taps) VCC / 5V Source

Powering the Driver: Never power the ULN2003 VCC pin directly from the Arduino's 5V output if you are moving any meaningful load. The Arduino's onboard linear regulator will overheat and trigger thermal shutdown. Instead, feed the ULN2003 board from an external 5V 2A power supply, and ensure the external supply's Ground (GND) is tied to the Arduino's GND to establish a common logic reference.

Failure Signatures: Diagnosing Stalls, Overheating, and Hum

When a 28BYJ-48 system fails, it rarely fails silently. The mechanical and electrical symptoms point directly to the root cause.

  • The 'Hum' or Vibration Without Movement: This almost always indicates an incorrect step sequence or an excessive step rate. The 28BYJ-48 has a low pull-in frequency. If you command it to jump from 0 RPM to 15 RPM instantly, it will stall and hum. Use the AccelStepper library to implement a ramp-up acceleration curve, rather than the basic Arduino Stepper library which lacks acceleration profiling.
  • Overheating (Too hot to touch): Unipolar steppers draw continuous current through the coils to maintain holding torque. If your code leaves the IN1-IN4 pins HIGH (or in a holding state) while the mechanism is idle, the motor will rapidly heat up to 60°C+. Fix: Write a function that sets all four driver pins to LOW when the motor reaches its target position, cutting power to the coils during idle periods.
  • Stalling and Skipping Steps: If the motor moves erratically or stops mid-rotation under load, you have exceeded the ~1.5 kg·cm torque limit, or your 5V supply is browning out. Measure the voltage at the ULN2003 VCC pins with a multimeter while the motor is under load. If it drops below 4.5V, your power supply is insufficient, or your jumper wires are too thin (use minimum 22 AWG for the power lines).

Frequently Asked Questions

Can I run two 28BYJ-48 stepper motors on one Arduino Uno?

Yes, but you need two separate ULN2003 driver boards. The Arduino Uno has enough digital I/O pins to handle the 8 control inputs (4 per motor). The critical constraint is power: two 28BYJ-48 motors drawing maximum current simultaneously will pull over 600mA. You must use an external 5V power supply rated for at least 1.5A to 2A to prevent voltage sag and microcontroller resets.

Why is my 28BYJ-48 getting hot to the touch?

Heat is generated by the constant current flowing through the coils to maintain holding torque when the motor is stationary. If your application does not require the motor to resist external forces when idle, modify your Arduino code to set all four ULN2003 input pins to LOW immediately after the runToNewPosition() or movement loop completes. This cuts the current and allows the motor to cool.

What is the exact step angle and gear ratio of the 28BYJ-48?

This is a common trap for makers. The datasheet often claims a 64:1 gear ratio, which would result in exactly 4096 half-steps per revolution. However, the actual physical gear ratio is 63.68395:1. Consequently, one full output shaft revolution requires exactly 4076 half-steps (or 2038 full steps). If you are coding a continuous rotation mechanism, using 4096 will introduce a cumulative positional drift over time.

Can I use an A4988 or DRV8825 driver with the 28BYJ-48?

Out of the box, no. The A4988 and DRV8825 are designed for 4-wire bipolar steppers, while the 28BYJ-48 is a 5-wire unipolar motor with internal center taps. However, you can convert the 28BYJ-48 to bipolar by opening the plastic rear cap and carefully cutting the copper trace that connects the red center-tap wire to the coil commons. Once modified, you can ignore the red wire and drive it with an A4988, which will actually yield slightly higher torque due to full-coil utilization. For beginners, sticking to the ULN2003 is highly recommended.