Control de motores de corriente continua con ESP32 y módulo L298N

Si estás pensando en construir un robot controlado por Wi-Fi utilizando un ESP32, ¡estás a punto de embarcarte en un proyecto emocionante y educativo! Uno de los componentes más cruciales que necesitarás es un controlador de motor que te permita gestionar los motores de corriente continua (DC). Para esto, el módulo controlador de motor L298N es una opción popular. Este dispositivo no solo es accesible, sino que también es extremadamente efectivo para controlar la velocidad y la dirección de dos motores, lo que lo hace ideal para tu robot de tracción de dos ruedas.

En este tutorial, profundizaremos en cómo conectar el módulo L298N a tu ESP32, controlar la velocidad y dirección de tus motores DC, y ¡hacer que tu robot se mueva!

Índice de contenido
  1. Fundamentos de control de motores
    1. Controlando la dirección con un H-Bridge
    2. Controlando la velocidad con PWM
  2. Módulo controlador de motor L298N
    1. Potencia del L298N
    2. Protección térmica
    3. Especificaciones técnicas
  3. Pinout del módulo controlador de motor L298N
    1. Pines de alimentación
    2. Pines de salida del motor
    3. Pines de control de dirección
    4. Pines de control de velocidad
  4. Caída de voltaje del L298N
  5. Regulador de 5V a bordo y jumper
  6. Conectar un módulo controlador L298N a un ESP32
  7. Configuración del IDE de Arduino
  8. Código de ejemplo
    1. Explicación del código

Fundamentos de control de motores

Antes de sumergirnos en el funcionamiento del controlador L298N, es fundamental entender dos conceptos clave en el control de motores:

  • Circuito H-Bridge – Permite controlar la dirección de rotación del motor.
  • PWM (Modulación por ancho de pulso) – Ayuda a controlar la velocidad de un motor DC.

Controlando la dirección con un H-Bridge

Los motores DC son de los más sencillos de usar. Al conectar un voltaje, el motor girará en una dirección, y si invertimos la polaridad, girará en la dirección opuesta. Sin embargo, esto no es siempre práctico. Aquí es donde entra en juego un H-bridge.

Un H-bridge es un circuito especializado que consta de cuatro interruptores electrónicos dispuestos en forma de "H", con el motor en el centro. Al activar estos interruptores en un orden específico, se puede hacer que la corriente fluya a través del motor en una dirección o en la opuesta. Esto permite controlar la rotación del motor sin necesidad de cambiar físicamente los cables.

Controlando la velocidad con PWM

Cuando a un motor DC se le aplica un voltaje constante, gira a una velocidad fija. Si queremos cambiar la velocidad, es necesario ajustar el voltaje. Sin embargo, modificar el voltaje continuamente no es práctico. Aquí es donde entra en juego la modulación por ancho de pulso (PWM).

PWM controla la cantidad promedio de energía que se envía al motor, encendiendo y apagando el voltaje en rápida sucesión. La duración de cada pulso se conoce como ciclo de trabajo:

  • Si el voltaje se mantiene encendido más tiempo (pulso más amplio), el motor gira más rápido.
  • Si se apaga más tiempo (pulso más estrecho), el motor gira más despacio.

Módulo controlador de motor L298N

En el corazón del módulo se encuentra el chip L298N, que cuenta con un disipador de calor. Este chip es un controlador de puente completo de alta corriente y alta tensión diseñado para manejar cargas inductivas como motores DC, motores paso a paso, relés y solenoides.

El L298N actúa como un amplificador de corriente, recibiendo señales de baja corriente de un ESP32 y elevándolas a niveles de corriente y voltaje más altos necesarios para operar los motores.

Potencia del L298N

El L298N es versátil en términos de potencia, funcionando con un rango de voltajes de 5V a 46V y puede suministrar hasta 2A de corriente continua por canal. Esto significa que puede manejar desde pequeños motores de hobby hasta motores más grandes y potentes.

Protección térmica

Además, el L298N incluye protección térmica integrada. Si el chip se calienta demasiado, probablemente debido a un motor que extrae demasiada corriente, el L298N apagará temporalmente sus salidas para evitar daños. Una vez que se enfría, comienza a funcionar nuevamente.

Especificaciones técnicas

A continuación se presentan las especificaciones más relevantes del L298N:

  • Tensión de entrada: 5V a 46V
  • Corriente máxima por canal: 2A
  • Tipo de circuito: Puente H dual

