Está en la página 1de 15

Microcontrolador

Objetivos

 Con el integrado L293D control de un robot.
 aprender a controlar motores de corriente continua y controladores de motores
basados en puentes H.

El controlador de motor L293D y el controlador del motorSN754410 tienen exactamente


las mismas salidas de pin, por lo quese pueden intercambiar entre ellos sin ningún
cambio de hardware /código. La única diferencia es que SN754410 puede
suministrar 1Afrente 0.6A para el L293D.
El SN754410 es un dispositivo más moderno y por lo tanto tiende aser más barato de
comprar. El L293D, asegúrate de comprar uno con la ‘D’ al final, ya
que tiene los diodos internos y no es necesarioañadir ningún componente externo.

Material requerido

 Arduino Uno o similar. Esta sesión


acepta cualquier otro modelo de
Arduino.
 Una Protoboard.

 Chasis del robot

 Un H bridge integrado L293D

 Algunos cables de Protoboard.

 Dos motores de corriente continua.

El esquema.
El esquema será exactamente igual al de la entrada anterior, pero conectando el segundo
motor.
El programa.
//Testeando Motores con L293D
//Definimos pins
//Motor A
int enableA = 5;
int motorA1 = 6;
int motorA2 = 7;
//Motor B
int enableB = 8;
int motorB1 = 9;
int motorB2 = 10;
void setup() {

Serial.begin (9600);
//configuración
pinMode (enableA, OUTPUT);
pinMode (motorA1, OUTPUT);
pinMode (motorA2, OUTPUT);

pinMode (enableB, OUTPUT);


pinMode (motorB1, OUTPUT);
pinMode (motorB2, OUTPUT);

}
void loop() {
//activamos motor A
Serial.println (“Activamos motores”);
digitalWrite (enableA, HIGH);
digitalWrite (enableB, HIGH);
delay (1000);

//Nos movemos

Serial.println (“Hacia delante”);


digitalWrite (motorA1, LOW);
digitalWrite (motorA2, HIGH);
digitalWrite (motorB1, LOW);
digitalWrite (motorB2, HIGH);
//Durante 3 segundos

delay (3000);

Serial.println (“Hacia atrás“);


digitalWrite (motorA1,HIGH);
digitalWrite (motorA2,LOW);
digitalWrite (MotorB1,HIGH);
digitalWrite (MotorB2,LOW);
//Durante 3 segundos

delay (3000);
Serial.println (“Paramos motores”);
//stop
digitalWrite (enableA, LOW);
digitalWrite (enableB, LOW);
delay (3000);
}
Pero podemos mejorar esta programación. Escribiremos código para controlar mediante
ordenador el robot con 2 motores CC desde el puerto serie.
// declaración de variables
char val;
int enableA = 5; //velocidad motor A
int dirmotorA1 = 6; // direccion motor a
int dirmotorA2= 7; // direccion motor a
int enableB = 8; //velocidad motor B
int dirmotorB1 = 9; // direccion motor b
int dirmotorB2= 10; // direccion motor b
int velocidad = 120;
//Métodos para el control adelante, atras, derecha
// izquierda y stop
void adelante(){
digitalWrite (dirmotorA1,HIGH);// gira motor A derecha
digitalWrite (dirmotorA2,LOW);
analogWrite (enableA, velocidad);
digitalWrite (dirmotorB1,LOW);// gira motor B izquierda
digitalWrite (dirmotorB2,HIGH);
analogWrite (enableB, velocidad);
}
void atras(){
digitalWrite (dirmotorA1,LOW);// gira motor A izquierda
digitalWrite (dirmotorA2,HIGH);
analogWrite (enableA, velocidad);
digitalWrite (dirmotorB1,HIGH);// gira motor B derecha
digitalWrite (dirmotorB2,LOW);
analogWrite (enableB, velocidad);
}
void izquierda(){
digitalWrite (dirmotorA1,HIGH);// gira motor A derecha
digitalWrite (dirmotorA2,LOW);
analogWrite (enableA, velocidad);
digitalWrite (dirmotorB1,HIGH);// gira motor B derecha
digitalWrite (dirmotorB2,LOW);
analogWrite (enableB, velocidad);
}
void derecha(){
digitalWrite (dirmotorA1,LOW);// gira motor A izquierda
digitalWrite (dirmotorA2,HIGH);
analogWrite (enableA, velocidad);
digitalWrite (dirmotorB1,LOW);// gira motor B izquierda
digitalWrite (dirmotorB2,HIGH);
analogWrite (enableB,velocidad);
}
void paro(){
digitalWrite (dirmotorA1,HIGH);// para motor A
digitalWrite (dirmotorA2,HIGH);
analogWrite (enableA, 0);
digitalWrite (dirmotorB1,HIGH);// para motor B
digitalWrite (dirmotorB2,HIGH);
analogWrite (enableB, 0);
}
// comenzamos parando los motores
void setup(){
int i;
for(i=5;i<11;i++){
pinMode(i, OUTPUT); //poner pin 5,6,7,8,9,10,11 de salida
}
Serial.begin(9600);
paro();
}
// Y el bucle principal
void loop() {
if( Serial.available() ) {
val = Serial.read();
}
switch (val) {
case ‘s’:
paro();
break;
case ‘a’:
adelante();
break;
case ‘r’:
atras();
break;
case ‘i’:
izquierda();
break;
case ‘d’:
derecha();
break;
}
}
QUE ES Y PARA QUE SIRVE EL PUENTE H L293B
En las mayoría de las aplicaciones electrónicas orientadas a Reboticas nos vemos
en la necesidad de controlar y generar movimientos. Según la naturaleza del
requerimiento recurrimos a Servo Motores o Motores de continua.
Me interesa mostrarles la forma adecuada de controlar un motor de continua, para
esto necesitamos controlar dos variables (Dirección y Velocidad).

