Arduino DC motor speed and direction control with L293D

This example shows how to control a DC motor speed and direction of rotation using Arduino UNO and L293D motor driver chip.

The L293D quadruple half-H drivers chip allows us to drive 2 motors in both directions, with two PWM outputs from the Arduino we can easily control the speed as well as the direction of rotation of one DC motor. (PWM: Pulse Width Modulation).

Components Required:

  • Arduino UNO board
  • L293D driver
  • 12V DC motor
  • 10K ohm potentiometer
  • Pushbutton
  • 12V source
  • Breadboard
  • Jumper wires

Arduino DC motor control circuit:
Project circuit schematic diagram is the one below.

Arduino DC motor control circuit

The speed of the DC motor (both directions) is controlled with the 10k potentiometer which is connected to analog channel 0 (A0) and the direction of rotation is controlled with the push button which is connected to pin 8 of the Arduino UNO board. If the button is pressed the motor will change its direction directly.
The L293D driver has 2 VCCs: VCC1 is +5V and VCC2 is +12V (same as motor nominal voltage). Pins IN1 and IN2 are the control pins where:

IN1 IN2 Function
L H Direction 1
H L Direction 2
L L Fast motor stop
H H Fast motor stop

As shown in the circuit diagram we need only 3 Arduino terminal pins, pin 8 is for the push button which toggles the motor direction of rotation. Pins 9 and 10 are PWM signal outputs, at any time there is only 1 active PWM, this allows us to control the direction as well as the speed by varying the duty cycle of the PWM signal. The active PWM pin decides the motor direction of rotation (one at a time, the other output is logic 0).

Arduino code:
Arduino code is below.

The video below shows a simple hardware circuit of the example:

And the one below shows example simulation using Proteus:

To be able to simulate this example, Proteus needs the Arduino library which can be downloaded from the link below. After extracting the files (ARDUINO.IDX and ARDUINO.LIB) put it in the Library folder (ex: C:\Program Files\Labcenter Electronics\Proteus 8 Professional\LIBRARY):

Arduino DC motor speed and direction control Proteus simulation file download:


  1. So if you had to stop the motor in between a direction change using only that tactile switch,how would that be done? Like how a garage door operates

    1. You can add a 3rd button to stop the motor whenever this button is pressed regardless of motor direction of rotation and speed.

  2. What should i do if i wanted to add a display to show the percentage of the speed? Can anyone provide me with the code?

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.