Вы находитесь на странице: 1из 6

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

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: https://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.

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.

Вам также может понравиться