Motor Shield L293D [Componente]

Placa controladora: Arduino Mega 2560

Módulo: Motor Shield L293D V1.0

Nivel: Iniciación a robótica y programación Arduino

Objetivo: Controlar motores de corriente continua, variar su velocidad, invertir su giro y realizar un pequeño proyecto de vehículo robot.

1. ¿Qué placa tenemos?

La placa de tu fotografía es una Motor Shield L293D V1.0, compatible con el diseño Adafruit Motor Shield V1.

Se conecta directamente sobre el Arduino Mega 2560 y permite controlar motores sin tener que construir manualmente el circuito electrónico de potencia.

La compatibilidad con Arduino Mega 2560 está documentada para este diseño de shield.

Características principales

ElementoCapacidad
Motores DCHasta 4 independientes
Motores paso a pasoHasta 2
Servomotores2 conectores
Control de velocidadPWM, valores de 0 a 255
Inversión de giroSí
Controladores principales2 × L293D
Corriente por canal600 mA continuos, 1,2 A de pico
BibliotecaAFMotor

Importante: aunque el circuito L293D admite diferentes tensiones, la alimentación de los motores debe elegirse según los motores utilizados. Además, los L293D producen una caída de tensión apreciable y no son adecuados para motores de gran consumo.

2. Identificar los componentes de la placa

Driving DC Motors with L293D and Arduino
 – Robocraze

robocraze.com

En la placa de tu fotografía encontramos:

ComponenteFunción
M1, M2, M3 y M4Bornes de conexión para motores DC
EXT_PWREntrada de alimentación externa de motores
SERVO1, SERVO2Conexiones para servomotores
Dos circuitos L293DControl de potencia, velocidad y sentido de giro
Circuito 74HC595Gestión de señales de dirección
PWR jumperSelección de alimentación compartida o independiente
RESETReinicio del Arduino
LEDIndicador de alimentación de motores

El shield utiliza determinados pines digitales del Arduino Mega para gestionar internamente los motores. Por ello, no debemos asignar libremente esos mismos pines a otros dispositivos.

3. Material necesario

Para la primera prueba necesitaremos:

  • Un Arduino Mega 2560.
  • La placa Motor Shield L293D V1.0.
  • Un motor DC pequeño, preferiblemente de 6 V.
  • Una fuente de alimentación adecuada al motor.
  • Un cable USB para programar el Arduino.
  • Un ordenador con Arduino IDE.
  • Un destornillador pequeño para los bornes.

Para posteriores prácticas podremos incorporar otros tres motores, ruedas, un chasis, servomotores y sensores.

4. Montaje sobre el Arduino Mega 2560

Motor Control Shield L293D

  1. Desconectamos el Arduino del ordenador y de cualquier alimentación.
  2. Colocamos el Motor Shield encima del Mega, haciendo coincidir las filas de pines del shield con los conectores correspondientes del Arduino.
  3. Comprobamos la orientación y que no haya ningún pin desplazado.
  4. Presionamos suavemente hasta que los conectores estén completamente introducidos.
  5. Verificamos que ningún terminal metálico esté produciendo un cortocircuito.

No debemos intentar conectar el shield a todos los conectores del Mega: este modelo utiliza principalmente la distribución de pines del Arduino UNO, que también está presente en el Mega.

5. Alimentación de los motores

Esta es una de las partes más importantes del montaje.

El Arduino Mega necesita energía para ejecutar el programa, mientras que los motores necesitan energía para moverse.

La mejor opción para las prácticas es utilizar alimentaciones independientes.

Esquema conceptual de alimentación independiente.

Alimentación recomendada para las pruebas

  • Arduino Mega conectado al ordenador mediante USB.
  • Fuente externa para los motores conectada a EXT_PWR.
  • Jumper de alimentación PWR retirado.
  • Cable positivo de la fuente conectado a + y negativo conectado a − del bloque de alimentación.