CONTROL DE DIRECCIÓN DE GIRO MEDIANTE EL PUENTE H


L293B
Un motor de continua determina su dirección de giro en función de la tensión entre
sus terminales, es decir si conectamos el termina 1 del motor al Positivo de la pila
y el terminal 2 del motor al Negativo de la pila, obtendremos un sentido de giro
determinado, si lo conectamos en forma opuesta obtendremos el sentido de giro
contrario.

Para lograr este cambio controlado de polaridad nos apoyamos en un circuito


integrado conocido como Puente H(es una disposición circuital de transistores y
diodos que nos permite controlar la polaridad de dos terminales de salida en función de
unas entradas lógicas), como caso particular hablare del Puente H L293B.

DIAGRAMA DE CONEXIÓN DEL PUENTE H L293B


Este solo integrado nos permite controlar dos motores en simultaneo. los
terminales del Motor M1 conectados a los Pines 3 y 6 y los terminales del motor
M2 a los terminales 11 y 14, como se ilustra en la figura.

El pin 16 corresponde a la alimentación propia del integrado, 5V, el Pin 16 deberá


estar conectado a la tensión que alimentara los motores, puede variar en el rango
de (5 a 36) V.

Es importante tener en cuenta que este integrado se alimenta con dos niveles de
tensión diferente, uno corresponde a la alimentación propia de integrado, que no
debe ser superior a 7V(VSS) y otra es la tensión con la que alimentaremos los
motores, pudiendo en este ultimo hacerlo con hasta 36V(VC).

Como controlar el giro del Motor


Fácil, el movimiento de giro corresponderá a la siguiente tabla de verdad
Colocando Niveles Altos y bajos en los Pines 2 y 7 Logramos controlar la tensión
de salida de los terminales 3 y 6.

Como controlo la velocidad de un motor de continua


Para controlar la velocidad del motor nos basamos en la tecnica PWM
(Modulacion por ancho de pulso), que basicamente consiste en “apagar” y
“encender” la señal de entrada de manera de reducir la potencia suministrada al
motor.
Para mas detalle leer el apartado siguiente Modulación por ancho de pulsos PWM

DIAGRAMA PARA CONTROLAR EL PUENTE H L293B CON


ARDUINO
En el siguiente diagrama se conectan dos motores al puente H L293B que sera
controlado por la placa arduino.
CODIGO PARA IMPLEMENTAR CON ARDUINO
//Programa para controlar 2 motores con control de velocidad y giro con
un L293

int switchPin = 7; // switch para cambiar el sentido de giro de los


motores

int motor1Pin1 = 3; // Motor 1 adelante

int motor1Pin2 = 4; // Motor 1 atras

