The ULN2003A stepper motor driver is a Darlington transistor array designed specifically for switching low-voltage, unipolar stepper motors (like the ubiquitous 28BYJ-48) directly from microcontroller GPIO pins. It handles up to 500mA per channel at a maximum of 50V, making it the default choice for light-duty, low-speed positioning tasks in DIY robotics, camera sliders, and automated dials. However, because it lacks the current-chopping and microstepping capabilities of modern H-bridge drivers, it is strictly limited to unipolar coil configurations and low-torque profiles. If your application demands high speed, high holding torque, or bipolar motor support, you must bypass the ULN2003A and select a chopper driver like the A4988 or TMC2209.

Motor Type Comparison: Where the ULN2003A Fits

Choosing the right motor and driver pairing prevents the most common embedded systems failure: selecting a motor that cannot physically overcome the load inertia. Steppers and servos are not interchangeable; steppers provide precise open-loop positional holding at zero speed, while servos rely on closed-loop feedback for dynamic, high-speed movement. The table below breaks down which motor type fits specific load profiles and what driver architecture they demand.

Table 1: Motor and Driver Selection Matrix for Embedded Projects
Motor Type Torque Curve Profile Control Needs Typical Cost (USD) Driver Required
Unipolar Stepper (e.g., 28BYJ-48) High holding torque at standstill; drops off sharply above 100 RPM. Open-loop step/direction or sequenced coil energizing. $2 - $5 (motor + driver) ULN2003A (Darlington array) or ULN2803.
Bipolar Stepper (e.g., NEMA 17) High torque across a wider RPM range; requires current limiting. Open-loop step/direction with current chopping and decay modes. $12 - $25 A4988, DRV8825, or TMC2209 (H-bridge chopper).
Hobby Servo (e.g., SG90, MG996R) High dynamic torque; cannot hold position indefinitely without burning out. Closed-loop PWM pulse width (50Hz) for absolute angle. $3 - $15 Direct MCU PWM (for micro) or PCA9685 (for arrays).
Brushed DC Motor Low starting torque; peaks at mid-RPM; no positional holding. Speed control via PWM; direction via H-bridge. $5 - $15 L298N, TB6612FNG, or discrete MOSFETs.
Bench Note: The ULN2003A is strictly for unipolar steppers (5 or 6 wires). If you attempt to wire a 4-wire bipolar stepper to a ULN2003A, the motor will vibrate violently and refuse to turn, because the Darlington array can only sink current to ground—it cannot reverse current polarity across a coil like an H-bridge.

Wiring and Terminal Identification for Unipolar Steppers

The most common pairing for the ULN2003A stepper motor driver is the 28BYJ-48 5V unipolar stepper. This motor features an internal gear reduction (nominally 64:1, though practically 63.684:1) and a 5-wire JST connector. Understanding the internal center-tap wiring is critical for correct terminal identification.

The 28BYJ-48 Internal Wiring

Inside a unipolar stepper, each of the two main coil phases has a center tap. These center taps are tied together internally and brought out as the common wire (usually Red). The remaining four wires (Pink, Yellow, Orange, Blue) connect to the ends of the coils. To energize a phase, you apply voltage to the Red wire and sink the corresponding end wire to ground.

ULN2003A Board Terminals

The standard red ULN2003A breakout board simplifies this by integrating the Darlington IC, flyback diodes, and a matching JST socket. Here is the exact pin mapping for an Arduino Uno or Nano:

  • IN1 to IN4: Digital logic inputs. Connect to Arduino pins D8, D9, D10, and D11. The ULN2003A inverts the logic (a HIGH on IN1 pulls the corresponding OUT1 to ground).
  • VCC (Motor Power): Connect to an external 5V power supply capable of delivering at least 1A. Do not power the motor directly from the Arduino's 5V regulator; the combined coil draw (approx. 500mA when two phases are active) will overheat the Arduino's linear regulator and cause brownouts.
  • GND: Connect to the external power supply ground and the Arduino GND. A shared ground reference is mandatory for the microcontroller's logic HIGH signals to correctly trigger the Darlington bases.
  • Motor Socket: Plug the 28BYJ-48 JST connector directly into the white socket. The board handles the coil routing internally.
Voltage Drop Warning: According to the Texas Instruments ULN2003A datasheet, the Darlington transistor pair exhibits a collector-emitter saturation voltage (V_CE(sat)) of roughly 1V to 1.5V at 350mA. This means if you supply 5V to the VCC terminal, your motor coils only see about 3.5V to 4V. This reduces the advertised holding torque by 20-30%. If you need maximum torque from a 5V-rated 28BYJ-48, supply 6V or 7V to the ULN2003A VCC, provided the motor's duty cycle allows for the slight overvoltage without thermal damage.

