
Si planeas ensamblar tu nuevo amigo robot, eventualmente querrás aprender a controlar motores de CC. La forma más sencilla y económica de controlarlos es conectar el circuito integrado del controlador de motor L293D con el Arduino. Puedes controlar tanto la velocidad como la dirección de giro de dos motores.
Y como beneficio adicional, también puedes controlar un motor paso a paso unipolar como el 28BYJ-48 o un motor paso a paso bipolar como el NEMA 17.
Controlar un motor de CC
Para tener un control completo sobre el motor de CC, debemos controlar su velocidad y dirección de rotación. Esto se puede lograr combinando estas dos técnicas.
- PWM – para controlar la velocidad
- H-Bridge (Puente H): para controlar la dirección de rotación
PWM – para controlar la velocidad
La velocidad de un motor de CC se puede controlar cambiando su voltaje de entrada. Una técnica común para hacer esto es usar PWM (modulación de ancho de pulso)
PWM es una técnica donde el valor promedio del voltaje de entrada se ajusta enviando una serie de pulsos ON-OFF.
El voltaje promedio es proporcional al ancho de los pulsos conocido como Ciclo de Trabajo.
Cuanto mayor sea el ciclo de trabajo, mayor será el voltaje promedio aplicado al motor de CC (lo que da como resultado una velocidad más alta) y cuanto más corto sea el ciclo de trabajo, menor será el voltaje promedio aplicado al motor de CC (lo que da como resultado una velocidad más baja).
La siguiente imagen muestra la técnica PWM con diferentes ciclos de trabajo y voltajes promedio.

Puente H: para controlar la dirección de rotación
La dirección de giro de un motor de CC se puede controlar cambiando la polaridad de su voltaje de entrada. Una técnica común para hacer esto es usar un puente H.
Un circuito de puente H consta de cuatro interruptores con el motor en el centro formando una disposición en forma de H.
Cerrar dos interruptores específicos a la vez invierte la polaridad del voltaje aplicado al motor. Esto provoca un cambio en la dirección de giro del motor.
La siguiente Imagen muestra el funcionamiento del circuito del puente H.

Circuito integrado L293D (Motor Driver)
El L293D es un puente H de dos canales capaz de impulsar un par de motores de CC o un solo motor paso a paso. Esto significa que puede impulsar hasta dos motores individualmente, lo que lo hace ideal para construir una plataforma robótica de dos ruedas.

El L293D se usa con mayor frecuencia para impulsar motores, pero también se puede usar para impulsar cualquier carga inductiva, como un solenoide de relé o un transistor de potencia de conmutación grande.
Es capaz de impulsar cuatro solenoides, cuatro motores de CC unidireccionales, dos motores de CC bidireccionales o un motor paso a paso.
El circuito integrado L293D tiene un rango de suministro de 4,5 V a 36 V y es capaz de generar una corriente de salida máxima de 1,2 A por canal, por lo que funciona muy bien con la mayoría de nuestros motores.
El IC también incluye diodos de retroceso incorporados para evitar daños cuando el motor está des energizado.
Especificaciones técnicas
Aquí están las especificaciones:

Para obtener más detalles, consulta la siguiente hoja de datos.
Configuración de pines IC del controlador de motor L293D
El IC L293D tiene un total de 16 pines que lo conectan con el mundo exterior. El pinout es el siguiente:

Conozcamos todos los pines uno por uno.
Pines de alimentación

El controlador de motor IC L293D en realidad tiene dos pines de alimentación de entrada: VS y VSS.
VS (Vcc2) pin da energía al H-Bridge interno del IC para impulsar los motores. Puede conectar un voltaje de entrada entre 4,5 y 36 V a este pin.
VSS (Vcc1) se utiliza para impulsar el circuito lógico interno que debe ser de 5V.
GND los pines son pines de tierra comunes. Los 4 pines GND están conectados internamente y se utilizan para disipar el calor generado en condiciones de alta carga
Pines de salida

Los canales de salida del controlador de motor L293D para el motor A y B se llevan a los pines OUT1, OUT2, OUT3 y OUT4 respectivamente. Puedes conectar dos motores de CC de 5-36 V a estos pines.
Cada canal en el IC puede entregar hasta 600 mA al motor de CC. Sin embargo, la cantidad de corriente suministrada al motor depende de la fuente de alimentación del sistema.
Pines de control de dirección
Al usar los pines de control de dirección, puedes controlar si el motor gira hacia adelante o hacia atrás. Estos pines en realidad controlan los interruptores del circuito H-Bridge dentro del L293D IC.

El IC tiene dos pines de control de dirección para cada canal. Los pines EN1 y EN2 controlan la dirección de giro del motor A, mientras que EN3 y IN4 controlar la dirección de giro del motor B.
La dirección de giro se puede controlar aplicando lógica ALTA (5V) o lógica BAJA (GND) a estas entradas. La siguiente tabla muestra cómo se hace.

