The 28BYJ-48 stepper motor is the undisputed king of low-cost, low-torque precision movement in the hobbyist and prototyping space. Priced between $1.50 and $3.00 per unit, this 5V unipolar stepper with an integrated gear reduction is the default choice for automated blinds, camera sliders, and lightweight robotics. However, its ubiquity often masks its mechanical quirks—most notably, a gear ratio that is not exactly 64:1 and a thermal profile that will cook the motor if left energized at idle.

If you are designing a system that requires precise angular positioning without the cost of a closed-loop servo, the 28BYJ-48 is likely your starting point. This guide breaks down the exact specifications, how to properly wire it to a ULN2003 driver, how to calculate if it can actually lift your specific load, and how to diagnose the three most common failure modes on the bench.

The 28BYJ-48 Spec Sheet and Motor Type Comparison

Before wiring anything, you need to understand the physical limits of the 28BYJ-48. The most critical detail often missed in beginner tutorials is the actual gear reduction ratio. While widely assumed to be exactly 64:1, the physical gear train yields a ratio of 63.68395:1. This means a full 360-degree rotation requires roughly 2038 steps, not the 2048 steps hardcoded into many basic libraries. Over a single rotation, this 0.17-degree error is invisible; over 100 rotations, it results in 17 degrees of cumulative positional drift.

28BYJ-48 Stepper Motor Core Specifications (5V Operation)
Parameter Value / Rating Notes & Bench Realities
Nominal Voltage 5.0V DC Can be driven at 12V for higher torque if center-tap is isolated, but risks overheating.
Phase Current ~160mA to 300mA Depends on stepping mode (full vs. half-step) and exact manufacturer winding resistance.
Gear Reduction Ratio 63.68395 : 1 Often misquoted as 64:1. Causes cumulative drift in continuous-rotation applications.
Steps per Revolution 2038 (Actual) / 2048 (Nominal) Based on a 32-step internal motor multiplied by the gear train. Use half-stepping for smoothness.
Holding Torque (Output Shaft) ~500 to 800 g·cm (0.05 - 0.08 N·m) Varies by manufacturer. Assume 500 g·cm for conservative load sizing.
Maximum Pull-in Speed ~15 RPM (at 5V) Exceeding this without an acceleration ramp will cause immediate stalling.

To determine if the 28BYJ-48 is the right actuator for your project, you must compare it against the alternatives. Steppers, servos, and DC gearmotors solve fundamentally different mechanical problems.

Actuator Selection: Which Motor Type Fits Your Load Profile?
Motor Type Torque Curve Profile Control Needs & Feedback Typical Cost & Best Use Case
28BYJ-48 Stepper High holding torque at zero speed; drops sharply as RPM increases. Open-loop step/direction pulses. No positional feedback. $2 - $4. Slow, precise angular positioning (e.g., dial indicators, small valves).
NEMA 17 Stepper High torque across a wider RPM band; requires current chopping. Requires a chopper driver (A4988/TMC2209). Open-loop. $12 - $20. 3D printers, CNC routers, high-load linear actuators.
SG90 Micro Servo Peak torque only at specific angles; weak holding torque. Closed-loop PWM. Internal potentiometer limits rotation to 180°. $2 - $5. RC linkages, lightweight pan/tilt cameras, quick angular sweeps.
12V DC Gearmotor Constant torque across operating range; high speed capability. Requires H-bridge for direction. Needs external encoder for positioning. $8 - $15. Drive wheels, conveyor belts, continuous high-speed rotation.

Wiring, Terminal Identification, and the ULN2003 Driver

The 28BYJ-48 is a unipolar stepper motor. Inside the casing, there are two center-tapped coils. The center taps are tied together and brought out to a single wire, which is why the motor has a 5-pin JST connector instead of the 4 pins you would see on a bipolar motor like a NEMA 17.

Wiring Identification Rule: Never assume wire colors follow a universal standard across all manufacturers, but the most common 28BYJ-48 pinout is:
Pin 1 (Red): VCC (Common center tap). Connects to 5V power.
Pin 2 (Pink): Coil 1A
Pin 3 (Yellow): Coil 2A
Pin 4 (Orange): Coil 1B
Pin 5 (Blue): Coil 2B

Because the motor draws up to 300mA per phase, you cannot drive it directly from an Arduino or ESP32 GPIO pin, which are typically limited to 20mA to 40mA. You need a driver. The standard companion is the ULN2003 driver board.

The ULN2003 is an array of seven Darlington transistor pairs. It acts as a current sink, not a source. When your microcontroller sends a 5V logic HIGH signal to the IN1-IN4 pins on the driver board, the corresponding ULN2003 output transistor pulls the motor coil wire to ground, completing the circuit from the 5V VCC line, through the motor coil, and down to ground. According to the Texas Instruments ULN2003A datasheet, each Darlington pair can sink up to 500mA, making it perfectly sized for the 28BYJ-48's current demands.

