Arduino Modules - L298N Dual H-Bridge Motor Controller





Introduction: Arduino Modules - L298N Dual H-Bridge Motor Controller

Quick and simple start guide for using and exploring an L298N Dual H-Bridge Motor Controller module with an Arduino.

The model in the example I am using is from Ebay.

Materials needed:

  • L298N Dual H-Bridge Motor Controller module (various models will work)
  • Male to Female jumper wires
  • An Arduino, any flavor.
  • A DC power supply, 7-35v
  • A motor that is the correct voltage for your power supply used.

Step 1: Getting to Know Your L298N Dual H-Bridge Motor Controller Module:


H-Bridge's are typically used in controlling motors speed and direction, but can be used for other projects such as driving the brightness of certain lighting projects such as high powered LED arrays.

How it works:

An H-Bridge is a circuit that can drive a current in either polarity and be controlled by *Pulse Width Modulation (PWM).

* Pulse Width Modulation is a means in controlling the duration of an electronic pulse. In motors try to imagine the brush as a water wheel and electrons as a the flowing droplets of water. The voltage would be the water flowing over the wheel at a constant rate, the more water flowing the higher the voltage. Motors are rated at certain voltages and can be damaged if the voltage is applied to heavily or if it is dropped quickly to slow the motor down. Thus PWM. Take the water wheel analogy and think of the water hitting it in pulses but at a constant flow. The longer the pulses the faster the wheel will turn, the shorter the pulses, the slower the water wheel will turn. Motors will last much longer and be more reliable if controlled through PWM.


  • Out 1: Motor A lead out
  • Out 2: Motor A lead out
  • Out 3: Motor B lead out
  • Out 4: Mo (Can actually be from 5v-35v, just marked as 12v)
  • GND: Ground
  • 5v: 5v input (unnecessary if your power source is 7v-35v, if the power source is 7v-35v then it can act as a 5v out)
  • EnA: Enables PWM signal for Motor A (Please see the "Arduino Sketch Considerations" section)
  • In1: Enable Motor A
  • In2: Enable Motor A
  • In3: Enable Motor B
  • In4: Enable Motor B
  • EnB: Enables PWM signal for Motor B (Please see the "Arduino Sketch Considerations" section)


  • Double H bridge Drive Chip: L298N
  • Logical voltage: 5V Drive voltage: 5V-35V
  • Logical current: 0-36mA Drive current: 2A (MAX single bridge)
  • Max power: 25W
  • Dimensions: 43 x 43 x 26mm
  • Weight: 26g

*Built-in 5v power supply, when the driving voltage is 7v-35v

Step 2: Wiring to an Arduino:

There are several different models of these L298N Dual H-Bridge Motor Controllers. The generic wiring schematic above should do the trick for most.

Two things to mention;

  • Make sure you have all of your grounds tied together; Arduino, Power source, and the Motor controller.
  • The PWM Pins are unnecessary if you do not want to control PWM features.

Step 3: Arduino Sketch Considerations:

The Arduino code sketch is pretty straight forward. Since there isn’t a library for the L298N Dual H-Bridge Motor Controller you just have to declare which pins the controller is hooked to.

The “int dir(number)Pin(letter)”‘ pins can be connected to any available digital pin you have available, as long as you declare the correct pin in your sketch. This makes the L298N Dual H-Bridge Motor Controller very versatile if your project is using a lot of Arduino pins.

The int“speedPin(letter)” pins need to be connected to a PWM pin on the Arduino if you want to enable speed control through PWM.

As a quick cheat I have included a list of PWM pins for the main two types of Arduino's I use:

  • AT MEGA – PWM: 2 to 13 and 44 to 46. Provide 8-bit PWM output with the analogWrite() function.
  • UNO – PWM: 3, 5, 6, 9, 10, and 11. Provide 8-bit PWM output with the analogWrite() function.

Step 4: Arduino Sketch Example:

This code example I wrote to allow a serial monitor program such as Putty to control the L298N Dual H-Bridge Motor Controller via a keyboard with key presses.


Key .......... Motor

1 ............... Motor 1 Forward

2 ............... Motor 1 Stop

3 ............... Motor 1 Reverse

4 ............... Motor 2 Forward

5 ............... Motor 2 Stop

6 ............... Motor 2 Reverse


  • Fixed the formatting issues (12/29/2014):

Download the attached L298N_Dual_H_Bridge_Keyboard_Control_Reichenstein7.ino

Alternate Download:

2 People Made This Project!


  • Spotless Contest

    Spotless Contest
  • Science of Cooking

    Science of Cooking
  • Microcontroller Contest

    Microcontroller Contest

We have a be nice policy.
Please be positive and constructive.



What is the current limit for this motor deriver module to run high amp motor e.i. more than 3 amp?


I have added a link to the .ino file via Mediafire for those who are still seeing formatting errors.

Why do you connect Pi's 5V to the 5V on the board??

This seems weird. Everywhere else I read that the board will supply 5V when running off 7-12V supply. But they never say you should put 5V from the Pi in it???!

This step is not necessary, I like to tie together rails of equal v-value for stability of my projects (some components are heavier draw than others and v-droop is annoying). What is necessary is to make sure your projects components are always grounded together.

That's not a good idea. In the best case it won't do a thing, in the worst (most likely) case, you are shorting 2 voltage sources that are *not* identical, hence generating a voltage delta across a very small resistor.


I tried this with both of the modules you have in the instructions (one with the blue connectors for the motor on the opposite side, and the other with the yellow motor connectors on the same side). I am trying to control using PWM, so I use this:

// it's value is calculated in another function, where I read a rotary encoder.

// The value is [0-100] with steps of 10

int pwmSpeed;

void setPWM() {

digitalWrite(LOCO_LEFT_PIN, direction == 1 ? HIGH : LOW);

digitalWrite(LOCO_RIGHT_PIN, direction == -1 ? HIGH : LOW);

analogWrite(LOCO_SPEED_PWM_PIN, pwmSpeed);


When I test the code "dry" it all looks good. I turn the rotary encoder 1 click to either side and the values of direction and pwmSpeed are printed out and are correct.

However when I put a loco (model train) on the rails, then whenever I output anything but 0 to the pwm pin, then I just hear a buzz sound from the loco's engine. Any idea why?

it turned out that it works, it's just the nature of low frequency PWM. On higher duty cycles the motor starts to spin. On higher frequency you don't hear the buzz.

According to the L298n'datasheet, their is current sensors on this chip. We can see the output on the "wiring picture" (CSA and CSB pins).
I bought this chip but in the configuration of your first picture .
Any ideas to have an acces to current sensor ?

did you figure out how to use CSA,CSB with arduino?

I already know the way of change the speed of motors, but i wonder how the H-Bridge control the speed ?

Is it possible to double up on the controllers for a moor that has a higher current draw than what is rated for this device?