The ULN2003 Stepper Motor Driver Module: Where It Fits in Motion Control

The ULN2003 stepper motor driver module is a Darlington transistor array designed specifically for driving low-power, low-voltage unipolar stepper motors. If you are working with a 5V or 12V unipolar stepper drawing less than 500mA per phase—most commonly the ubiquitous 28BYJ-48—the ULN2003 is the correct, cost-effective driver. It is not a chopper driver, it does not support microstepping natively, and it absolutely cannot drive bipolar stepper motors.

At its core, the ULN2003 IC contains seven Darlington pairs. A Darlington pair is simply two NPN transistors wired together to provide high current gain, allowing a low-current microcontroller GPIO pin (sourcing just a few milliamps) to switch a much heavier motor coil load. However, this architecture comes with a built-in electrical penalty: a high saturation voltage drop (VCE(sat)). According to the Texas Instruments ULN2003A datasheet, this drop is typically 0.9V to 1.5V. This means if you supply the module with 5V, your motor coils only ever see about 3.5V to 4.1V. Understanding this voltage drop is the key to properly sizing your power supply and managing expectations for torque.

Motor Type Comparison: Stepper, Servo, and DC Geared

Before wiring up your breadboard, you must confirm that a unipolar stepper is actually the right motor for your load profile. Beginners often treat steppers and servos as interchangeable, which leads to stalled mechanisms and burnt-out drivers. Here is how the unipolar stepper (driven by the ULN2003) compares to other common hobbyist actuators.

Motor Type Torque Curve Profile Control Needs & Driver Typical Cost (2026)
Unipolar Stepper (e.g., 28BYJ-48) Maximum holding torque at 0 RPM; drops off sharply at high speeds. Excellent for precise, slow, high-holding loads. Requires a Darlington array (ULN2003) to sink current through center-tapped coils. Open-loop control. $1.50 - $3.00 (Motor + Driver)
Bipolar Stepper (e.g., NEMA 17) Higher baseline torque than unipolar; maintains torque better at mid-range speeds. Standard for 3D printers and CNCs. Requires an H-bridge chopper driver (A4988, TMC2209) to reverse polarity across coils. Open-loop or closed-loop. $12.00 - $25.00 (Motor + Driver)
DC Servo (e.g., SG90, MG996R) High torque at low speeds via internal gear reduction. Cannot hold position indefinitely without drawing continuous current and overheating. Requires a single PWM signal wire. Internal potentiometer and H-bridge handle the commutation. Closed-loop. $2.00 - $15.00
DC Geared Motor Constant torque across a wide RPM range. Zero holding torque when power is removed. Requires a standard DC motor driver (L298N, TB6612FNG) for speed/direction control. Open-loop. $5.00 - $18.00

Which motor fits this load profile? Choose the unipolar stepper and ULN2003 module when you need precise angular positioning at low speeds (like turning a valve, moving a sensor pan/tilt, or driving a slow conveyor) and when your budget is strictly under $5. If you need high speed, high torque, or continuous rotation under heavy load, you must upgrade to a bipolar stepper or a DC geared motor.

Wiring the ULN2003 and 28BYJ-48: Terminals and Sizing

The standard red ULN2003 breakout board exposes the necessary pins for both logic and power. Proper terminal identification prevents the most common mistake in embedded motor control: frying your microcontroller's voltage regulator.

Terminal Identification

  • IN1 to IN4: Logic inputs. Connect these to four digital GPIO pins on your Arduino, ESP32, or Raspberry Pi Pico. These pins only require a few milliamps to trigger the Darlington pairs.
  • VCC and GND: Motor power supply inputs. Do not connect VCC to your Arduino's 5V pin. The motor will draw hundreds of milliamps, causing a brownout that will reset your microcontroller or permanently damage the onboard 5V linear regulator.
  • OUT1 to OUT4: Switched outputs. These connect directly to the four phase wires of the unipolar stepper motor.
  • COM (Common): Internal flyback diode common cathode. On the module, this is internally tied to VCC. It protects the transistors from inductive voltage spikes when the coils are de-energized.
Bench Tip: Always use a dedicated external power supply for the ULN2003 VCC pin. For a 5V 28BYJ-48 motor, use a 5V 1A (or higher) USB buck converter or wall adapter. Tie the external power supply's GND to the microcontroller's GND to establish a common reference voltage.

Sizing Rule of Thumb and Worked Load Example

The Rule: Your driver's peak continuous current rating per channel must exceed the motor's maximum phase current by at least 20% to account for thermal derating and startup inrush.

