Si bien eventualmente necesitarás aprender a controlar motores de CC para construir tu propio robot, probablemente necesitarás algo un poco más fácil para comenzar, que es donde entra en juego el controlador de motor L298N. Puede controlar la velocidad, el giro y dirección de dos motores DC. Además, puedes controlar un motor paso a paso bipolar, como el NEMA 17. Para conocer más sobre los distintos tipos de motores te recomendamos leer Tipos de Motores y selección del correcto

Control de un motor DC

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.

Chip de controlador de motor L298N

En el centro del módulo hay un gran chip negro con un disipador de calor grueso: el L298N.

El chip L298N contiene dos puentes H estándar capaces de impulsar un par de motores de CC, lo que lo hace ideal para construir una plataforma robótica de dos ruedas.

El controlador de motor L298N tiene un rango de suministro de 5 V a 35 V y es capaz de generar una corriente continua de 2 A por canal, por lo que funciona muy bien con la mayoría de nuestros motores de CC.

Especificaciones técnicas

Aquí están las especificaciones:

Para obtener más detalles, consulta la siguiente hoja de datos.

Asignación de pines del módulo del controlador del motor L298N

El módulo L298N tiene 11 pines que le permiten comunicarse con el mundo exterior. El pinout es el siguiente:

Vamos a familiarizarnos con cada pin uno por uno.

Pines de alimentación

El módulo del controlador de motor L298N recibe alimentación de un terminal de tornillo de 3 pines, terminal block de 3,5 mm.

El controlador de motor L298N tiene dos pines de alimentación de entrada: VS y VSS.

VS pin de alimentación para el H-Bridge interno del IC, que impulsa los motores. Este pin acepta voltajes de entrada que van desde 5 a 12V.

VSS se utiliza para alimentar el circuito lógico dentro del IC L298N y puede oscilar entre 5 V y 7 V.

GND es el pin de tierra común.

Pines de salida

Los canales de salida del controlador de motor L298N, OUT1 y OUT2 para el motor A y OUT3 y OUT4 para el motor B, están separados hasta el borde del módulo con dos terminales de tornillo de paso de 3,5 mm. Puedes conectar dos motores de CC de 5-12 V a estos terminales.

Cada canal del módulo puede suministrar hasta 2 A al motor de CC. Sin embargo, la cantidad de corriente suministrada al motor depende de la capacidad de la fuente de alimentación del motor.

Pines de control de dirección

Los pines de control de dirección permiten controlar si el motor gira hacia adelante o hacia atrás. Estos pines en realidad controlan los interruptores del circuito H-Bridge dentro del chip L298N.

El módulo tiene dos pines de control de dirección. Los pines IN1 e IN2 controlan la dirección de giro del motor A, mientras que IN3 e IN4 controlan la dirección de giro del motor B.

La dirección de giro del motor se puede controlar aplicando lógica ALTA (5 V) o lógica BAJA (GND) a estas entradas. La siguiente tabla muestra varias combinaciones y sus resultados.

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.

Poner estos pines en ALTO hará que los motores giren, mientras que en BAJO los detendrá. Sin embargo, con la modulación de ancho de pulso (PWM), se puede controlar la velocidad de los motores.

El módulo generalmente viene con un puente en estos pines. Cuando este puente está en su lugar, el motor gira a toda velocidad. Si desea controlar la velocidad de los motores mediante programación, retira los puentes y conéctelos a los pines habilitados para PWM de Arduino.

Regulador y puente de 5 V integrados

El módulo incluye un regulador 78M05 de 5V que se puede habilitar o deshabilitar a través de un puente.

Cuando este puente está en su lugar, el regulador de 5 V está habilitado y la fuente de alimentación lógica (VSS) se deriva de la fuente de alimentación del motor (VS). En este caso, el terminal de entrada de 5V actúa como pin de salida, entregando 5V 0.5A. Puede usarlo para alimentar un Arduino u otro circuito que necesite una potencia de 5V.

Cuando se quita el puente, el regulador de 5V se desactiva y tenemos que suministrar 5V por separado a través del pin VSS.

Advertencia:

Si la fuente de alimentación del motor es inferior a 12 V, puede mantener el puente en su lugar. Si es superior a 12 V, se debe quitar el puente para evitar daños en el regulador de 5 V integrado.

