ULN2003 + 28BYJ-48 Stepper Driver

The cheapest 'real' stepper motor on the planet, driven by a Darlington array — 2,048 micro-steps per revolution.

Difficulty: Through-hole. Estimated build time: about 45 minutes. Estimated parts cost: about US$8.00. 4-line bill of materials. Compare supplier offers when available. The 28BYJ-48 is the bargain-bin stepper motor that everyone learns on — a unipolar 5 V stepper with built-in 64:1 reduction gearing that gives 2,048 steps per output-shaft revolution at full step.

Wire the ULN2003 inputs

Place the ULN2003 in DIP-16 across the breadboard's centre channel. Pin 1 is IN1, pins 2–4 are IN2–IN4. Wire IN1 to Arduino digital pin 8, IN2 to pin 9, IN3 to pin 10, IN4 to pin 11. (The 28BYJ-48 actually wants the step sequence in IN1-IN3-IN2-IN4 order — that is handled in software when you initialise the Stepper library.)

Power and ground the chip

Pin 8 is GND — wire it to your Arduino ground. Pin 9 is COM, the kickback diode common cathode — connect it to your motor supply (+5 V for the 28BYJ-48). The chip itself does not need a separate logic supply; the Darlingtons are TTL/CMOS-input compatible directly off the Arduino's 5 V output.

Connect the 28BYJ-48

The 28BYJ-48 has a five-wire JST-style connector. The red wire is the centre-tap of both coil pairs (5 V), and blue, pink, yellow, and orange are the coil ends. Plug red into your +5 V rail. The four coloured wires go to the ULN2003 outputs (pins 13, 14, 15, 16 — that is OUT4, OUT3, OUT2, OUT1) — but the standard Last Minute Engineers wiring matches the motor connector to the chip's OUT1–OUT4 (pins 16, 15, 14, 13) directly, so plug the connector in with that orientation.

Run the Stepper library

Upload the standard Arduino Stepper library example, but declare the motor with the 28BYJ-48-specific sequence: Stepper myStepper(2048, 8, 10, 9, 11) — note the 8/10/9/11 order, NOT 8/9/10/11. The 2,048 is the steps-per-revolution after the internal 64:1 gearbox. Call myStepper.setSpeed(5) and myStepper.step(2048) to spin one full output-shaft revolution at 5 RPM.

Watch the current

Each ULN2003 channel handles up to 500 mA continuously, and the seven channels sum to 2.5 A — far above the 28BYJ-48's ~250 mA per coil. So you have headroom. Make sure your 5 V supply can deliver at least 500 mA — a USB port works, but a wall adapter is steadier. If the motor stutters on Arduino USB power, that is the supply, not the driver.