Pinout del módulo controlador de motor L298N

El módulo L298N cuenta con un total de 11 pines. A continuación, desglosaremos cada grupo de pines y sus funciones.

Pines de alimentación

El módulo tiene dos pines de entrada de alimentación: VS y VSS.

  • VS: Entrada principal de energía para los motores. Puede manejar voltajes de 5V a 46V, pero recuerda que la tensión que recibirán los motores será aproximadamente 2V menor debido a la caída de voltaje interna.
  • VSS: Alimentación para la lógica interna del chip, que requiere 5V. Puedes conectarlo a una fuente externa de 5V o usar el regulador de 5V integrado.
  • GND: Conexión a tierra común para el módulo.

Pines de salida del motor

Estos son los pines a los que se conectan los motores DC.

  • OUT1 y OUT2: Conectan al primer motor (motor A).
  • OUT3 y OUT4: Conectan al segundo motor (motor B).

Pines de control de dirección

Estos pines controlan la dirección de rotación de los motores al encender y apagar los interruptores del H-bridge:

  • IN1 y IN2: Controlan la dirección del motor A.
  • IN3 y IN4: Controlan la dirección del motor B.

Pines de control de velocidad

Los pines ENA y ENB permiten gestionar la velocidad de los motores. Funcionalmente, funcionan como interruptores:

  • Al activar uno de estos pines, el motor correspondiente gira a velocidad máxima.
  • Al desactivarlo, el motor se apaga por completo.
  • Usando PWM en estos pines, se puede controlar la velocidad de cada motor.

Caída de voltaje del L298N

Es importante entender que cuando un transistor está en estado "encendido", siempre hay una pequeña caída de voltaje a través de él. En el L298N, los transistores bipolares dentro del circuito H-bridge presentan caídas de voltaje significativas cuando llevan corriente.

Según la hoja de datos, la caída de voltaje puede oscilar entre 1.8V y 3.2V con una corriente de alrededor de 1A, y puede alcanzar casi 5V cuando la corriente llega a 2A.

En uso típico, se puede asumir una caída de aproximadamente 2V. Esto significa que si conectas 12V al suministro de energía del motor (VS), tus motores recibirán aproximadamente 10V. Para que el motor funcione a su máxima velocidad, deberías suministrar un voltaje aproximadamente 2V superior al que necesita tu motor.

Regulador de 5V a bordo y jumper

El módulo controlador L298N incluye un regulador de voltaje 78M05 que convierte la energía del suministro de motor en un suministro de 5V estable para la lógica interna del chip.

Hay un pequeño jumper que permite habilitar o deshabilitar este regulador:

  • Con el jumper en su lugar: El regulador está habilitado y ofrece hasta 0.5A para alimentar un ESP32 u otros componentes pequeños.
  • Con el jumper retirado: El regulador está deshabilitado y necesitas proporcionar 5V desde una fuente externa.

Conectar un módulo controlador L298N a un ESP32

Ahora que entendemos cómo funciona el módulo L298N, podemos proceder a conectarlo al ESP32. Para este experimento, utilizaremos motores TT, que son comunes en robots de tracción de dos ruedas y operan mejor con voltajes entre 3V y 6V. Dado que el módulo L298N causa una caída de voltaje de aproximadamente 2V, conectaremos una fuente externa de 6V al terminal VS.

Para proporcionar 5V a la lógica del L298N, aprovecharemos el regulador de 5V a bordo, dejando el jumper en su lugar. Luego, conectaremos los pines de control: IN1, IN2, IN3 e IN4 a los pines GPIO 27, 26, 25 y 33 del ESP32.

Para controlar la velocidad de los motores, retiraremos los jumpers en ENA y ENB, y los conectaremos a los pines GPIO 14 y 32 del ESP32. Finalmente, conectaremos los motores a los terminales de salida en el módulo L298N.

Pines del L298NPines del ESP32
IN1GPIO 27
IN2GPIO 26
IN3GPIO 25
IN4GPIO 33
ENAGPIO 14
ENBGPIO 32

Configuración del IDE de Arduino

Usaremos el IDE de Arduino para programar el ESP32. Asegúrate de tener instalado el complemento ESP32 antes de continuar.

Código de ejemplo