Además, no suministres energía a los pines VSS y VS mientras el puente esté puesto.

Caída de voltaje de L298N

El L298N tiene una caída de voltaje de aproximadamente 2V. Esto se debe al hecho de que los transistores de conmutación internos tienen una caída de voltaje de aproximadamente 1 V cuando están polarizados directamente, y debido a que un puente H requiere que la corriente pase a través de dos transistores, la caída de voltaje total es de 2V.

Por lo tanto, si conecta 12V al terminal de alimentación del motor, los motores recibirán aproximadamente 10 V. Esto significa que un motor de 12 VCC nunca girará a toda velocidad.

Para que el motor funcione a su velocidad máxima, la fuente de alimentación del motor debe tener un voltaje ligeramente superior (+2V) al requisito de voltaje real del motor.

Teniendo en cuenta una caída de voltaje de 2V, si estás utilizando motores de 5V, deberás proporcionar 7V en el terminal de alimentación del motor. Si tienes motores de 12 V, el voltaje de suministro del motor debe ser de 14 V.

Esta caída de voltaje excesiva da como resultado una disipación de energía significativa en forma de calor. Esta es la razón por la que los controladores de motor basados ​​en L298N requieren un gran disipador de calor.

Cableado del controlador de motor L298N a un Arduino

¡Ahora que sabemos todo sobre el módulo, podemos comenzar a conectarlo a nuestro Arduino!

Comencemos conectando la fuente de alimentación del motor. En nuestro experimento, estamos utilizando motores de caja de cambios de CC, también llamados motores “TT”, que a menudo se encuentran en robots de dos ruedas motrices. Están clasificados para 3 a 12V. Por lo tanto, conectaremos una fuente de alimentación externa de 12V al terminal VS. Debido a que L298N tiene una caída de voltaje de aproximadamente 2V, los motores recibirán 10V y girarán a RPM ligeramente más bajas. Pero eso está bien.

Luego, necesitamos suministrar 5V al circuito lógico del L298N. Usaremos el regulador de 5V incorporado para extraer 5V de la fuente de alimentación del motor, así que mantén el puente 5V en su lugar.

Ahora conecta los pines de entrada y habilitación del módulo L298N (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 al terminal A (OUT1 y OUT2) y el otro al terminal B (OUT3 y OUT4). Puedes cambiar las conexiones de tu motor. Técnicamente no hay una manera correcta o incorrecta.

Código de ejemplo de Arduino

El siguiente esquema te mostrará cómo controlar la velocidad y la dirección de giro de un motor de CC utilizando el controlador de motor L298N y puede servir como base para experimentos y proyectos más prácticos.

El esquema mueve el motor en una dirección durante una revolución, luego en la dirección opuesta. También hay algo de aceleración y desaceleración involucrada.

Al acelerar o desacelerar el motor, es posible que escuches un zumbido, especialmente en valores de PWM más bajos. Esto es normal; no hay nada de qué preocuparse. Esto sucede porque el motor de CC requiere una cantidad mínima de voltaje para funcionar.

// 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 Arduino es bastante simple. No requiere ninguna biblioteca para funcionar. El código comienza declarando los pines de Arduino que están conectados a los pines de control del L298N.

// 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, incluidos los pines de control de dirección y velocidad, están configurados como SALIDA digital. Y los pines de control de dirección se ponen en BAJO para desactivar inicialmente 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 del bucle del código, llamamos a dos funciones definidas por el usuario con un retraso de un segundo.

Estas funciones son:

void loop() {
	directionControl();
	delay(1000);
	speedControl();
	delay(1000);
}

directionControl(): Esta función hace que ambos motores giren a toda velocidad durante dos segundos. Luego invierte la dirección de giro de los motores y gira durante otros dos segundos. Finalmente, detiene 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 usa la función analogWrite() para generar una señal PWM que acelera ambos motores de cero a la velocidad máxima antes de desacelerarlos nuevamente a cero. Finalmente, detiene 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);
}

Interface L298N DC motor driver module with Arduino. Last Minute Engineers. https://lastminuteengineers.com/l298n-dc-stepper-driver-arduino-tutorial/