To successfully pair an Arduino with a motor controller, you must match the driver's continuous current rating to at least 125% of your motor's stall current, and select the motor topology based on your positional accuracy requirements. For simple continuous-rotation wheeled robots, use a brushed DC gearmotor with a MOSFET-based driver like the TB6612FNG. For CNC or 3D printer precision, use a NEMA 17 stepper with a TMC2209. For simple 180-degree robotic arm joints, use a standard RC servo (SG90 or MG995) driven directly from a 5V/6V external rail. Never drive inductive motor loads directly from Arduino GPIO pins; the back-EMF will destroy the microcontroller's output transistors.
The Decision Path: Picking the Right Motor and Driver
Choosing the right actuator is a binary elimination process based on your mechanical load profile. Use this decision matrix to terminate your selection at a specific hardware pairing.
| Load Requirement | Motor Type | Required Controller | Concrete Pick (2026) |
|---|---|---|---|
| Continuous rotation, high speed, low positional accuracy (e.g., RC car, conveyor) | Brushed DC Gearmotor | Dual H-Bridge (MOSFET) | TB6612FNG Breakout + Pololu 12V 30:1 Micro Metal Gearmotor |
| Precise absolute positioning, high holding torque at zero speed (e.g., CNC router, camera slider) | Bipolar Stepper | Step/Dir Chopper Driver | TMC2209 (UART) + NEMA 17 (17HS4401) |
| Simple 0-180° angular joint, built-in feedback (e.g., pan/tilt head, robotic gripper) | RC Servo | Dedicated 5V/6V BEC (No H-Bridge needed) | PCA9685 PWM Board + MG996R Metal Gear Servo |
| High efficiency, high RPM, continuous rotation (e.g., drone, high-speed spindle) | Brushless DC (BLDC) | 3-Phase ESC (Electronic Speed Controller) | Simonk 30A ESC + 2212 920KV Outrunner |
Motor Type Comparison: Torque, Control, and Cost
Understanding the torque curve of your chosen motor dictates how you size the power supply and the driver. A common mistake is sizing a driver based on the motor's no-load or nominal current, which leads to immediate thermal shutdown under mechanical stress.
| Motor Type | Torque Curve Profile | Control Complexity | Typical Cost (Actuator + Driver) |
|---|---|---|---|
| Brushed DC | Maximum torque at stall (0 RPM); drops linearly as speed increases. | Low (PWM for speed, 2 GPIOs for direction) | $15 - $35 |
| Stepper | Maximum holding torque at 0 RPM; drops off sharply at high speeds due to coil inductance. | High (Step/Dir pulses, microstepping, current limiting) | $25 - $50 |
| RC Servo | Constant torque across its limited 180° range; internal potentiometer provides feedback. | Very Low (Single 50Hz PWM pulse for angle) | $8 - $20 |
| BLDC | Flat, high torque across a wide RPM range; requires active commutation. | High (Requires ESC, 3-phase wiring, hall sensors or sensorless BEMF) | $40 - $80 |
Many legacy tutorials recommend the L298N dual H-bridge for Arduino DC motor projects. Avoid this chip in 2026. The L298N uses bipolar junction transistors (BJTs) which drop 1.5V to 2.0V across the bridge as heat. If you feed it 6V, your motor only sees 4V. Modern MOSFET drivers like the TB6612FNG or DRV8871 drop less than 0.5V, run cooler, and support higher PWM frequencies without coil whine. For authoritative motor drive theory, refer to Pololu's DC Motor Guide.
Sizing Rule of Thumb and Worked Load Example
The golden rule for pairing an Arduino with a motor controller is the 125% Stall Current Rule. When a DC motor starts from a dead stop, or hits a mechanical bind, it draws its stall current. Your driver's continuous current rating must exceed this value, or the driver's internal thermal protection will trip, cutting power mid-operation.
Worked Example:
Assume you are building a small rover using a 12V brushed DC gearmotor. You check the manufacturer datasheet and find the following specs:
- No-load current: 0.15A
- Nominal running current: 0.4A
- Stall current: 2.8A
The Math:
2.8A (Stall) × 1.25 (Safety Margin) = 3.5A minimum continuous driver rating.
Component Selection:
If you use an L298N (2A continuous limit), the driver will overheat and shut down the moment the rover hits a carpet threshold. If you use a TB6612FNG (1.2A continuous limit), it will also fail. You must step up to a driver like the Texas Instruments DRV8871 (3.6A continuous) or a BTS7960 module (43A continuous) to safely handle the 3.5A inrush without tripping.
If your motor stalls and your driver fails to cut power, a 3S LiPo battery (capable of dumping 50A+) will rapidly heat the motor windings and melt 22 AWG breadboard wires. Always place an inline automotive blade fuse (rated 125% above your expected running current, e.g., 2A for a 0.4A nominal motor) on the positive VM (motor voltage) line between the battery and the motor controller.
Wiring and Terminal Identification (TB6612FNG Focus)
For standard 12V brushed DC applications under 1.2A continuous per channel, the TB6612FNG is the optimal modern choice. It requires separate logic power (VCC) and motor power (VM), and crucially, a shared ground reference.
| TB6612FNG Pin | Arduino Uno R3/R4 Pin | Function & Wiring Notes |
|---|---|---|
| VCC | 5V | Logic power for the internal MOSFET gates. Must be 2.7V - 5.5V. |
| VM | None (Battery +) | Motor power supply. 2.5V to 13.5V. Add a 100µF decoupling capacitor across VM and GND. |
| GND | GND | Critical: Must share a common ground with the Arduino and the Battery negative terminal. |
| PWMA / PWMB | Pins 5, 6 (PWM capable) | Controls speed via PWM. Use 1kHz - 20kHz frequency to avoid audible coil whine. |
| AIN1 / AIN2 | Pins 7, 8 (Digital) | Channel A Direction. HIGH/LOW = Forward; LOW/HIGH = Reverse; LOW/LOW = Coast; HIGH/HIGH = Brake. |
| STBY | Pin 9 (Digital) or 3.3V | Standby. Must be pulled HIGH to enable the driver. Tie to 3.3V/5V if you don't need software sleep. |
| AO1 / AO2 | None (Motor A wires) | Outputs to Motor A terminals. Polarity determines forward/reverse baseline. |
For a complete visual schematic and breadboard layout, consult the SparkFun TB6612FNG Hookup Guide, which details the necessary flyback diode integration (already built into the TB6612FNG silicon, unlike older discrete H-bridge designs).
Failure Signatures: Hum, Overheat, and Stall
When your Arduino code compiles but the physical hardware misbehaves, the motor and driver will exhibit specific physical signatures. Use this troubleshooting matrix to diagnose the fault.
- Symptom: Motor hums or whines but does not spin.
Cause 1: Missing common ground. The Arduino PWM signal is floating relative to the driver's logic ground. Fix: Verify continuity between Arduino GND and Driver GND with a multimeter (should read < 1 ohm).
Cause 2: STBY pin floating or LOW. Fix: Pull STBY to 5V. - Symptom: Driver IC is too hot to touch (>60°C) within seconds.
Cause: You are using a BJT driver (L298N) at high current, or your PWM frequency is set too low (e.g., default Arduino 490Hz), causing excessive switching losses in the MOSFETs. Fix: Upgrade to a MOSFET driver and use theanalogWriteFrequency()function (on supported boards) or hardware timers to push PWM to 15kHz+. - Symptom: Motor stalls under light load despite high PWM.
Cause: Insufficient starting torque due to lack of gear reduction, or power supply voltage sag. A 12V motor running off a depleted 9V alkaline battery will drop to 6V under load, stalling out. Fix: Measure VM at the driver terminals while the motor is commanded to spin. If it drops below 80% of nominal, upgrade to a LiPo or high-discharge NiMH pack.
Final Recommendation: The Default 2026 Setup
If you are building a standard autonomous rover, line-following robot, or mobile sensor platform and need a reliable baseline that avoids the pitfalls of legacy components, use this exact bill of materials:
- Microcontroller: Arduino Uno R4 Minima ($20) - Offers a 12-bit DAC and hardware PWM channels that eliminate software timer conflicts.
- Motor Controller: SparkFun TB6612FNG Breakout ($12) - MOSFET-based, minimal voltage drop, handles up to 1.2A continuous per channel.
- Actuators: 2x Pololu 6V 30:1 Micro Metal Gearmotors (HP version) ($18 each) - Provides 2.5 kg-cm of torque at 300 RPM, drawing ~0.8A under typical rover load.
- Power: 2S 7.4V 1000mAh LiPo battery with an inline 3A mini blade fuse.
This combination guarantees your driver will not thermally throttle during stall events, your logic levels will interface cleanly without level-shifters, and your mechanical load will have sufficient gear reduction to overcome static friction on startup.






