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.
I would love to do it! But my experience is only with Arduino...  maybe someone can do this tutorial using Picaxe some day!! 

*coughcoughfritscoughcough* sorry, I've been sick for a while....

smooth
Ok, first, I know I asked this already, but I realized that one of us had a communication error. "what are the female headers for, I cant see where they would come in on the circuit diagram" is what I asked in one of my previous comments. Now, what I meant to ask was, What are the two 6-pin female headers that are on the ninth picture you posted for? Now to be a bit more clear, they are right between the "switch" and the plugs for the servo. Thanks. I am sorry for not being clear.

ok!! no problem.. I thought you were asking for the other headers...

The femle headers you see, I use them to connect other stuff for example:

- power goes from the battery to the motor controller board - the female headers are powered if the jumper is placed - this way, I can connect the MCU into the female headers, I can also connect more stuff into these female headers if I want

I hope is more clear now

Thanks for the tutorial!  When I start playing with micro-controllers I'll use it as a reference.  Do you have expierence with the other controllers (Pic Axe, Pololu, Basic Stamp, or BOA's favorite the PIC16F690)? How would you compare them with the Arduino? 

Hopefully, this will not turn into another geek-tosterone laden "My PIC is better than yours" debate....

Hi! Glad you like it!!  :)
I only have experience with Arduino, so I cannot compare it with other microcontrollers.

I know there is a comparison sheet somewhere, but can´t find it right now.

Thanks guibot for this tutorial, Also I would add that this works without changes for the SN754410 since it is pin-compatible with the L293D.  I was able to do this in just a few minutes and it sure works better than my pololu controller.  Now I know the h-bridge chip was OK, but the PIC was borked on that one :-/

:-)

Hi! thanks!!  
It´s good to know this works better than the polulu controller  :D
The SN754410 is pin compatible with the L293D, yes. But not functionally compatible. It's the equivalent of an L293, not an L293D, since it doesn't have clamp diodes built in.