The 28BYJ-48 is a 5V unipolar stepper motor featuring an internal gear reduction that yields a nominal 1:64 ratio (actual 1:63.684) and a holding torque of roughly 34.3 mN·m (500g-cm). It demands a ULN2003A Darlington array driver because an Arduino GPIO pin can only source ~20mA, while this motor requires ~160mA per phase. This motor is strictly suited for low-load, low-speed precision tasks like camera sliders, LiDAR mounts, or automated blinds. It is not a high-torque drivetrain component, and attempting to use it for heavy robotic arms will result in immediate stalling. Below is the exact engineering data, sizing math, and wiring protocol you need to deploy it reliably.

Sizing the 28BYJ-48: Load Profiles and Torque Realities

The most common mistake makers make with the 28BYJ-48 is confusing holding torque (static) with pull-out torque (dynamic). The datasheet often claims 500g-cm of holding torque. However, the moment the motor starts spinning, torque drops precipitously. At 10 RPM, your usable dynamic torque is closer to 20–25 mN·m.
Sizing Rule of Thumb: Always size a stepper motor so the required load torque is no more than 50% of the motor's rated dynamic torque at your target speed. This 2:1 safety margin accounts for acceleration inertia and prevents skipped steps.

Worked Load Example: LiDAR Turntable

Let us size a horizontal turntable (lazy susan style) meant to rotate a 300g LiDAR sensor array at 10 RPM. The turntable has a radius of 5cm (0.05m). The bearing friction coefficient (plastic-on-plastic) is 0.15.

  • Normal Force: Mass × Gravity = 0.3 kg × 9.81 m/s² = 2.943 N
  • Friction Force: Normal Force × Friction Coefficient = 2.943 N × 0.15 = 0.441 N
  • Required Load Torque: Friction Force × Radius = 0.441 N × 0.05 m = 0.022 N·m (22 mN·m)

Applying the 50% safety rule, we need a motor with at least 44 mN·m of dynamic torque at 10 RPM. The 28BYJ-48 maxes out around 25 mN·m at that speed. Verdict: The 28BYJ-48 will likely stall during acceleration or skip steps under this specific load. You must either reduce the friction (use ball bearings), reduce the mass, or upgrade to a NEMA 17 stepper. If the load was purely a 100g sensor on a low-friction ball bearing (friction coeff 0.02), the required torque drops to ~4 mN·m, making the 28BYJ-48 a perfect, cost-effective fit.

Wiring, Terminals, and the ULN2003A Driver

You cannot wire the 28BYJ-48 directly to an Arduino. The motor contains four stator coils with a common center tap. To switch these high-current coils safely, we use the ULN2003A driver board, which houses Darlington transistor pairs and built-in flyback diodes to suppress inductive voltage spikes when the coils de-energize.

Terminal Identification and Pinout

The motor terminates in a 5-pin JST-XH connector. Do not rely solely on wire colors, as cheap batches sometimes swap them. Verify with a multimeter if the motor behaves erratically. The standard pinout is:

PinWire ColorInternal ConnectionULN2003A Input
1RedCommon Center Tap (VCC)N/A (Goes to 5V Power)
2OrangeCoil 2 TapIN4
3YellowCoil 2 TapIN3
4PinkCoil 1 TapIN2
5BlueCoil 1 TapIN1

Powering the Driver: Never power the ULN2003A VCC from the Arduino's 5V pin. The motor can draw up to 320mA peak (two phases energized simultaneously). The Arduino's onboard linear regulator will overheat and shut down. Use an external 5V bench supply or a buck converter, and ensure the external supply's GND is tied to the Arduino's GND to establish a common logic reference.

Failure Signatures: Diagnosing Hum, Overheat, and Stall

