An H-bridge motor driver lets a microcontroller run a brushed DC motor in either direction and set its speed. This is the IBT-2 board, built around two BTS7960B driver chips, and it is the one to choose for bigger 12V and 24V motors such as a 775 motor or a windscreen wiper motor. The chips allow up to 43A peak before they limit the current, and they brake the motor as well as drive it. A finned heatsink comes fitted to the underside.
You can use it to drive the wheels of a robot, to move a linear actuator, or to run a 12V pump at a set speed. The motor supply can be anywhere from 6 to 27V and connects to screw terminals, along with the motor. You control it with two PWM pins and two enable pins on a standard 2.54mm header. It is made for 5V logic, so it wires straight to an Arduino Uno, Nano or Mega with jumper wires. A 3.3V board such as an ESP32 needs a logic level converter between its pins and the driver. One driver runs one motor, so a robot with two drive motors needs two.
Specifications
Datasheets
Wiring & getting started
- Get the parts together
You need an Arduino Uno, Nano or Mega, six jumper wires, your motor, a 6 to 27V battery or power supply that can deliver the current your motor draws, an inline fuse holder and a small screwdriver.
- Mount the driver
Fix it on standoffs through the four M3 holes, with room for air to move through the fins. Treat the heatsink as live. It is clamped against copper that carries the motor outputs, so keep it off a metal chassis and away from loose wires.
- Wire the control pins
Connect VCC to the Arduino's 5V and GND to the Arduino's GND. The driver has no 5V supply of its own, so nothing works until VCC is connected. Then connect LPWM to D5, RPWM to D6, L_EN to D7 and R_EN to D8. Leave R_IS and L_IS unconnected. The pin names are printed beside the header.
- Wire the motor and supply
The terminal names are printed on the underside of the board. From the top, with the terminals facing you, they read M-, M+, B+, B- from left to right, and B- is the one beside the capacitor. Connect the motor to M+ and M-. Connect supply minus to B-, and supply plus through the fuse to B+. Check plus and minus before you switch on. The driver has no reverse-polarity protection, and a swapped supply destroys it.
- Run the test code
Upload this sketch to a Nano or Uno. No library is needed.
Example Arduino codeArduino C++
// BTS7960 (IBT-2) test: forward, brake, reverse, brake // LPWM to D5, RPWM to D6, L_EN to D7, R_EN to D8 // VCC to 5V, GND to GND const int LPWM_PIN = 5; const int RPWM_PIN = 6; const int L_EN_PIN = 7; const int R_EN_PIN = 8; void drive(int rightPwm, int leftPwm) { analogWrite(RPWM_PIN, rightPwm); analogWrite(LPWM_PIN, leftPwm); } void setup() { pinMode(RPWM_PIN, OUTPUT); pinMode(LPWM_PIN, OUTPUT); pinMode(R_EN_PIN, OUTPUT); pinMode(L_EN_PIN, OUTPUT); drive(0, 0); digitalWrite(R_EN_PIN, HIGH); // both enables high, or nothing moves digitalWrite(L_EN_PIN, HIGH); } void loop() { drive(100, 0); // one way, about 40% speed delay(2000); drive(0, 0); // brake before changing direction delay(1000); drive(0, 100); // the other way delay(2000); drive(0, 0); delay(1000); } - Check it works
The motor runs one way for 2 seconds, stops for a second, runs the other way for 2 seconds, stops, and repeats. If nothing moves, check that VCC has 5V and that R_EN and L_EN are both connected, because the driver stays off until both are high. If forward and reverse are the wrong way round for your build, swap the M+ and M- wires.
- If it stops under load
The chips switch off when they overheat, and they stay off until both enable pins go low and then high again, or the power is switched off and on. Add a fan blowing through the fins, or run a lower PWM frequency, which makes less heat. Brake to a stop before you reverse a spinning motor, because going straight into reverse draws close to the motor's stall current.