int speedPin1 = 9; // Motor 1 aceleracion (PWM) Pin enable del L293

int potPin = 0; // Potenciometro para controlar velocidad motor 1

int ledPin = 13; // LED


//int switchPin2 = 8; // No implementado

int motor2Pin1 = 5; // Motor 2 adelante

int motor2Pin2 = 6; // Motor 2 atras

int speedPin2 = 10; // Motor 2 aceleracion (PWM) Pin Enable del L293

int potPin2 = 1; // Potenciometro para controlar velocidad motor 2

int speedpin = 0; // tasa de velocidad a la que Arduino envia los d


atos

void setup() {

Serial.begin (9600);

//configuracion de pines

pinMode(switchPin, INPUT);

//pinMode(switchPin2, INPUT); //no usado

// Control Motor 1

pinMode(motor1Pin1, OUTPUT);

pinMode(motor1Pin2, OUTPUT);

pinMode(speedPin1, OUTPUT);
//Control Motor 2

pinMode(motor2Pin1, OUTPUT);

pinMode(motor2Pin2, OUTPUT);

pinMode(speedPin2, OUTPUT);

pinMode(ledPin, OUTPUT);

// Establece speedPinX en modo High para poder controlar la velocidad

digitalWrite(speedPin1, HIGH);

digitalWrite(speedPin2, HIGH);

// comprobacion de reseteo, si el led parpadea solo 3 veces, todo esta


bien

// si vuelve a parpadear, significa que ha hecho un reset, revisar cone


xiones

// por si hubiera un corto

blink(ledPin, 3, 100);

void loop() {

//Si el switch no esta pulsado, gira en una direccion, si no en la co


ntraria
if (digitalRead(switchPin) >0) {

digitalWrite(motor1Pin1, LOW); // Establece el sentido de giro


del motor 1

digitalWrite(motor1Pin2, HIGH); //

speedpin = analogRead(potPin); // Lectura del valor del potenc


iometro

speedpin = 800 + (speedpin/6); // Para establecer la velocidad


de giro

analogWrite (speedPin1, speedpin); //

Serial.print("motor 1 = "); //

Serial.println(speedpin); //

delay (50); //

digitalWrite(motor2Pin1, LOW); // Establece el sentido de giro


del motor 2

digitalWrite(motor2Pin2, HIGH); //

speedpin = analogRead(potPin2); // Lectura del valor del potenc


iometro

speedpin = 800 + (speedpin/6); // Para establecer la velocidad


de giro

analogWrite (speedPin2, speedpin); //


Serial.print("motor 2 = "); //

Serial.println(speedpin); //

delay(50); //

else {

digitalWrite(motor1Pin1, HIGH); // Establece el sentido de giro


del motor 1

digitalWrite(motor1Pin2, LOW); //

speedpin = analogRead(potPin); // Lectura del valor del potenc


iometro

speedpin = 800 + (speedpin/6); // Para establecer la velocidad


de giro

analogWrite (speedPin1, speedpin); //

Serial.print("motor 1 = "); //

Serial.println(speedpin); //

delay (50); //

digitalWrite(motor2Pin1, HIGH); // Establece el sentido de giro


del motor 2

digitalWrite(motor2Pin2, LOW); //
speedpin = analogRead(potPin2); // Lectura del valor del potenc
iometro

speedpin = 800 + (speedpin/6); // Para establecer la velocidad


de giro

analogWrite (speedPin2, speedpin); //

Serial.print("motor 2 = "); //

Serial.println(speedpin); //

delay(50); //

/*

Parpadeo del led, Significa que ha ejecutado la funcion setup()

si todo va bien, solo parpadea tres veces, si hay algun error que reset
ee el arduino,

volvera a verse el parpadeo del led

*/

void blink(int whatPin, int howManyTimes, int milliSecs) {

int i = 0;

for ( i = 0; i < howManyTimes; i++) {

digitalWrite(whatPin, HIGH);

delay(milliSecs/2);

digitalWrite(whatPin, LOW);
delay(milliSecs/2);

http://www.iescamp.es/miarduino/2016/02/22/robot-con-2-motores-de-cc/

http://www.electrontools.com/Home/WP/2016/03/09/como-funciona-el-puente-h-l293b/

También podría gustarte