The ULN2003 stepper motor driver board is the default, low-cost choice for driving 5V unipolar stepper motors—most notably the ubiquitous 28BYJ-48—in low-torque, high-precision positioning tasks. If your application requires exact angular movement under 0.34 kg-cm of holding torque and operates at low speeds, this $1.50 to $3.00 board is the right tool. However, because it relies on a simple Darlington transistor array rather than a modern chopper circuit, it lacks the dynamic torque, speed, and thermal management needed for heavier loads. Understanding exactly where the ULN2003 fits in the broader motor ecosystem prevents the most common beginner mistake: trying to push a unipolar stepper beyond its physical limits.
Motor Type Comparison: Where the ULN2003 Fits
Before wiring up your microcontroller, you must match the motor type to your load profile. Steppers and servos are not interchangeable; a stepper excels at holding a static position and moving in precise fractional increments, while a servo relies on a potentiometer for closed-loop feedback over a limited arc. The table below breaks down the four most common motion profiles in embedded DIY projects, highlighting why you would choose a unipolar stepper over the alternatives.
| Motor Type | Typical Driver | Torque Curve & Characteristics | Control Needs | Avg Cost (2026) |
|---|---|---|---|---|
| Unipolar Stepper (e.g., 28BYJ-48) | ULN2003 Board | Flat holding torque at low RPM; drops sharply above 100 RPM. High precision, zero backlash with gears. | 4 GPIO pins; requires software sequencing (wave, full, or half-step). | $2.00 - $3.50 (Motor + Driver) |
| Bipolar Stepper (e.g., NEMA 17) | A4988 / TMC2209 | High holding torque; sustains torque into mid-range RPM via current chopping. Ideal for CNC/3D printers. | 2 GPIO pins (Step/Dir); hardware chopper handles microstepping. | $18.00 - $28.00 (Motor + Driver) |
| Brushed DC Motor | L298N / TB6612FNG | Zero holding torque; high RPM; linear speed curve. Requires encoders for positioning. | 2 GPIO pins for direction + 1 PWM pin for speed control. | $6.00 - $14.00 (Motor + Driver) |
| RC Servo (e.g., MG996R) | Direct Microcontroller PWM | High dynamic torque; limited to 180° or 270° arc. Closed-loop via internal potentiometer. | 1 GPIO pin (50Hz PWM signal); no driver board required. | $8.00 - $18.00 (Servo only) |
Sizing Rule of Thumb and Worked Load Example
The most frequent cause of project failure with the ULN2003 is underestimating the dynamic load. Stepper motors suffer from a severe drop in pull-in torque (the torque available to accelerate a load from a standstill) compared to their static holding torque.
The Sizing Rule of Thumb: Calculate your peak dynamic load torque, then multiply by a safety factor of 2. Your motor's rated holding torque must exceed this final number. Furthermore, never rely on raw motor torque; always factor in the gear reduction ratio if your motor has an internal gearbox.
Worked Example: Motorized Camera Slider
Let's size a motor for a 3D-printed 150mm camera slider. We want to move a 200g (0.2 kg) smartphone carriage along a belt.
- Mass (m): 0.2 kg
- Gravity (g): 9.81 m/s²
- Friction Coefficient (μ): 0.15 (typical for V-slot wheels on aluminum)
- Drive Pulley Radius (r): 0.01 m (10mm)
First, calculate the linear force required to overcome friction:
F = m × g × μ
F = 0.2 × 9.81 × 0.15 = 0.294 Newtons
Next, convert this to the required torque at the motor shaft:
Torque = F × r
Torque = 0.294 N × 0.01 m = 0.00294 N-m (or roughly 0.30 kg-cm).
Applying our safety factor of 2, we need a motor capable of delivering at least 0.60 kg-cm of pull-in torque. The standard 28BYJ-48 unipolar stepper motor paired with the ULN2003 board has a maximum holding torque of roughly 0.34 kg-cm (after its internal 1/64 gear reduction).
Wiring, Terminals, and Controller Demands
The ULN2003 board is essentially a breakout for the ULN2003A integrated circuit, which contains seven Darlington transistor pairs. It is designed to sink current, not source it. This means the microcontroller GPIO pins trigger the base of the transistors, which then connect the motor coil to ground. The center taps of the unipolar motor coils must be tied directly to the positive voltage supply.
Terminal Identification
The standard ULN2003 module features a 5-pin JST connector for the motor and a 7-pin header for logic and power. Here is the exact wiring map for the 28BYJ-48 motor:
| Motor Wire Color | Function | ULN2003 JST Pin | Internal Coil Connection |
|---|---|---|---|
| Red | Common / VCC | Pin 1 (Center) | Center tap of both coils (Tied to 5V) |
| Pink | Coil 1A | Pin 2 | Driven by IN1 / OUT1 |
| Yellow | Coil 1B | Pin 3 | Driven by IN2 / OUT2 |
| Orange | Coil 2A | Pin 4 | Driven by IN3 / OUT3 |
| Blue | Coil 2B | Pin 5 | Driven by IN4 / OUT4 |
Controller Demands: Unlike modern bipolar drivers that accept a simple 'Step' and 'Direction' pulse, the ULN2003 demands that your microcontroller (Arduino, ESP32, or Raspberry Pi) bit-bang the coil sequence. You must dedicate 4 GPIO pins and write or use a library that cycles through the correct energizing states. For the smoothest motion and highest torque-to-power ratio, use half-step sequencing (8 steps per cycle) rather than wave-drive (4 steps per cycle). According to the Texas Instruments ULN2003A datasheet, each channel can sink up to 500mA, which is sufficient for the 28BYJ-48's ~160mA per coil draw, but leaves zero headroom for larger unipolar motors like the NEMA 14 unipolar variants.
Failure Signatures: Hum, Overheat, and Stall
When a ULN2003-driven system fails, it rarely does so silently. Because steppers operate open-loop (the controller has no way to verify the motor actually moved), you must diagnose failures by observing the physical behavior of the motor and driver board.
1. The 'Humming' Motor (No Rotation)
Symptom: The motor vibrates audibly and gets warm, but the shaft does not turn.
Cause: This is almost always a sequencing error or a pull-in torque violation. If your software fires the coils in the wrong order (e.g., 1-3-2-4 instead of 1-2-3-4), the magnetic fields cancel each other out, locking the rotor in place. Alternatively, the load inertia is too high for the motor to start from a dead stop.
Fix: Verify your coil firing array in code. If the sequence is correct, implement an acceleration profile (ramping up the step rate over 200-500ms) or reduce the physical load.
2. Thermal Runaway (Overheating)
Symptom: The ULN2003 IC is too hot to touch, and the 28BYJ-48 motor casing smells like hot plastic.
Cause: The ULN2003 lacks an 'Enable' or 'Sleep' pin. When you stop sending step pulses, the last energized coil remains grounded, drawing continuous current to hold the rotor in position. The Darlington transistors have a high saturation voltage drop (typically 1V to 1.5V per channel), meaning they dissipate significant heat as wasted power.
Fix: Never use the ULN2003 for applications requiring continuous static holding torque. If the motor must hold a load against gravity indefinitely, upgrade to a chopper driver (like the DRV8825) which uses PWM current limiting to reduce holding heat. For the ULN2003, add a MOSFET on the main VCC line to cut power to the motor entirely when movement is complete.
3. Silent Stalling (Missed Steps)
Symptom: The motor turns, but the final position is inaccurate. The system 'loses count' of steps over time.
Cause: Stepper motors are open-loop. If you command a step rate that exceeds the motor's pull-out torque curve at that specific RPM, the rotor's magnetic field falls behind the stator's rotating field. The controller assumes the motor moved, but it physically stalled. As noted in Oriental Motor's torque characteristic guides, a unipolar stepper's torque drops inversely with speed.
Fix: Lower the maximum RPM in your code. For the 28BYJ-48 on a ULN2003, do not exceed 15 RPM (roughly 100-120 full steps per second) if you are driving any load at all. If you need higher speeds with positional accuracy, you must abandon the ULN2003 and move to a 24V bipolar stepper system.






