An Arduino Uno or Nano cannot drive a motor directly. The ATmega328P microcontroller's GPIO pins are limited to 40mA absolute maximum (20mA recommended), while even a tiny hobby motor demands hundreds of milliamps to several amps. To use an Arduino for motor control, you must pair the microcontroller with a dedicated motor driver that handles the high-current power switching while the Arduino handles the low-voltage logic.
The direct answer to 'which driver do I need' depends entirely on your motor type. For brushed DC motors, use an H-bridge like the Cytron MD10C or L298N. For NEMA stepper motors, use a chopper driver like the TI DRV8825 or a TB6600. For multiple RC servos, offload the PWM timing to a PCA9685 I2C board. Below is the exact framework for selecting, sizing, and wiring these systems on the bench.
Matching Motor Types to Load Profiles and Drivers
Selecting the right motor means matching its torque curve to your mechanical load. Treating a stepper and a servo as interchangeable is a common mistake that leads to stalled gantries or burnt-out driver boards. Steppers provide maximum holding torque at zero RPM but lose torque rapidly at high speeds. Servos provide high torque in a limited arc using closed-loop feedback, while DC motors excel at continuous high-speed rotation but offer zero holding torque without a mechanical brake.
| Motor Type | Torque Curve & Profile | Control Architecture | Recommended Arduino Driver | Typical Cost (2026) |
|---|---|---|---|---|
| Brushed DC | Linear torque-to-current; high starting torque, drops at max RPM. | Open-loop speed via PWM; direction via H-bridge logic. | Cytron MD10C (high current) or L298N (low current). | $5 - $18 |
| NEMA Stepper | High holding torque at 0 RPM; severe drop-off above 1000 RPM. | Open-loop step/direction pulses; microstepping for smoothness. | TB6600 (NEMA 23/34) or Pololu DRV8825 (NEMA 17). | $8 - $25 |
| RC Servo | High torque in a 180° arc; internal potentiometer feedback. | Closed-loop via 50Hz PWM pulse width (1ms to 2ms). | Direct GPIO (1-2 units) or Adafruit PCA9685 (multi-axis). | $6 - $20 |
| BLDC Outrunner | High torque density, sinusoidal commutation, requires spin-up. | Closed-loop FOC (Field Oriented Control) or ESC PWM. | SimpleFOC shield or standard RC ESC with BEC. | $30 - $65 |
When building a CNC router or 3D printer, the NEMA stepper is the default choice because its open-loop step counting provides precise positional awareness without the cost of encoders. For robotic arms requiring high torque at specific joint angles, high-torque metal-gear servos (like the MG996R) driven by a PCA9685 shield prevent the Arduino's timers from being overwhelmed by software PWM jitter.
Sizing Rules and Worked Load Examples
The golden rule of motor driver sizing is that the driver's continuous current rating must be at least 1.5 times the motor's rated continuous current. This margin accounts for thermal derating inside the driver's silicon, ambient heat in an enclosed project box, and inrush currents during hard direction reversals.
Worked Example: 10kg Lead Screw Gantry
Suppose you are moving a 10kg router carriage horizontally using a 2mm pitch lead screw. Let us calculate the required motor and driver.
- Calculate Force: Force = mass × gravity. 10kg × 9.81 m/s² = 98.1 Newtons.
- Calculate Torque: Torque = (Force × Pitch) / (2 × π × efficiency). Assuming 90% efficiency for a trapezoidal lead screw: (98.1 × 0.002) / (2 × 3.1415 × 0.9) = 0.034 Nm.
- Apply Safety Factor: Multiply by 2 to account for friction, binding, and acceleration inertia. Target torque = 0.068 Nm.
- Select Motor: A standard NEMA 17 stepper (e.g., StepperOnline 17HS4401) provides 0.40 Nm of holding torque—plenty of headroom. Its rated continuous current is 1.5A per phase.
- Select Driver: 1.5A × 1.5 safety margin = 2.25A required. The Pololu DRV8825 is rated for 1.5A continuous without active cooling, but can deliver up to 2.5A with a heatsink and active airflow. Alternatively, step up to a TB6600 (rated 4A continuous) for zero thermal throttling.
Wiring, Terminals, and Diagnosing Failure Signatures
Incorrect wiring is the leading cause of bricked microcontrollers and melted driver ICs. Motor drivers require strict separation between the logic ground (Arduino) and the power ground (motor supply), tied together at exactly one point to prevent ground loops.
Terminal Identification
- Stepper Motors (4-wire bipolar): Terminals are labeled A+, A-, B+, B-. To identify the coils without a datasheet, set your multimeter to continuity/resistance. Probing two wires that belong to the same coil will show a low resistance (typically 1 to 5 ohms). Wires from different coils will show infinite resistance (open circuit). Pair them accordingly to the driver's A and B terminals.
- Brushed DC (H-Bridge): Terminals OUT1 and OUT2 connect to the motor. ENA/ENB accept the Arduino PWM signal for speed, while IN1/IN2 accept digital HIGH/LOW for direction. Always wire a flyback diode (e.g., 1N4007) across the motor terminals if the driver board lacks built-in snubber diodes.
- Servos: The three wires are universally Brown/Black (GND), Red (VCC, typically 5V-6V), and Orange/Yellow/White (Signal). Never power more than two standard micro servos directly from the Arduino's 5V regulator; use a separate 5V buck converter and tie the grounds together.
Failure Signatures and Fixes
Motors and drivers communicate their failure modes through sound, heat, and motion. Here is how to read those signatures:
- Humming without moving (Stepper): The motor is energized but stalled. This usually means the step pulse frequency from the Arduino is too high for the motor's inductance, the mechanical load is jammed, or the A and B coil pairs are swapped or mixed. Fix: Lower the acceleration profile in your code (e.g., AccelStepper library) and verify coil pairing with a multimeter.
- Driver Overheating (Stepper/DC): If the driver IC is too hot to touch after 30 seconds, the current limit is set too high. On a DRV8825, the Vref trim pot is likely misadjusted. Fix: Measure the voltage at the Vref test point with a multimeter while the logic is powered. For a 1.5A motor, set Vref to roughly 0.6V (using the formula: Current Limit = Vref × 2). On a TB6600, verify the DIP switch settings against the manual.
- Servo Jitter or Twitching: The servo hunts back and forth by a few degrees at rest. This is almost always caused by power supply noise or a missing common ground between the Arduino and the servo's external power supply. Fix: Ensure the GND of the external 5V/6V servo power supply is physically wired to an Arduino GND pin. Add a 470µF electrolytic capacitor across the servo power rails to absorb inrush spikes.
Always de-energize the motor power supply before connecting or disconnecting motor wires from the driver terminals. Hot-plugging a stepper motor while the driver is powered can cause a massive inductive voltage spike that will instantly destroy the driver's internal MOSFETs and potentially feed high voltage back into the Arduino's logic pins.
By matching the torque curve to the mechanical load, oversizing the driver's continuous current rating by 50%, and respecting the isolation between logic and power grounds, your Arduino motor control projects will run reliably without the magic smoke that plagues most first-time builds.