A continuación, presentamos un código simple que muestra cómo controlar la dirección y velocidad de dos motores DC utilizando el controlador L298N y un ESP32. Este ejemplo te brindará una experiencia práctica en el uso del L298N para controlar la velocidad y dirección de los motores.


// Conexiones del Motor A
int enA = 14;  // Pin ENA
int in1 = 27;  // Pin IN1
int in2 = 26;  // Pin IN2

// Conexiones del Motor B
int enB = 32;  // Pin ENB
int in3 = 25;  // Pin IN3
int in4 = 33;  // Pin IN4

// Propiedades de PWM
const int freq = 1000;        // Frecuencia de PWM
const int pwmChannelA = 0;    // Canal PWM para motor A
const int pwmChannelB = 1;    // Canal PWM para motor B
const int resolution = 8;     // Resolución de 8 bits (0-255)

void setup() {
  // Configura todos los pines de control del motor como salidas
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  
  // Configura PWM para control de velocidad de motor usando nueva API
  ledcAttachChannel(enA, freq, resolution, pwmChannelA);
  ledcAttachChannel(enB, freq, resolution, pwmChannelB);
  
  // Apaga los motores - Estado inicial
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  
  // Establece el ciclo de trabajo inicial de PWM a 0 (motores apagados)
  ledcWrite(enA, 0);
  ledcWrite(enB, 0);
}

void loop() {
  controlarDireccion();
  delay(1000);
  controlarVelocidad();
  delay(1000);
}

// Esta función permite controlar la dirección de giro de los motores
void controlarDireccion() {
  // Establecer motores a velocidad máxima
  ledcWrite(enA, 255);
  ledcWrite(enB, 255);
  
  // Enciende motor A & B (dirección hacia adelante)
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  delay(2000);
  
  // Cambia la dirección de los motores (dirección inversa)
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  delay(2000);
  
  // Apaga los motores
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
}

// Esta función permite controlar la velocidad de los motores
void controlarVelocidad() {
  // Enciende motores (dirección inversa)
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  
  // Acelera de cero a velocidad máxima
  for (int i = 0; i < 256; i++) {
    ledcWrite(enA, i);
    ledcWrite(enB, i);
    delay(20);
  }
  
  // Desacelera de velocidad máxima a cero
  for (int i = 255; i >= 0; --i) {
    ledcWrite(enA, i);
    ledcWrite(enB, i);
    delay(20);
  }
  
  // Apaga los motores
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
}

Al acelerar o desacelerar un motor DC, es posible que escuches un sonido de zumbido, especialmente a valores de PWM bajos. Esto es completamente normal, ya que los motores DC requieren un voltaje mínimo para comenzar a girar, y a valores bajos de PWM, el voltaje podría no ser suficiente para mantener el motor funcionando sin problemas.

Explicación del código

Al inicio del código, declaramos qué pines del ESP32 están conectados al módulo L298N para controlar los dos motores DC—Motor A y Motor B. Se define un pin habilitador para gestionar la velocidad mediante PWM y dos pines de entrada para controlar la dirección de giro.

Luego, configuramos las propiedades de PWM: una frecuencia de 1000 Hz, una resolución de 8 bits (lo que permite que la velocidad varíe entre 0 y 255) y dos canales PWM separados—uno para cada motor.

En la función setup(), configuramos todos los pines de control de dirección como salidas, ya que enviaremos señales HIGH o LOW desde el ESP32 hacia el L298N para dictar el comportamiento del motor.

Después, usamos ledcAttachChannel() para configurar los canales PWM en los pines habilitadores. Esta función conecta un canal PWM específico a un pin GPIO con la frecuencia y resolución deseadas.

También aseguramos que ambos motores estén apagados, estableciendo todos los pines de control de dirección en LOW y el ciclo de trabajo de PWM en 0. Esto evita que los motores comiencen a girar inesperadamente al encender el ESP32.

En el loop(), llamamos a dos funciones personalizadas con un retraso de un segundo entre ellas. Estas funciones controlan la dirección y velocidad de los motores, ofreciendo una experiencia de control dinámica y efectiva.

Carlos Julián

Carlos Julián es el fundador de Ingtelecto, es Ingeniero Mecatrónico, Profesor y Programador, cuenta con una Maestria en Ciencias de la Educación, creador de contenido activo a través de TikTok @carlosjulian_mx

Estos temas te pueden interesar

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Tu puntuación: Útil

Subir