When an Arduino stepper 28BYJ-48 setup fails, it rarely fails silently. The physical symptoms map directly to specific electrical or code-level faults.
  • Hum and Vibration Without Rotation: This is almost always a step-sequence error or an excessively high starting speed. The AccelStepper library handles the 4-step or 8-step half-stepping sequences correctly. If using raw `digitalWrite` arrays, ensure your sequence matches the physical coil layout. If the sequence is correct, your code is demanding a speed the motor cannot physically achieve from a dead stop. Drop your `setMaxSpeed()` to 500 steps/second and implement an acceleration ramp.
  • Overheating Motor or Driver: The ULN2003A is a dumb driver; it lacks the automatic current-reduction (idle decay) found in modern chopper drivers like the A4988. If your code stops the motor but leaves the pins HIGH to 'hold' position, the coils remain fully energized. The motor will become too hot to touch within minutes, and the ULN2003A chips will cook. Fix: Always call `stepper.disableOutputs()` in your code the moment the target position is reached.
  • Stalling and Skipping Steps: If the motor spins freely without a load but stutters when attached to your mechanism, you have exceeded the dynamic pull-out torque. You cannot fix this in code by 'pushing harder'. You must either increase the gear reduction externally, lower the acceleration rate, or upgrade to a NEMA 17 bipolar stepper.

Motor Selection Matrix: When to Upgrade from the 28BYJ-48

Makers frequently attempt to substitute servos for steppers or use the 28BYJ-48 for high-speed applications. Steppers and servos are not interchangeable; steppers offer open-loop positional accuracy at low speeds, while servos use closed-loop potentiometer feedback for high-speed, high-torque angular sweeps. Use this matrix to select the right actuator for your load profile.
Motor TypeTorque Curve ProfileControl Needs & DriverTypical Cost (2026)Best Application
28BYJ-48 (Unipolar)High static holding, steep drop-off above 15 RPM. Max ~34 mN·m.5V logic, ULN2003A Darlington array. Open-loop.$2 - $4Slow sensor panning, automated blinds, light valve control.
NEMA 17 (Bipolar)Flat torque curve up to 300 RPM. Typically 400–500 mN·m.12V-24V supply, chopper driver (A4988, TMC2209). Open-loop.$12 - $253D printers, CNC routers, medium-load linear actuators.
NEMA 23 (Bipolar)High torque across mid-range speeds. 1000+ mN·m.24V-48V supply, high-current driver (DM542). Open-loop.$30 - $60Large CNC mills, heavy-duty conveyor belts.
SG90 Micro ServoPeak torque at stall (~18 mN·m), zero holding torque without continuous power draw.5V PWM signal directly from Arduino GPIO. Closed-loop.$2 - $5RC car steering, robotic arm joints, camera gimbals.

Arduino Stepper 28BYJ-48 FAQ

Why does my Arduino stepper 28BYJ-48 shake but not turn?

This 'humming' stall occurs when the step pulse frequency exceeds the motor's pull-in torque limit, or the phase sequence is incorrect. If you are using the AccelStepper library, ensure your `setMaxSpeed()` is initialized low (e.g., 200 steps/sec) and `setAcceleration()` is set to a gentle ramp (e.g., 100 steps/sec²). If using manual arrays, verify your 4-step sequence matches the physical coil taps (usually IN1-IN3-IN2-IN4 for half-stepping on the ULN2003).

Can I power the 28BYJ-48 directly from the Arduino 5V pin?

No. While the motor is rated for 5V, it draws roughly 160mA per phase (320mA peak). The Arduino Uno's onboard USB polyfuse is typically rated for 500mA, and the onboard 5V linear regulator (if powered via the barrel jack) will overheat and trigger thermal shutdown at currents above 200mA. Always use a dedicated 5V external power supply for the ULN2003A board, tying the grounds together.

How do I modify the 28BYJ-48 from unipolar to bipolar?

The 28BYJ-48 is internally a bipolar motor with the center taps brought out to the red wire. You can convert it to bipolar to use with modern, highly efficient chopper drivers like the A4988 or DRV8825. Open the motor casing, locate the PCB where the wires solder to the stator, and use a hobby knife to carefully cut the copper trace connecting the two center taps. Once cut, the red wire becomes disconnected. You then use the Orange/Blue pair as Coil A and Yellow/Pink as Coil B. This allows you to drive it at 12V, significantly increasing high-speed torque.

What is the exact gear ratio of the 28BYJ-48 stepper motor?

The datasheet nominally claims a 1:64 gear ratio, which would result in exactly 4096 steps per output shaft revolution in half-step mode. However, physical teardowns and empirical measurements reveal the actual gear train ratio is 1:63.68395. This means one full revolution requires exactly 4075.77 steps in half-step mode. For high-precision applications requiring exact multi-revolution homing, you must account for this fractional discrepancy in your code, or the output shaft will drift by roughly 2 degrees every 10 revolutions.