Controlar motores – Shield L293D con Arduino

El Shield de driver de motor que presento hoy está basado en el original de Adafruit version 1.0 (ya que hoy existe una version 2.0 mejorada) y que permite manejar varios motores de distintos tipos mediante 2 L293D con Arduino en una conveniente placa Shield que podemos conectar a nuestro Arduino UNO, Mega y otros compatibles.

El Shield L293D compatible 1.0

Shield L293D con Arduino 1.0

Mi Shield L293D no es el original de Adafruit (que ya no lo comercializa) sino una versión compatible de DK Electronics (que se vende aun hoy en día). Si quiere conseguir uno y tienen opción, traten de buscar uno que posea conectores superiores para continuar conectando otros Shields. Mi verión no lo posee.

El Shield posee varias características que detallamos a continuación:

  • Posee 2 conectores para servo motores los que poseen una limitación (que no posee la version 2.0) y es que se alimentan de la alimentación de su Arduino, por lo que manejar 2 servos con actividad contínua puede hacer que el controlador de voltaje de su Arduino caliente un poco.
  • Integra 2 L293D donde cada uno brinda un doble puente H con capacidad de manejar 2 motores de corriente continua cada uno bidireccional, o 4 motores de corriente continua en una sola dirección.
  • Posee una entrada de alimentación externa para alimentar los motores conectados a los puentes H de los L293D
  • La alimentación de los motores con los L293D también puede hacerse mediante Vin del Arduino (si usted lo alimenta con una fuente externa) mediante un jumper a tal fin.

Además, los L293D poseen las siguientes características a tener en cuenta para elegir motores apropiados (o para evaluar si puede manejar motores que ya tenga):

  • Alimentación para motores de 4,5V a 36V
  • Alimentación separada para lógica (5V)
  • Corriente máxima de trabajo: 600mA por cada canal (soporta picos de hasta 1,2A)

Les dejo un enlace a la hoja de datos del chip L293/D: http://www.ti.com/lit/ds/symlink/l293.pdf

Pines a considerar usando el Shield L293D con Arduino

La información mas relevante para mi, fue entender que pines de nuestro Arduino se usan para cada caso. En general usted no usará todos los drivers del Shield, y saber que pines estan vinculados a cada salida es importante para luego saber que pines le quedan disponibles. En mi caso los pines analógicos son accesibles (no se usan en el Shield) ya que el mismo Shield posee unos agujeros que puedo aprovechar para soldar pines o un conector para usarlos (recuerde que los pines A0 a A5 tambien pueden usarse para salidas digitales). Pero los pines digitales no lo son, por lo que si tiene un Shield como el mío, deberá ingeniárselas para acceder a los pines digitales que no use en el Shield, o usar un Arduino Mega 2560.

El uso de pines es el siguiente:

  • Servo 1: pin 10
  • Servo 2: pin 9
  • Motor 1: pin 11
  • Motor 2: pin 3
  • Motor 3: pin 6
  • Motor 4: pin 5
  • Shield (shift register): pines 4, 7, 8, 12

Los pines 2 y 13 no se usan. El pin 2 posee un agujero para soldar que facilita su uso. En base a la lista suministrada, usted verá que los pines 4, 7, 8 y 12 son fijos para manejar el Shield y no puede usarlos para otra cosa. El uso del resto de los pines es opcional dependiendo de que desee manejar y lo que no use podrá usarlo para otra función. Los pines A0 a A5 como dije también estan disponibles para uso genérico.

Manejo de Servos en el Shield L293D con Arduino

Las pruebas que realicé las hice con un clásico SG90.

Servo motor SG90 - L293D con Arduino

Este servo motor es muy común y viene con muchos kits de aprendizaje y kits de robots para Arduino. El motor consume unos 6-10mA en reposo. El consumo mientras rota es de 220mA ±20%. El pico de consumo (por ejemplo cuando se le ofrece resistencia), es de unos asombrosos 650mA ±15% lo cual es a tener en cuenta en nuestras aplicaciones, en especial porque los servos son alimentados desde el mismo Arduino.

El Shield no ofrece funcionalidad extra al manejo de servos y el mismo es equivalente a conectar los servos directamente a 5V, GND y el pin que el Shield dice: 10 para el Servo 1 y 9 para el Servo 2. Yo opté por alimentar mi Arduino con una fuente externa de 12V y 1,5A para que sea suficiente para alimentar el servo también. La alimentación básica por USB no será suficiente para que el servo funcione correctamente.

El código para probar los servos conectados al Shield L293D con Arduino sería el siguiente:

// Codigo de prueba para el manejo de servos con Shield
// L293D con Arduino (para la version 1.0 del Shield)
#include <Servo.h>

// Cambie el pin a 9 si conectará su servo al conector Servo2
#define SERVO_PIN 10

// Creamos un objeto del tipo servo para manejar 1 servo.
// Si desea manejar 2 servos al mismo tiempo deberá crear 2 objetos independientes
Servo servo1;

void setup() {
  // Conectamos el objeto con el pin que controlará al servo
  servo1.attach(SERVO_PIN);
  
  // Iniciamos pidiendo al servo que vaya a posición 0, que es todo a la derecha
  servo1.write(0);
}