Precaución: verifica la polaridad impresa en tu placa antes de conectar la fuente. No utilices la salida de 5 V del Arduino para alimentar directamente los motores. Tampoco utilices una pila rectangular de 9 V como solución habitual para varios motores, porque suele entregar poca corriente.

Si se conectan motores pequeños de 6 V, una fuente regulada de 6 V con corriente suficiente puede ser apropiada, teniendo en cuenta que la tensión efectiva en el motor será algo menor debido al L293D.

La alimentación de los servomotores se trata por separado porque los conectores SERVO toman normalmente sus 5 V del Arduino.

6. Instalación de Arduino IDE

Descargamos Arduino IDE desde la web oficial:Descargar Arduino IDE

Conectamos el Arduino Mega al ordenador y abrimos el programa.

En el menú de placas seleccionamos:

Herramientas → Placa → Arduino AVR Boards → Arduino Mega or Mega 2560

Y seleccionamos el procesador:

ATmega2560

Finalmente seleccionamos el puerto USB correspondiente.

Para comprobar la comunicación podemos cargar el ejemplo:

Archivo → Ejemplos → 01.Basics → Blink

Si el LED integrado parpadea, el Arduino está correctamente configurado.

7. Instalar la biblioteca AFMotor

Esta placa utiliza la biblioteca AFMotor, correspondiente a los Motor Shield V1.

No debemos confundirla con Adafruit Motor Shield V2 Library, que está diseñada para otro controlador.

Descargamos la biblioteca:Biblioteca AFMotor — GitHub

En GitHub pulsamos Code → Download ZIP.

Después, en Arduino IDE:

Programa → Incluir librería → Añadir biblioteca .ZIP

Seleccionamos el archivo descargado.

Una vez instalada, comprobamos que podemos incluirla en un programa:

#include <AFMotor.h>

El Arduino Mega 2560 está contemplado expresamente en el código de esta biblioteca.

blog.adafruit.com

+1

Parte práctica: nuestros primeros programas

8. Práctica 1. Hacer girar un motor

Objetivo: conseguir que un motor conectado a M1 funcione durante tres segundos y después se detenga.

Conexiones

  1. Con el circuito desconectado, conectamos los dos cables del motor al borne M1.
  2. Retiramos el jumper PWR.
  3. Conectamos una fuente adecuada a EXT_PWR.
  4. Conectamos el Arduino Mega mediante USB.
  5. Cargamos el programa.

Código completo


#include <AFMotor.h>

// Motor conectado al borne M1
AF_DCMotor motor1(1);

void setup() {
  // Velocidad entre 0 y 255
  motor1.setSpeed(150);
}

void loop() {
  // Girar hacia delante
  motor1.run(FORWARD);
  delay(3000);

  // Detener el motor
  motor1.run(RELEASE);
  delay(2000);
}

¿Qué hace el programa?

AF_DCMotor motor1(1); crea un objeto que representa el motor conectado a M1.

setSpeed(150) establece un valor de velocidad PWM. No significa exactamente 150 revoluciones por minuto, sino un nivel de control dentro de la escala 0–255.

run(FORWARD) ordena girar al motor en uno de los sentidos.

run(RELEASE) deja de alimentar el motor y permite que se detenga libremente. No aplica un frenado activo.

delay(3000) mantiene el programa esperando tres segundos.

Resultado esperado: el motor gira durante tres segundos, se detiene dos segundos y repite el proceso.

9. Práctica 2. Invertir el sentido de giro

Vamos a conseguir que el mismo motor gire alternativamente en ambos sentidos.


#include <AFMotor.h>

AF_DCMotor motor1(1);

void setup() {
  motor1.setSpeed(180);
}

void loop() {
  motor1.run(FORWARD);
  delay(2000);

  motor1.run(RELEASE);
  delay(1000);

  motor1.run(BACKWARD);
  delay(2000);

  motor1.run(RELEASE);
  delay(1000);
}

