Controla los motores de corriente continua con el motor L293D IC y Arduino

Tutorial de L293D DC Motor Arduino

Si planeas montar un nuevo robot, necesitarás aprender a controlar los motores de corriente continua. Una de las formas más fáciles y baratas de controlar los motores de corriente continua es interconectar el L293D Motor Driver IC con Arduino. Puede controlar tanto la velocidad como el sentido de giro de dos motores de corriente continua.

Y como bonus, puede incluso controlar un motor de paso unipolar como el 28BYJ-48 o un motor de paso bipolar como el NEMA 17.

Chip controlador de motor paso a paso PsmGoods L293D, 10 unidades
  • Capacidad del canal: 600 mA de corriente de salida / canal.
  • Sistema de activación.
  • Pico de salida de corriente: 1,2 A / canal (no repetitivo).

Controlar un motor de corriente continua

Para tener un control completo sobre el motor de corriente continua, tenemos que controlar su velocidad y dirección de rotación. Esto puede lograrse combinando estas dos técnicas.

  • PWM – Para controlar la velocidad
  • H-Bridge – Para controlar la dirección de rotación

PWM, Para controlar la velocidad

La velocidad de un motor de corriente continua puede ser controlada variando 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 en la que el valor medio 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 o Duty Cycle.

Cuanto mayor sea el ciclo de trabajo, mayor será el promedio de voltaje que se aplica al motor de CC (alta velocidad) y menor será el ciclo de trabajo, menor será el promedio de voltaje que se aplica al motor de CC (baja velocidad).

La siguiente imagen ilustra la técnica PWM con varios ciclos de trabajo y voltajes medios.

Técnica PWM

H-Bridge, Para controlar la dirección de rotación

La dirección de giro del motor de corriente continua puede ser controlada 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 contiene cuatro interruptores con el motor en el centro formando una disposición similar a la del Puente-H.

Cerrar dos interruptores particulares al mismo tiempo invierte la polaridad del voltaje aplicado al motor. Esto causa un cambio en la dirección de giro del motor.

La siguiente imagen ilustra el funcionamiento del circuito H-Bridge.

control de la dirección del motor de funcionamiento del puente H

Pinout L293D Motor Driver IC

L293D pinout

El L293D es un controlador de motor de doble canal H-Bridge capaz de accionar un par de motores de corriente continua o un motor de paso a paso.

Eso significa que puede accionar individualmente hasta dos motores, lo que lo hace ideal para construir plataformas de robots de dos ruedas.

Suministro de energía

El motor L293D IC tiene dos pines de entrada de energía, a saber, ‘Vcc1’ y ‘Vcc2’.

  • Vcc1 se usa para manejar el circuito lógico interno que debe ser de 5V.
  • De la clavija Vcc2, el Puente H obtiene su energía para impulsar los motores que pueden ser de 4.5V a 36V. Y ambos se hunden en un terreno común llamado GND.

Terminales de salida L293D

Los canales de salida del conductor del motor L293D para el motor A y B se llevan a los pines OUT1,OUT2 y OUT3,OUT4 respectivamente.

Puedes conectar dos motores de CC con voltajes entre 4,5 y 36V a estos terminales.

Cada canal del IC puede entregar hasta 600mA al motor de corriente continua. Sin embargo, la cantidad de corriente suministrada al motor depende de la alimentación del sistema.

Pines de control

Para cada uno de los canales de L293D, hay dos tipos de pines de control que nos permiten controlar la velocidad y la dirección de giro de los motores de corriente continua al mismo tiempo, a saber: pines de control de dirección y pines de control de velocidad.

Usando los pines de control de dirección, podemos controlar si el motor gira hacia adelante o hacia atrás. Estos pines en realidad controlan los interruptores del circuito H-Bridge dentro del IC L293D.

El IC tiene dos pines de control de dirección para cada canal. Los pines IN1,IN2 controlan la dirección de giro del motor A mientras que los IN3,IN4 controlan el motor B.

La dirección de giro de un motor puede controlarse aplicando un ALTO (5 voltios) lógico o un BAJO (tierra) lógico a estos pines. El siguiente cuadro ilustra cómo se hace esto.

IN1 IN2 Dirección de giro
Low(0) Low(0) Motor OFF
High(1) Low(0) Adelante
Low(0) High(1) Retroceder
High(1) High(1) Motor OFF

Pines de control de velocidad del L293D

Los pines de control de velocidad, a saber, ENA y ENB, se utilizan para encender, apagar y controlar la velocidad del motor A y del motor B respectivamente.

Tirando de estos pines ALTO hará que los motores giren, tirando de ellos BAJO hará que se detengan. Pero, con la Modulación de Ancho de Pulso (PWM), podemos controlar la velocidad de los motores.

Conectando el motor L293D IC con Arduino UNO

Ahora que sabemos todo sobre el IC, podemos empezar a conectarlo a nuestro Arduino.

Empieza por conectar la fuente de alimentación a los motores. En nuestro experimento estamos usando motores de caja de cambios de corriente continua (también conocidos como motores ‘TT’) que se encuentran normalmente en los robots de dos ruedas motrices. Están clasificados de 3 a 9V. Por lo tanto, conectaremos una fuente de alimentación externa de 9V a la clavija Vcc2.

Luego, necesitamos suministrar 5 voltios para los circuitos lógicos del L293D. Conecta la clavija Vcc1 a la salida de 5V en Arduino. Asegúrate de que compartes todas las tierras del circuito.

Ahora, los pines de entrada y habilitación (ENA, IN1, IN2, IN3, IN4 y ENB) del IC L293D están conectados a seis pines de salida digital de Arduino (9, 8, 7, 5, 4 y 3). Nótese que los pines de salida de Arduino 9 y 3 están ambos habilitados para PWM.

Finalmente, conecta un motor a través de OUT1 & OUT2 y el otro motor a través de OUT3 & OUT4. Puedes intercambiar las conexiones de tu motor, técnicamente, no hay una manera correcta o incorrecta.

Cuando termines, debería tener algo que se parezca a la ilustración que se muestra a continuación.

conexión a Arduino de L293D Motor Driver

Código de Arduino para controlar un motor de corriente continua

El siguiente código te dará una completa comprensión de cómo controlar la velocidad y la dirección de giro de un motor de corriente continua con motor IC L293D y puede 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 que funcione. El código comienza declarando los pines de Arduino a los que están conectados los pines de control de 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 se declaran como OUTPUT digital y se marcan 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 girar ambos motores hacia adelante a máxima velocidad durante dos segundos. Luego invierte el sentido de giro del motor y gira durante otros 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 los dos motores desde cero hasta la velocidad máxima produciendo señales PWM mediante la función analogWrite(), y luego los desacelera de vuelta 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);
}

Ahora veamoslo en vídeo:

Pin It on Pinterest

Shares