void loop() {
  // Haremos 5 secuencias de movimientos
  for (int x=0; x<5; x++) {
    // Primero a posición media o 90 grados
    servo1.write(90);
    // Nos quedamos ahi 2 segundos
    delay(2000);
    // Repetimos pero a 180 grados
    servo1.write(180);
    delay(2000);
    // Volvemos a 90 grados
    servo1.write(90);
    delay(2000);
    // Y volvemos a 0 grados para terminar
    servo1.write(0);
    delay(2000);
  }
  
  // Cuando terminamos no hacemos nada. Para iniciar la secuencia de
  // nuevo solo presiones el boton reset en su Arduino o Shield.
  while(1);
}

Manejo de motores de corriente continua mediante el Shield L293D con Arduino

Para la prueba con motor de corriente continua bidireccional, yo usé la librería que Adafruit desarrolló para este Shield la que puede descargar desde aquí: https://github.com/adafruit/Adafruit-Motor-Shield-library/archive/master.zip

Yo conecté un motor con reducción típico de kits de robots para Arduino como el siguiente:

que funciona de 3V a 6V (yo usé los 5V del Arduino pero con fuente externa) y lo conecté al Shield a los 2 pines que corresponden al motor 1 (M1) ubicado cerca de los conectores para servos. Para las pruebas no importa que cable va a que conector, pero para una aplicación práctica será deseable que haga coincidir el FORWARD (hacia adelante) con el movimiento del motor que represente ese movimiento. El código es el siguiente y en mi motor produce ruido (no movimiento) para velocidades demasiado bajas ya que el motor no las soporta, pero esto no implica ningun problema para la prueba:

// Programa de ejemplo para el uso de Shield L293D con Arduino para el manejo 
// de motores de corriente continua bidireccional

// Usamos la librería AFMotor de Adafruit que nos resuelve casi todo
#include <AFMotor.h>

// Creamos un objeto para manejar nuestro motor. Necesitará un objeto 
// por cada motor que desee manejar. Use los números del 1 al 4 
// dependiendo del conector de motor que use de su Shield.
AF_DCMotor motor(1);

void setup() {
  // Encendemos el motor ajustando la velocidad a 200 (255 es el máximo)
  motor.setSpeed(200);
 
  // RELEASE es el estado de parada
  motor.run(RELEASE);
}

void loop() {
  uint8_t i;
  
  // FORWARD es el sentido "hacia adelante" del motor
  motor.run(FORWARD);
  
  // Variamos la velocidad desde 0 (parado) hasta 255 (maximo) 
  for (i=0; i<255; i++) {
    motor.setSpeed(i);  
    delay(10);
  }
 
  // Variamos la velocidad desde 255 hasta 0
  for (i=255; i>0; i--) {
    motor.setSpeed(i);  
    delay(10);
  }
  
  // BACKWARD es el sentido "hacia atras" del motor
  motor.run(BACKWARD);
  
  // Repetimos lo hecho antes con la velocidad
  for (i=0; i<255; i++) {
    motor.setSpeed(i);  
    delay(10);
  }
 
  for (i=255; i>0; i--) {
    motor.setSpeed(i);  
    delay(10);
  }
 
  // Paramos el motor y hacemos 1 segundo de pausa 
  motor.run(RELEASE);
  delay(1000);
} 

Luego de cargar el Sketch en su Arduino IDE, verá el motor girar para un lado y luego para el otro, primero acelerando y luego desacelerando, todo esto en forma continua. Para una mejor experiencia siempre recuerde considerar el uso de una fuente de alimentación externa en su L293D con Arduino.

 

12 comentarios en “Controlar motores – Shield L293D con Arduino”

  1. Muy bueno el artículo Quería consultarte que tipo de batería , voltaje y amperaje conviene utilizar para hacere funcionar dos motores iguales a los del articulo conectados a SHIELD DRIVER MOTOR, L293D?

    • En lo personal no creo que sea efectivo usar baterias para 2 servos. Esos motores tienen picos de más de 650mA. Aun asi, si fueras a intentarlo deberias conseguir una bateria de al menos 5V (6V mejor) y de unos asombrosos 1200mA aunque si deseas alimentar el Arduino y el Shield tambien necesitarás un poco más. No he medido el consumo total conjunto pero podrias hacerlo facilmente con un amperímetro.

    • La librería es “AFMotor.h” y no “AF_Motor”, pero si aun así no te funciona por favor comparte el código que estás probando y trataremos de ayudarte!

  2. hola muy buen dia
    acabo de empesar con arduino, y quiero controlar 4 motores dc con el shiend L293D
    pero me marca error en libreria
    me podrian ayudar como solusiono el problema
    me dise Error copilando para la targeta Arduino/Genuino Uno

    • Hola Ruben, para poder ayudarte con un código, necesitaríamos que compartas el código que estás tratando de compilar y te da error. De otra manera no sabremos que ocurre…

  3. Que tal!
    La página es excelente!
    Tengo una duda, soy nuevo en el mundo arduino y estoy en el proceso de aprendizaje para poder construir algo que tengo en mente. Una de las cosas que quiero hacer es por medio de arduino poder cortar el paso de un líquido. Que debería tener en cuenta a grandes rasgos?
    Muchisimas gracias.

  4. MUCHAS GRACIAS ME AYUDO MUCHO TU PAGINA TENIA CASI MAS DE 5 HORAS TRATANDO DE SOLUCIONARLO Y BUSCABA Y BUSCABA Y NO ENCONTRABA ALGO PARA MI AYUDA GRACIAS POR LA LIBRERIA..

    • Me alegro mucho. La idea es ir fundando las bases para proyectos intermedios y avanzados donde trabajamos con motores y otros sensores o módulos. Gracias por visitarnos!

Deja un comentario