El motor gira dos segundos hacia delante, descansa uno, gira dos segundos en sentido contrario y vuelve a descansar.

Ejercicio: modifica los tiempos para que cada giro dure cinco segundos y las pausas solo medio segundo.

10. Práctica 3. Regular la velocidad

En esta ocasión aumentaremos la velocidad progresivamente.


#include <AFMotor.h>

AF_DCMotor motor1(1);

void setup() {
  motor1.setSpeed(0);
  motor1.run(FORWARD);
}

void loop() {

  // Aceleracion progresiva
  for (int velocidad = 0; velocidad <= 255; velocidad += 5) {
    motor1.setSpeed(velocidad);
    delay(100);
  }

  delay(1000);

  // Desaceleracion progresiva
  for (int velocidad = 255; velocidad >= 0; velocidad -= 5) {
    motor1.setSpeed(velocidad);
    delay(100);
  }

  motor1.run(RELEASE);
  delay(1000);
}

El motor acelera hasta alcanzar el máximo valor PWM, comienza a reducir su velocidad y finalmente se detiene.

A velocidades muy bajas es posible que el motor no se mueva, aunque reciba una señal PWM. Esto depende de la fricción y de las características del motor.

11. Práctica 4. Controlar cuatro motores simultáneamente

Conectamos cuatro motores, cada uno a su correspondiente borne M1, M2, M3 y M4.


#include <AFMotor.h>

AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);

void setup() {
  motor1.setSpeed(180);
  motor2.setSpeed(180);
  motor3.setSpeed(180);
  motor4.setSpeed(180);
}

void loop() {
  // Arrancar los cuatro motores
  motor1.run(FORWARD);
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);

  delay(3000);

  // Detener los cuatro motores
  motor1.run(RELEASE);
  motor2.run(RELEASE);
  motor3.run(RELEASE);
  motor4.run(RELEASE);

  delay(2000);
}

Resultado esperado: los cuatro motores giran simultáneamente durante tres segundos y se detienen durante dos.

La etiqueta FORWARD no garantiza que todas las ruedas giren hacia delante físicamente, porque depende de cómo estén colocados los motores y de la polaridad de sus cables.

Antes de utilizar los cuatro motores, debemos comprobar que el consumo individual y total es compatible con el shield y con la fuente de alimentación.

12. Práctica 5. Controlar un servomotor

La placa dispone de dos conexiones para servomotores. Podemos utilizarlas, por ejemplo, para girar un sensor de ultrasonidos instalado en un coche robot.

TowerPro SG90 Micro Servo Motor – 180° Rotation for Arduino & Robotics
 – REES52

Conectaremos un servomotor SG90 a SERVO1, respetando el orden de señal, positivo y negativo indicado en la placa.

El conector SERVO1 corresponde al pin digital 9 y SERVO2 al pin 10.

Adafruit Learning System

+1

#include <Servo.h>

Servo servo1;

void setup() {
  servo1.attach(9);
}

void loop() {
  servo1.write(0);
  delay(1000);

  servo1.write(90);
  delay(1000);

  servo1.write(180);
  delay(1000);
}

Resultado esperado: el servomotor se mueve a tres posiciones, esperando un segundo entre ellas.

Los servomotores reciben alimentación de 5 V desde el Arduino en la configuración habitual del shield. Si se utilizan varios servos o modelos de elevado consumo, habrá que estudiar una alimentación independiente apropiada para evitar reinicios y sobrecargas.

13. Pines utilizados por el Motor Shield

Esta información resulta especialmente importante cuando queramos incorporar sensores al Arduino Mega.

Pines digitalesUtilización
11Velocidad M1
3Velocidad M2
5Velocidad M3
6Velocidad M4
4, 7, 8, 12Control interno de dirección
9SERVO1
10SERVO2
2 y 13Disponibles