Worked Example: Let's size the ULN2003 for a standard 5V 28BYJ-48 unipolar stepper. According to the Adafruit Motor Selection Guide, we must look at the coil resistance. The 28BYJ-48 has a phase resistance of approximately 50 ohms per coil. Using Ohm's Law (I = V / R), the current per phase is 5V / 50Ω = 100mA. In a full-step sequence, two phases are energized simultaneously, but they are wired in parallel to the common center tap, so the maximum current through any single ULN2003 Darlington pair remains 100mA. Applying our 20% safety margin: 100mA * 1.2 = 120mA required capacity. The ULN2003 is rated for 500mA per channel. Because 500mA > 120mA, the ULN2003 is safely sized for this load, with ample headroom to prevent thermal failure.

Failure Signatures: Diagnosing Hum, Overheat, and Stall

When a stepper system fails, it rarely does so silently. The physical symptoms tell you exactly what is wrong with the commutation or the load.

1. The 'Hum' (Vibration without Rotation)

Cause: Incorrect firing sequence or severe resonance. Unipolar steppers require a specific 4-bit sequence (e.g., 1000, 1100, 0100, 0110, 0010, 0011, 0001, 1001 for half-stepping). If your code sends a bipolar sequence, or if the wires are plugged into the ULN2003 out of order, the magnetic fields will fight each other. The motor will vibrate aggressively and hum, but the shaft will not turn. Fix: Verify your stepping sequence array in code. Physically check that the motor's 5-pin JST connector is plugged into the ULN2003 board in the correct orientation (red wire to the center, usually pin 3 on the motor side, matching the COM terminal).

2. Overheat (IC too hot to touch)

Cause: Continuous holding current without thermal dissipation. The ULN2003 module is built on a cheap FR4 PCB with virtually no copper pour for heatsinking. If your code commands the motor to move and then leaves the coils energized to 'hold' the position indefinitely, the Darlington pairs will dissipate power continuously (P = Vdrop * I). Fix: In your firmware, implement a timeout that de-energizes all coils (sets IN1-IN4 LOW) 500ms after the motor reaches its target position. If holding torque is strictly required, you must upgrade to a chopper driver with active current limiting and enable decay modes.

3. Stall (Missed Steps and Positional Drift)

Cause: Acceleration profile is too aggressive, or the load inertia exceeds the motor's pull-in torque. Steppers do not instantly jump to full speed; they must be ramped up. If you command 500 steps per second instantly, the rotor's physical inertia will cause it to slip magnetic poles, resulting in a stall. Fix: Use an acceleration library like AccelStepper in Arduino. Set your maximum speed to 300-400 steps/second and your acceleration to 100 steps/second² for the 28BYJ-48. If it still stalls under load, the load is simply too heavy for this motor class.

Frequently Asked Questions

Can I use the ULN2003 stepper motor driver module for a bipolar stepper motor?

No. Bipolar stepper motors do not have a center-tapped common wire; they only have two coils with four wires total. Driving a bipolar motor requires reversing the polarity of the voltage across the coils, which demands an H-bridge circuit (like the A4988, DRV8825, or L298N). The ULN2003 is a simple low-side switch (a Darlington array) that can only sink current to ground in one direction. Attempting to wire a bipolar motor to a ULN2003 will result in the motor locking up, vibrating, or the driver IC overheating and failing.

Why is my ULN2003 stepper motor driver module getting too hot to touch?

This is usually caused by leaving the motor coils energized to maintain 'holding torque' after the movement is complete. Because the ULN2003 lacks the active current regulation found in modern chopper drivers, it feeds full voltage to the coils continuously. Combined with the 1V+ voltage drop across the Darlington transistors and the lack of a heatsink on the cheap red PCB, the IC quickly reaches 60°C to 80°C. Always write your code to set all four input pins LOW once the motor reaches its destination, cutting power to the coils entirely.

How do I calculate the exact steps per revolution for a 28BYJ-48 with a ULN2003?

The 28BYJ-48 is a geared stepper motor. The internal stepper motor has 32 steps per revolution (using a standard half-step sequence). However, it drives an internal planetary gear reduction. While often rounded to 64:1 in hobbyist tutorials, the exact gear ratio is 63.68395:1. Therefore, the exact number of half-steps for one full output shaft revolution is 32 * 63.68395 = 2037.88 steps. If you are using full-stepping (which is generally not recommended for this motor due to vibration), it is roughly 2048 steps. For high-precision applications like a clock hand or a degree-accurate pan/tilt, you must account for this fractional gear ratio in your code, or your mechanism will accumulate positional drift over multiple rotations.