L9110S Dual H-Bridge DC & Stepper Motor Driver – Wiring, Arduino Code & Troubleshooting
This L9110S dual H-bridge motor driver module uses two L9110S driver ICs to control two small brushed DC motors independently, or one 4-wire bipolar stepper motor.
This guide covers the module connections, external motor power, Arduino UNO wiring, direction and PWM speed control, a basic stepper example and common troubleshooting steps.
L9110S Module Overview
Inputs A-IA and A-IB control the OA1/OB1 motor output. Inputs B-IA and B-IB control the OA2/OB2 motor output. Reversing the input states reverses the voltage across the corresponding motor.
The pictured AuscomTech module is specified as a 2.5–12V module, but electrical limits published for other L9110S-labelled ICs are not always identical. Do not assume that a different or replacement L9110S board has the same voltage and current ratings simply because the part number is similar. If the board or IC markings differ from this product, verify its specifications before applying power.
Motor Power & Current
The VCC connection powers the motor driver and supplies the energy used by the motors. There is no separate motor-power and logic-power input on this module.
Do not assume the Arduino UNO 5V output can safely power the motor. Motor starting and stall current can be much higher than normal running current. For normal testing, connect a suitable external supply to VCC and GND, then connect the Arduino GND to the same GND.
- Keep the supply voltage within both the module rating and the motor's rated voltage.
- Check the motor stall current, not only its no-load or normal running current.
- The stated 0.8A figure should be treated as an upper driver rating rather than a preferred continuous operating point. Allow practical thermal margin.
- The small PCB and driver ICs can become hot when operating near their current limit.
- The voltage reaching the motor will be somewhat lower than VCC under load because of losses in the H-bridge.
- The onboard power LED indicates that supply voltage is present; it does not confirm that the supply voltage or motor current is safe.
When the Arduino is powered by USB and the motor driver uses a separate supply, connect the external supply negative, module GND and Arduino GND together. Do not connect an external motor-supply positive terminal to the Arduino 5V pin unless both are intentionally the same regulated 5V rail.
Module Connections
The supplied board uses the following control labels. Some listings omit the hyphen and show AIA, AIB, BIA and BIB instead.
| Board Label | Alternative Label | Function |
|---|---|---|
| A-IB | A1-B / AIB | Motor A control input B |
| A-IA | A1-A / AIA | Motor A control input A |
| VCC | + | Motor-driver supply input |
| GND | – | Supply and logic ground |
| B-IB | B1-B / BIB | Motor B control input B |
| B-IA | B1-A / BIA | Motor B control input A |
| OA1 / OB1 | Motor A | First DC motor, or first stepper winding |
| OA2 / OB2 | Motor B | Second DC motor, or second stepper winding |
On the pictured board, with the screw terminals towards you and the 6-pin header along the opposite edge, the header is labelled A-IB, A-IA, VCC, GND, B-IB and B-IA. Always check the silkscreen on the actual module before wiring it.
Arduino UNO Wiring – Two DC Motors
| L9110S Module | Arduino / Supply | Function |
|---|---|---|
| A-IA | D5 | Motor A direction / PWM |
| A-IB | D6 | Motor A direction / PWM |
| B-IA | D9 | Motor B direction / PWM |
| B-IB | D10 | Motor B direction / PWM |
| GND | Arduino GND | Common logic ground |
| VCC | External supply + | Motor and driver power |
| GND | External supply – | Motor supply return |
| OA1 / OB1 | Motor A | First motor |
| OA2 / OB2 | Motor B | Second motor |
All four are PWM-capable pins on the Arduino UNO. This allows either input of each H-bridge to be PWM-controlled for speed adjustment in either direction.
Direction, Stop & PWM Logic
Each motor channel has two logic inputs. The A channel uses A-IA and A-IB, while the B channel works the same way using B-IA and B-IB.
| IA | IB | Motor Result |
|---|---|---|
| HIGH | LOW | Runs in one direction |
| LOW | HIGH | Runs in the opposite direction |
| LOW | LOW | No forward/reverse drive; motor stops |
| HIGH | HIGH | No forward/reverse drive; motor stops |
Which state represents physical “forward” depends on how the motor is mounted and which motor wire is connected to each output terminal. Swap the two motor wires if you want to reverse the physical direction without changing the program.
L9110S implementations from different manufacturers do not all document these states identically. Both equal-input states stop active forward/reverse drive, but the exact output condition can differ. The examples below use both inputs LOW when stopping without relying on a particular braking characteristic.
For PWM speed control, keep one input LOW and apply PWM to the other. Reverse direction by moving the PWM signal to the opposite input.
Arduino Test – Two DC Motors
No additional Arduino library is required for this example. Connect the module as shown above, use an appropriate external motor supply and check the wiring before applying power.
const int A_IA = 5;
const int A_IB = 6;
const int B_IA = 9;
const int B_IB = 10;
void setMotorA(int speedValue) {
speedValue = constrain(speedValue, -255, 255);
// Stop both inputs before changing direction.
digitalWrite(A_IA, LOW);
digitalWrite(A_IB, LOW);
if (speedValue > 0) {
analogWrite(A_IA, speedValue);
} else if (speedValue < 0) {
analogWrite(A_IB, -speedValue);
}
}
void setMotorB(int speedValue) {
speedValue = constrain(speedValue, -255, 255);
// Stop both inputs before changing direction.
digitalWrite(B_IA, LOW);
digitalWrite(B_IB, LOW);
if (speedValue > 0) {
analogWrite(B_IA, speedValue);
} else if (speedValue < 0) {
analogWrite(B_IB, -speedValue);
}
}
void stopMotors() {
digitalWrite(A_IA, LOW);
digitalWrite(A_IB, LOW);
digitalWrite(B_IA, LOW);
digitalWrite(B_IB, LOW);
}
void setup() {
pinMode(A_IA, OUTPUT);
pinMode(A_IB, OUTPUT);
pinMode(B_IA, OUTPUT);
pinMode(B_IB, OUTPUT);
stopMotors();
}
void loop() {
// About 70% PWM duty cycle.
setMotorA(180);
setMotorB(180);
delay(2000);
stopMotors();
delay(1000);
// Reverse both motors.
setMotorA(-180);
setMotorB(-180);
delay(2000);
stopMotors();
delay(2000);
}
Expected Result
Both motors should run for two seconds, stop for one second, then run in the opposite direction for two seconds before stopping again. The sequence then repeats.
If a motor does not start at a PWM value of 180, temporarily test with 255. Small DC motors often need a higher duty cycle to overcome starting friction than they need once already moving.
Using a 4-Wire Bipolar Stepper Motor
The two H-bridges can also drive the two windings of a small 4-wire bipolar stepper motor. Use a multimeter to identify the two separate winding pairs before connecting the motor.
| Stepper Connection | L9110S Module |
|---|---|
| Winding 1, wire A | OA1 |
| Winding 1, wire B | OB1 |
| Winding 2, wire A | OA2 |
| Winding 2, wire B | OB2 |
The L9110S directly applies the motor supply through the H-bridge. Use a small bipolar stepper whose winding current is suitable for the module at the chosen supply voltage. Do not treat this board as a substitute for a current-limited chopper driver used with low-resistance NEMA-style stepper motors.
A 5-wire unipolar stepper such as an unmodified 28BYJ-48 is not a direct match for this 4-wire bipolar connection.
Arduino Stepper Library
The example below uses the official Arduino Stepper library. It is normally available with the Arduino IDE. If the compiler reports that Stepper.h cannot be found, open Library Manager and install Stepper by Arduino.
Set STEPS_PER_REV to the full-step count specified for your actual motor before using the RPM value as a meaningful shaft speed.
#include <Stepper.h>
const int A_IA = 5;
const int A_IB = 6;
const int B_IA = 9;
const int B_IB = 10;
// Change this to match your motor.
const int STEPS_PER_REV = 200;
Stepper motor(
STEPS_PER_REV,
A_IA,
A_IB,
B_IA,
B_IB
);
void releaseMotor() {
// Remove drive from the windings between movements.
digitalWrite(A_IA, LOW);
digitalWrite(A_IB, LOW);
digitalWrite(B_IA, LOW);
digitalWrite(B_IB, LOW);
}
void setup() {
motor.setSpeed(10);
}
void loop() {
motor.step(STEPS_PER_REV);
releaseMotor();
delay(1000);
motor.step(-STEPS_PER_REV);
releaseMotor();
delay(1000);
}
Expected Result
The stepper should move one configured revolution in one direction, pause, then move the same number of steps in the opposite direction. If the motor only vibrates or locks without rotating, check that each output pair is connected to one complete winding rather than mixing wires from the two windings.
A stepper can draw winding current continuously while energised. The example sets all four control inputs LOW after each movement to reduce unnecessary heating during the pause.
Troubleshooting
Power LED does not light
- Measure the voltage directly between module VCC and GND.
- Check supply polarity before reconnecting power.
- Confirm the supply is switched on and capable of providing the required current.
- Do not continue testing if the module becomes hot immediately after power is applied.
Motor does not move
- Confirm the motor supply is present at VCC and GND.
- Confirm Arduino GND and module GND are connected together.
- Check that the motor is connected across one complete output pair: OA1/OB1 or OA2/OB2.
- Verify the corresponding IA and IB pins are connected to the Arduino pins used in the sketch.
- For initial testing, try a PWM value of 255 to rule out insufficient starting duty cycle.
Motor only runs in one direction
- Check both control wires for that motor channel.
- Confirm both Arduino pins are configured as outputs.
- Test the two direction states manually: IA HIGH / IB LOW, then IA LOW / IB HIGH.
- If one control input never changes voltage, inspect the jumper wire and Arduino pin assignment.
Arduino resets when a motor starts
- Use a separate, adequately rated motor supply rather than drawing motor current through the Arduino regulator.
- Make sure the separate supply and Arduino still share a common ground.
- Keep motor-current wiring short and reasonably heavy.
- Add suitable local bulk decoupling at the motor-driver supply if supply dips or wiring inductance are causing resets.
- Check the motor stall current; an undersized supply may collapse when the motor starts.
L9110S chips become very hot
- Disconnect power and check for a stalled motor or shorted output wiring.
- Measure or verify the motor stall current.
- Reduce the mechanical load or use a motor requiring less current.
- Do not use the maximum current figure as a target for continuous operation on the small breakout board.
- If the application requires sustained higher current, use a motor driver with a suitable continuous-current and thermal rating.
Stepper motor only buzzes or vibrates
- Use a multimeter to identify the two winding pairs.
- Connect one complete winding to OA1/OB1 and the other complete winding to OA2/OB2.
- Reduce the commanded RPM during initial testing.
- Confirm the motor is a suitable bipolar stepper and that its winding current is within the driver's capability.
- If rotation is reversed, reverse one winding pair or reverse the commanded step direction.
L9110S-labelled motor-driver ICs are produced by multiple manufacturers and published electrical limits are not identical across all versions. The 2.5–12V and 0.8A figures in this guide relate to the supplied module specification and should not be assumed for unrelated look-alike boards. Always verify motor voltage, stall or winding current, supply polarity and the markings on the actual module before applying power.