Sizing Rules, Load Profiling, and Failure Signatures

Sizing a stepper motor system requires calculating the required torque and applying a safety factor. The golden rule of thumb for stepper sizing is: Select a motor with a holding torque rating of 2x to 3x the calculated maximum load torque. Steppers lose torque rapidly as speed increases, and you need this overhead to overcome rotor inertia during acceleration ramps.

Worked Load Example: Automated Dial Indicator

Suppose you are building an automated analog gauge. The needle and shaft assembly has a mass of 50 grams (0.05 kg), and the friction of the bearing requires a tangential force of 0.1 Newtons to turn at the desired speed of 10 RPM. The shaft radius is 1 cm (0.01 m).

  1. Calculate Load Torque: Torque = Force × Radius = 0.1 N × 0.01 m = 0.001 Nm.
  2. Calculate Inertial Torque (Acceleration): Assuming a modest acceleration to reach 10 RPM in 0.5 seconds, the inertial torque adds roughly 0.002 Nm.
  3. Total Required Torque: 0.003 Nm.
  4. Apply Safety Factor (3x): 0.003 Nm × 3 = 0.009 Nm required motor rating.

The standard 28BYJ-48 driven by a ULN2003A at 5V outputs approximately 0.034 Nm of pull-in torque after gear reduction. Since 0.034 Nm > 0.009 Nm, this motor and driver combination is perfectly sized for the load. If your calculation had yielded a requirement of 0.05 Nm, the 28BYJ-48 would stall, and you would need to step up to a NEMA 17 bipolar stepper on an A4988 driver.

Failure Signatures: Hum, Overheat, and Stall

When a ULN2003A-driven system fails, the physical symptoms tell you exactly what went wrong electrically or mechanically:

  • Humming without rotation: This indicates the coils are energizing, but the rotor cannot break static friction. Causes include a mechanical jam, an undersized motor, or an incorrect step sequence in your Arduino Stepper library initialization. It can also happen if the acceleration ramp in your code is too aggressive, causing the rotor to fall out of sync with the rotating magnetic field immediately upon startup.
  • Overheating (Motor or Driver IC): The ULN2003A is a dumb switch; it does not reduce current when the motor is idle. If your code leaves the coils energized to maintain holding torque while the motor is stationary, both the ULN2003A IC and the motor windings will dissipate maximum continuous heat. In an enclosed 3D-printed housing, this will melt the motor's internal plastic gear.
  • Stalling at Speed (Missed Steps): Unipolar steppers driven by simple Darlington arrays suffer from severe torque drop-off above 15-20 RPM due to the lack of current chopping. As the rotor spins faster, the coil inductance prevents the current from reaching its peak value before the next step is commanded. If your application requires 60 RPM, the ULN2003A will stall; you must switch to a bipolar motor and a chopper driver.

Frequently Asked Questions

Can I use the ULN2003A stepper motor driver with a bipolar stepper motor?

No. The ULN2003A is an array of NPN Darlington pairs that can only pull a wire to ground (sink current). A bipolar stepper motor (4 wires) requires current to flow in both directions through each coil phase to reverse the magnetic polarity. This requires an H-bridge topology (like the A4988, DRV8825, or L298N) which can both source and sink current. Attempting to wire a bipolar motor to a ULN2003A will result in a motor that vibrates in place but cannot complete a full rotation.

Why is my 28BYJ-48 motor humming but not moving with the ULN2003A?

A humming motor means the driver is receiving logic signals and passing current, but the magnetic field isn't rotating correctly or the load is too high. First, verify your coil sequence. The standard full-step wave drive sequence is A, B, C, D (pins 8, 9, 10, 11). If your code uses a half-step or microstep sequence meant for a different wiring standard, the magnetic field will collapse and expand rather than rotate. Second, check your power supply voltage under load; if the 5V rail sags below 4V when the coils engage, the motor loses the torque required to overcome its own internal gear friction.

How do I prevent the ULN2003A and motor from overheating during long idle periods?

Because the ULN2003A lacks an automatic idle-current reduction feature, you must handle this in software or with external hardware. In software, use the stepper.setSpeed(0) command or manually write all control pins LOW when the movement sequence is complete. This de-energizes the coils, dropping the current to zero and eliminating heat generation, but you will lose holding torque. If you need holding torque without the heat, you must upgrade to a modern chopper driver (like the TMC2209) which features 'StealthChop' and automatic standby current reduction, or switch to a servo motor which only draws significant current when actively fighting a load.