Let's Make Robots!

Control your motors with L293D

UPDATE

***********************************************************************************************
update 26/4/09
***********************************************************************************************

My 1st instructable  :)

http://www.instructables.com/id/HiTec-Servo-Hack/

***********************************************************************************************
***********************************************************************************************

After long research and trial and error,  I´ve came up to a new walkthrough regarding this nice chip, the L293D.

Each project is one project and each one has its own unique power configurations, so you must be aware of the best battery choice and how to distribute voltage through your robot.

I strongly advice you to read the following articles:

Picking Batteries for your Robot
Once you’ve decided on batteries, how do you regulate the voltage

************************************************

L293D gives you the possibility to control two motors in both directions - datasheet

************************************************

The L293D Circuit:

Basic Implementation:

This is the most basic implementation of the chip.

As you can see, a 5V Voltage Regulator is between the battery and pins 1, 9, 16.

Pin 8 gets power before the VReg, if your motor needs for example 6V you should put 6V directly in this pin, all the other pins should not get more than 5V.

This will work with no problem at all, but if you want to do the right implementation take a look at the next example:

3235657956_b3be2b4f2f.jpg?v=0

3262168342_ae12307934.jpg?v=1240780647

This is the correct Implementation (with the capacitors), and note that pin 8 is feeded by unregulated voltage. This means that if your motors need more than 5V, you should power this pin with that amount of voltage, and the rest of the circuit with 5V.

3235658022_f78495fddd.jpg?v=0
The capacitors stabilize the current.

The same circuit on a breadboard:
3252941552_2f4919475f.jpg?v=1240780044

Soldered on a pcb and ready to go:
3234563157_780312a389.jpg?v=0
3451483356_2fdf26be19.jpg?v=0

3257970545_12de4f710e.jpg?v=0

This is the back of the circuit, click for high resolution photo.

***********************************************************************************************
CODE
***********************************************************************************************

// Use this code to test your motor with the Arduino board:

// if you need PWM, just use the PWM outputs on the Arduino
// and instead of digitalWrite, you should use the analogWrite command

// —————————————————————————  Motors
int motor_left[] = {2, 3};
int motor_right[] = {7, 8};

// ————————————————————————— Setup
void setup() {
Serial.begin(9600);

// Setup motors
int i;
for(i = 0; i < 2; i++){
pinMode(motor_left[i], OUTPUT);
pinMode(motor_right[i], OUTPUT);
}

}

// ————————————————————————— Loop
void loop() {

drive_forward();
delay(1000);
motor_stop();
Serial.println(”1″);

drive_backward();
delay(1000);
motor_stop();
Serial.println(”2″);

turn_left();
delay(1000);
motor_stop();
Serial.println(”3″);

turn_right();
delay(1000);
motor_stop();
Serial.println(”4″);

motor_stop();
delay(1000);
motor_stop();
Serial.println(”5″);
}

// ————————————————————————— Drive

void motor_stop(){
digitalWrite(motor_left[0], LOW);
digitalWrite(motor_left[1], LOW);

digitalWrite(motor_right[0], LOW);
digitalWrite(motor_right[1], LOW);
delay(25);
}

void drive_forward(){
digitalWrite(motor_left[0], HIGH);
digitalWrite(motor_left[1], LOW);

digitalWrite(motor_right[0], HIGH);
digitalWrite(motor_right[1], LOW);
}

void drive_backward(){
digitalWrite(motor_left[0], LOW);
digitalWrite(motor_left[1], HIGH);

digitalWrite(motor_right[0], LOW);
digitalWrite(motor_right[1], HIGH);
}

void turn_left(){
digitalWrite(motor_left[0], LOW);
digitalWrite(motor_left[1], HIGH);

digitalWrite(motor_right[0], HIGH);
digitalWrite(motor_right[1], LOW);
}

void turn_right(){
digitalWrite(motor_left[0], HIGH);
digitalWrite(motor_left[1], LOW);

digitalWrite(motor_right[0], LOW);
digitalWrite(motor_right[1], HIGH);
}

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

no problem at all fritsl!!   :D     I´m glad I could make this so far into the point I can share what I have learned!

I believe that the first thing one should note is.. this works!     May not be the "right way", but it works.

I believe there is a "right way" to do this techy things, but since every techy person has it´s own very opinion about the "right way" to do things, for me (arty person) if it works its perfect!!    :D

Please keep asking and giving feedback, so we all can learn and make this a better tutorial!! But please, let´s try to make this simple...  :)


Your absolutely correct, I've seen and been involved in discussions over which "right way" is THE right way and it usually boils down to if it works then leave it be. (arty way?)

PS. what LED, I can't see any in the diagram only on the board.

The original tutorial was written in September 2008, and this comments are related to that date.

The upgraded version you see now, was made yesterday....    

I'm not being critical at all... I'm just trying to learn too ;) If you don't ask questions then that means you either understand it fully or don't understand it at all (not even enough to form a question). I'm just very inquisitive!
But I do ask questions...   maybe in a compulsive way sometimes  :)

I still don't understand why you are only using one power source to power the motor driver AND the mincrocontroller. It looks like you are sharing 5 volts with the microcontroller and the motors. Shouldn't you use 2 different power sources so the motors get a much higher voltage? The grounds should be shared between the two, but not the voltage (red line).

Also shouldn't the resistor connect voltage to the LED not the LED to ground?

Maybe I'm wrong, feel free to correct me.

EDIT: I guess this does give the benefit of controlling the motor in both directions so it DOES achieve it's goal. I just think the motors would be way underpowered.

I´ve tested the LED and resistor, and seen no diference in connecting the resitor to voltage, or to the ground.

But as DerDude said, it´s a good practice to put the resistor on the red wire before the LED.

Must correct the diagram.

The motors are underpowered yes, they support until 6V.    As soon as I make this with another setup I will post it.

As for the LED i guess you´re right! Thanks!

It shouldn't make any difference, if you put the resistor before or after the LED. But it's a matter of "clean" wiring to put the resistor in the "hot" line, because if you do a short circuit between the cathode and ground you will burn the LED. The other way nothing will happen :-)