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