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.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:
| Pin | Wire Color | Internal Connection | ULN2003A Input |
|---|---|---|---|
| 1 | Red | Common Center Tap (VCC) | N/A (Goes to 5V Power) |
| 2 | Orange | Coil 2 Tap | IN4 |
| 3 | Yellow | Coil 2 Tap | IN3 |
| 4 | Pink | Coil 1 Tap | IN2 |
| 5 | Blue | Coil 1 Tap | IN1 |
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 Type | Torque Curve Profile | Control Needs & Driver | Typical 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 - $4 | Slow 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 - $25 | 3D 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 - $60 | Large CNC mills, heavy-duty conveyor belts. |
| SG90 Micro Servo | Peak torque at stall (~18 mN·m), zero holding torque without continuous power draw. | 5V PWM signal directly from Arduino GPIO. Closed-loop. | $2 - $5 | RC 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.






