The right motor driver for an Arduino project isn't chosen based on the microcontroller; it is dictated entirely by the motor's stall current, operating voltage, and commutation physics. An Arduino Uno or ESP32 can only source about 20mA to 40mA per GPIO pin at 5V or 3.3V. To move physical mass, you need a motor driver to act as a current-controlled valve between your high-power supply and the motor windings. Selecting the wrong driver results in thermal shutdown, destroyed H-bridges, or erratic stepping. This guide provides the exact data tables, sizing mathematics, and wiring topologies needed to match your load profile to the correct silicon.
Motor Profiles and Driver Demands
Before looking at driver ICs, you must define the motor type. Treating a stepper motor like a brushed DC motor, or assuming an RC servo needs an H-bridge, are the most common bench mistakes. Each motor topology demands a fundamentally different control scheme and driver architecture.
| Motor Type | Torque Curve Profile | Arduino Control Needs | Typical Driver Cost (2026) |
|---|---|---|---|
| Brushed DC | Maximum torque at zero speed (stall); drops linearly as RPM increases. | H-Bridge for direction; PWM on enable pin for speed. | $2 – $12 |
| Stepper (NEMA 17/23) | High holding torque at standstill; torque drops sharply past mid-range RPM. | Chopper driver (STEP/DIR pulses); requires current limiting (Vref). | $4 – $18 |
| BLDC (Gimbal/Hobby) | Flat, high torque across a wide RPM band; highly efficient. | 3-Phase ESC or FOC (Field Oriented Control) driver; requires rotor position feedback. | $15 – $65 |
| RC Servo | Geared holding torque; designed for precise angular positioning, not continuous rotation. | Simple 50Hz PWM signal (no H-bridge or high-current driver needed). | $3 – $10 (Internal) |
With the motor type identified, you can select the driver IC. Modern designs have largely moved past the legacy L298N BJT-based modules, favoring MOSFET-based drivers that offer lower on-resistance and higher PWM switching frequencies. Below is a spec-sheet breakdown of the most reliable driver modules for Arduino and ESP32 integration.
| Driver IC / Module | Max Continuous Current | Motor Voltage (VMOT) | Logic Voltage (VCC) | Best Application |
|---|---|---|---|---|
| TB6612FNG | 1.2A (3.2A peak) | 2.5V – 13.5V | 2.7V – 5.5V | Dual small DC motors, 2WD rovers, ESP32 logic levels. |
| DRV8871 | 3.6A | 6.5V – 45V | 6.5V – 45V (No separate logic VCC) | Single high-torque 12V/24V DC gearmotors, linear actuators. |
| TMC2209 | 2A RMS (2.8A peak) | 4.75V – 29V | 3.3V – 5V | NEMA 17/23 steppers; requires UART for advanced StealthChop tuning. |
| BTS7960 | 15A - 20A (Heatsink dependent, 43A silicon limit) | 5.5V – 27V | 5V | High-current DC winches, heavy-duty conveyors, battlebots. |
Sizing the Driver: The 150% Stall Current Rule
The most frequent cause of melted motor driver terminals is sizing the module for the motor's nominal running current. When a motor starts from a dead stop, or hits a mechanical bind, it draws stall current. If your driver cannot handle the stall current, the internal MOSFETs will overheat and short out, often taking your Arduino's GPIO pins with them.
Worked Load Example: 12V Planetary Gearmotor Winch
Suppose you are building an automated blind system using a 12V DC planetary gearmotor. The datasheet specifies a nominal running current of 2.5A, but a stall current of 9.0A.
- Incorrect Sizing: Choosing a driver rated for 3A continuous (like a standard L298N) because "it runs at 2.5A." The moment the blinds hit the top limit switch and the motor stalls for even 200ms before your code cuts the power, the driver will exceed its thermal limits and fail.
- Correct Sizing: 9.0A (stall) × 1.5 = 13.5A minimum continuous rating. You would select a BTS7960 module. However, because the BTS7960 requires aggressive active cooling to sustain 15A+ continuously, you must pair it with a heatsink and a 5V cooling fan, or implement a software current-limit using an inline ACS712 hall-effect sensor to cut PWM if current exceeds 8A for more than 500ms.
Wiring Terminals and Grounding Topology
Motor drivers bridge two entirely different electrical domains: the low-voltage, low-current logic domain (your Arduino) and the high-voltage, high-current power domain (your battery or bench supply). Misidentifying these terminals is a fast track to releasing magic smoke.
Terminal Identification
- VMOT / VBATT / V+: The main motor power supply input. This connects directly to your high-current battery or power supply. Keep these traces/wires thick (e.g., 14 AWG for >10A loads).
- VCC / VDD / VIO: The logic power input. This powers the driver's internal optocouplers, level shifters, or microcontroller interface. Connect this to the Arduino's 5V or 3.3V pin. Note: Some drivers like the DRV8871 lack a separate VCC and derive logic power directly from VMOT; ensure your Arduino is 5V-tolerant or use a logic level shifter if VMOT is 24V.
- GND (Power): The return path for the motor current. Must be wired directly to the power supply's negative terminal.
- LOGIC GND: The reference ground for the Arduino signals.
- IN1 / IN2 or DIR / STEP: The control signals. IN1/IN2 are used for brushed DC H-bridges (High/Low sets direction, PWM on the Enable pin sets speed). DIR/STEP are used for steppers (each pulse on STEP moves the rotor one microstep).
Failure Signatures: Diagnosing Hum, Overheat, and Stall
When a motor system fails, the physical symptoms tell you exactly what is wrong with the electrical setup. Before swapping out components, read the failure signature.
1. The "Hum" (Stepper Vibrating but Not Moving)
Cause: This is almost exclusively a stepper motor issue. It means the coils are energized, but the magnetic fields are fighting each other or are too weak to overcome the rotor's detent torque.
Fix: First, check your coil pairing. If you are using a NEMA 17 with 4 unmarked wires, use a multimeter to find the two pairs with continuity. If you mix an A-coil wire with a B-coil wire on the same driver terminals, the motor will just hum. Second, check the Vref (current limit) potentiometer on drivers like the A4988 or TMC2209. If Vref is set too low, the chopper circuit starves the coils of current. For a TMC2209 with a 0.11Ω sense resistor targeting 1.5A RMS, your Vref should be tuned to approximately 0.83V.
2. Overheat and Thermal Shutdown
Cause: The driver IC is burning excess energy as heat. This happens for two reasons: inadequate heatsinking for the continuous load, or PWM switching losses.
Fix: Check your PWM frequency in your Arduino code. Older BJT-based drivers like the L298N have slow switching times. If you drive them with a 20kHz PWM signal, the transistors spend a significant amount of time in the linear (high-resistance) region during every transition, generating massive heat. Drop the PWM to 500Hz for L298Ns. For modern MOSFET drivers like the TB6612FNG, 20kHz is fine and keeps the motor whine out of human hearing range. If the driver is still hot to the touch at the correct PWM frequency, your continuous load exceeds the IC's thermal dissipation capability without forced air cooling.
3. Stall and Inductive Kickback (Smoke)
Cause: When a brushed DC motor is spinning, it acts as a generator, creating back-EMF. When you abruptly cut power or reverse direction via the H-bridge, the collapsing magnetic field in the motor windings induces a massive voltage spike ($V = -L \frac{di}{dt}$). If this spike exceeds the driver's maximum voltage rating, it punches through the silicon.
Fix: Most modern driver ICs (like the TI DRV8871) include internal flyback diodes to safely route this inductive kickback back to the power supply. However, if you are driving high-inertia loads (like a heavy flywheel or a large winch) with discrete MOSFET H-bridges or older modules, you must solder external Schottky diodes (e.g., 1N5822) across the motor terminals to clamp the voltage spike. Furthermore, never rely on software alone to stop a high-inertia load; implement hardware limit switches wired directly to the driver's enable/disable pins to cut power before a mechanical crash occurs.






