Robot con 2 motores de CC y L293D (o SN754410)

Objetivos

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

circuito-integrado-L293D

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

cropped-arduino-1.jpg
  • Arduino Uno o similar. Esta sesión acepta cualquier otro modelo de Arduino.
Img_3_4
  •  Una Protoboard.
chasis-de-vehiculo-robotico-para-arduino-pic-avr-etc-11690-MLM20046960131_022014-O
  • Chasis del robot
circuito-integrado-L293D
  • Un H bridge integrado L293D
Img_3_6-300x185
  • Algunos cables de Protoboard.
motor_CC
  • Dos motores de corriente continua.

 El esquema.

El esquema será exactamente igual al de la entrada anterior, pero conectando el segundo motor.

l293d_arduino_bb

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;
}
}