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 motor SN754410 tienen exactamente las mismas salidas de pin, por lo que se pueden intercambiar entre ellos sin ningún cambio de hardware / código. La única diferencia es que SN754410 puede suministrar 1A frente 0.6A para el L293D.
El SN754410 es un dispositivo más moderno y por lo tanto tiende a ser 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 necesario añadir ningún componente externo.
Material requerido
|
|
|
|
|
|
|
|
|
|
|
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;
}
}