Pines de control de velocidad

Los pines de control de velocidad ENA y ENB se utilizan para encender/apagar los motores y controlar su velocidad.
Colocar estos pines en ALTO hará que los motores giren, mientras que ponerlos BAJO los detendrá. Pero, con la modulación de ancho de pulso (PWM), en realidad puedes controlar la velocidad de los motores.
Conexión de un circuito integrado de controlador de motor L293D a un Arduino
¡Ahora que sabemos todo sobre el IC, podemos comenzar a conectarlo a nuestro Arduino!
Comencemos conectando la fuente de alimentación a los motores. En nuestro experimento, estamos utilizando motores de caja de cambios de CC (también conocidos como motores ‘TT’) que se encuentran comúnmente en los robots de dos ruedas. Están clasificados para 3 a 12V. Por lo tanto, conectaremos la fuente de alimentación externa de 5V al pin VS (Vcc2).
Luego, necesitamos suministrar 5V al circuito lógico del L293D. Conecta el pin VSS (Vcc1) a la salida de 5V en el Arduino. Y asegúrese de que el circuito y Arduino compartan GND común.
Ahora conecta los pines de entrada y habilitación del L293D IC (ENA, IN1, IN2, IN3, IN4 y ENB) a los seis pines de salida digital Arduino (9, 8, 7, 5, 4 y 3). Ten en cuenta que los pines de salida 9 y 3 de Arduino están habilitados para PWM.
Finalmente, conecta un motor a OUT1 y OUT2 y el otro motor a OUT3 y OUT4. Puedes intercambiar las conexiones de tu motor. Técnicamente no hay una manera correcta o incorrecta.
Cuando hayas terminado, deberías tener algo similar a la ilustración que se muestra a continuación.

Código de ejemplo de Arduino
El siguiente esquema te brindará una comprensión completa de cómo controlar la velocidad y la dirección de giro de un motor de CC con el controlador de motor IC L293D y servirá como base para experimentos y proyectos más prácticos.
// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;
void setup() {
// Set all the motor control pins to outputs
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
// Turn off motors - Initial state
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
void loop() {
directionControl();
delay(1000);
speedControl();
delay(1000);
}
// This function lets you control spinning direction of motors
void directionControl() {
// Set motors to maximum speed
// For PWM maximum possible values are 0 to 255
analogWrite(enA, 255);
analogWrite(enB, 255);
// Turn on motor A & B
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(2000);
// Now change motor directions
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(2000);
// Turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
// This function lets you control speed of the motors
void speedControl() {
// Turn on motors
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
// Accelerate from zero to maximum speed
for (int i = 0; i < 256; i++) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
// Decelerate from maximum speed to zero
for (int i = 255; i >= 0; --i) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
// Now turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
Explicación del código:
El código de Arduino es bastante sencillo. No requiere ninguna biblioteca para funcionar. El sketch comienza con la declaración de los pines de Arduino a los que se conectan los pines de control del L293D.
// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;
En la sección de configuración del código, todos los pines de control del motor (tanto los pines de control de dirección como de velocidad) están configurados como SALIDA digital y los pines de control de dirección se ponen en LOW para apagar ambos motores.
void setup() {
// Set all the motor control pins to outputs
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
// Turn off motors - Initial state
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
En la sección de bucle del código, llamamos a dos funciones definidas por el usuario en un intervalo de un segundo.
void loop() {
directionControl();
delay(1000);
speedControl();
delay(1000);
}
Estas funciones son:
- directionControl(): esta función hace que ambos motores giren hacia adelante a la velocidad máxima durante dos segundos. Luego invierte la dirección de giro del motor y gira durante dos segundos. Finalmente apaga los motores.
void directionControl() {
// Set motors to maximum speed
// For PWM maximum possible values are 0 to 255
analogWrite(enA, 255);
analogWrite(enB, 255);
// Turn on motor A & B
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(2000);
// Now change motor directions
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(2000);
// Turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
speedControl(): esta función acelera ambos motores de cero a la velocidad máxima mediante la producción de una señal PWM mediante la función analogWrite() , luego los desacelera de nuevo a cero. Finalmente apaga los motores.
void speedControl() {
// Turn on motors
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
// Accelerate from zero to maximum speed
for (int i = 0; i < 256; i++) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
// Decelerate from maximum speed to zero
for (int i = 255; i >= 0; --i) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
// Now turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
Si quieres conocer los tipos de motores existentes y que deberías conocer para seleccionar el correcto para tu proyecto te recomendamos ller el siguiente tutorial Tipos de Motores y seleción del correcto.
Control DC Motors with L293D Motor Drive IC & Arduino. Last Minute Engineers. https://lastminuteengineers.com/l293d-dc-motor-arduino-tutorial/