Why not use an A4988 or DRV8825? Those are bipolar chopper drivers designed for H-bridge current reversal. Because the 28BYJ-48's center taps are internally joined and only 5 wires are exposed, you cannot use standard bipolar drivers without physically opening the motor casing, cutting the internal trace, and converting it to a 6-wire bipolar configuration—a destructive modification rarely worth the effort for a $2 motor.

Sizing Rule of Thumb: Worked Load Example

The most common mistake makers make with the 28BYJ-48 is treating its holding torque as its dynamic lifting capacity. The sizing rule of thumb for unipolar steppers in continuous dynamic applications is to never exceed 60% of the rated holding torque. This provides a safety margin to overcome static friction, cogging, and inertial loads during acceleration.

Assuming a conservative output shaft holding torque of 500 g·cm (0.049 N·m), your maximum safe dynamic torque limit is 300 g·cm (0.029 N·m).

Worked Load Example: Motorized Window Blind Spool

Let's calculate if the 28BYJ-48 can lift a lightweight blackout blind using a 3D-printed spool.

  • Load Mass: 120 grams (0.12 kg)
  • Spool Radius: 1.5 cm (0.015 m)
  • Gravity (g): 9.8 m/s²

Step 1: Calculate the Force (Weight) of the load.
Force = Mass × Gravity
Force = 0.12 kg × 9.8 m/s² = 1.176 Newtons (N)

Step 2: Calculate the Required Torque.
Torque = Force × Radius
Torque = 1.176 N × 0.015 m = 0.0176 N·m (or ~179 g·cm)

Step 3: Compare against the Safe Dynamic Limit.
Required Torque (0.0176 N·m) is well below the Safe Dynamic Limit (0.029 N·m).
Verdict: The 28BYJ-48 will lift this load reliably, operating at roughly 60% of its safe dynamic capacity, leaving enough overhead to handle the initial static friction of the blind mechanism.

If your spool radius was 3.0 cm instead of 1.5 cm, the required torque would double to 0.035 N·m. This exceeds the 60% safety margin, and the motor would likely stall on startup. To fix this, you would either need to reduce the spool radius, add a secondary gear reduction, or upgrade to a NEMA 17.

Failure Signatures: Diagnosing Hums, Heat, and Stalls

When a 28BYJ-48 system fails on the bench, it rarely fails silently. The motor will communicate its distress through specific physical signatures. Here is how to diagnose the three most common issues using the Arduino Stepper library as a baseline reference.

1. The "Hum and Vibrate" (No Rotation)

Symptom: The motor shaft vibrates aggressively and emits a low humming noise, but does not rotate. The ULN2003 LEDs might flicker erratically.
Root Cause: Power supply voltage sag or step rate exceeding the pull-in torque limit.
The Fix: First, measure the VCC line at the ULN2003 board with a multimeter while the motor is commanded to move. If you are powering the driver from an Arduino's onboard 5V regulator (which is often fed by a USB port), the voltage will likely sag below 4.5V under the 300mA load. The Arduino's brownout detector may trigger, or the motor simply loses torque. Solution: Power the ULN2003 VCC and GND directly from a dedicated 5V 2A bench supply or buck converter, sharing only the GND with the microcontroller. Second, ensure your code initializes the speed at 1 to 2 RPM before attempting higher speeds.

2. The "Hot to the Touch" (Overheating at Idle)

Symptom: The motor casing reaches 50°C–60°C and is uncomfortable to hold, even when the shaft is not moving.
Root Cause: Continuous coil energization. The ULN2003 holds the last energized state to maintain holding torque. In a 28BYJ-48, this continuous current flow generates significant heat because the motor lacks the thermal mass of larger steppers.
The Fix: If your application does not require holding torque when idle (e.g., a valve that only needs to be open or closed, but doesn't need to resist back-pressure), you must de-energize the coils in software. Write all four control pins (IN1-IN4) to LOW immediately after the movement sequence completes. This drops the current draw to zero and allows the motor to cool.

3. The "Missed Step" Stall (Positional Drift)

Symptom: The motor moves, but falls short of the commanded distance, or skips erratically during direction changes.
Root Cause: Inertia mismatch. The 28BYJ-48 has a high rotor inertia relative to its torque. If you command it to instantly jump from 0 RPM to 10 RPM, the magnetic field rotates faster than the physical mass can accelerate, causing the rotor to "slip" a pole and stall.
The Fix: Implement a software acceleration ramp. Do not use a simple stepper.setSpeed(10) followed immediately by stepper.step(2048). Instead, use a library like AccelStepper which calculates trapezoidal velocity profiles, gently ramping the step frequency up and down to keep the physical rotor synchronized with the stator's magnetic field.