Los pines indicados corresponden al diseño V1. Los demás pines libres del Mega pueden aprovecharse para sensores, siempre comprobando que no exista conflicto con otros módulos.

Adafruit Learning System

14. Proyecto final: coche robot de cuatro motores

Una vez comprobado el funcionamiento de la placa, podremos construir un vehículo utilizando cuatro motores DC.

4WD car using L293D motor shield — codemahal

codemahal.com

La distribución de motores será:

MotorPosición del vehículo
M1Delantero izquierdo
M2Trasero izquierdo
M3Delantero derecho
M4Trasero derecho

La siguiente programación permite avanzar, retroceder, girar a izquierda y derecha y detener el vehículo.


#include <AFMotor.h>

AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);

void detener() {
  motor1.run(RELEASE);
  motor2.run(RELEASE);
  motor3.run(RELEASE);
  motor4.run(RELEASE);
}

void avanzar() {
  motor1.run(FORWARD);
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);
}

void retroceder() {
  motor1.run(BACKWARD);
  motor2.run(BACKWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD);
}

void izquierda() {
  motor1.run(BACKWARD);
  motor2.run(BACKWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);
}

void derecha() {
  motor1.run(FORWARD);
  motor2.run(FORWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD);
}

void setup() {
  motor1.setSpeed(180);
  motor2.setSpeed(180);
  motor3.setSpeed(180);
  motor4.setSpeed(180);
}

void loop() {
  avanzar();
  delay(2000);

  detener();
  delay(500);

  retroceder();
  delay(2000);

  detener();
  delay(500);

  izquierda();
  delay(1000);

  detener();
  delay(500);

  derecha();
  delay(1000);

  detener();
  delay(2000);
}

Importante: este ejemplo supone que los motores están conectados de forma que FORWARD mueve todas las ruedas hacia delante. Habrá que invertir los cables o ajustar el programa de aquellos motores que giren en sentido contrario. Es preferible hacer la primera prueba con el vehículo levantado, sin que las ruedas toquen el suelo.

Además, comprueba la corriente de bloqueo de cada motor. Los motores TT de algunos kits pueden superar los límites del L293D al arrancar o quedarse atascados.

15. Solución de problemas

ProblemaPosible solución
El código no compila porque falta AFMotor.hInstalar la biblioteca AFMotor V1
El motor no giraComprobar fuente externa, LED indicador y conexiones
El motor gira al revésIntercambiar sus dos cables o invertir el comando
El Arduino se reinicia al arrancar el motorRevisar alimentación y consumo
El motor no gira con PWM bajoAumentar el valor de setSpeed()
El L293D se calienta demasiadoDetener el ensayo y comprobar consumo y posibles bloqueos
Los cuatro motores no funcionan simultáneamenteComprobar fuente, conexiones y corriente de cada motor

16. Actividades de evaluación

Para comprobar que se ha comprendido el funcionamiento, los alumnos deberán resolver estas actividades:

  1. Hacer que M1 gire cinco segundos hacia delante y otros cinco hacia atrás.
  2. Conseguir que M1 y M2 giren a distintas velocidades.
  3. Programar una aceleración progresiva de 0 a 255.
  4. Poner en marcha los cuatro motores y detenerlos en orden inverso.
  5. Crear las funciones avanzar(), retroceder(), izquierda(), derecha() y detener().
  6. Diseñar un recorrido para que un coche describa aproximadamente un cuadrado, ajustando experimentalmente los tiempos de giro.
  7. Incorporar un servomotor que mire alternativamente a izquierda, centro y derecha.

17. Recursos oficiales

Siguiente paso recomendado: comenzar probando un único motor DC en M1 y, una vez verificada la alimentación y el funcionamiento, conectar los cuatro motores.

Para el proyecto del coche con Arduino Mega, cuatro motores y sensor de ultrasonidos sobre un servomotor, esta placa es una buena opción didáctica siempre que los motores no superen su capacidad eléctrica.