Código de búsqueda

Cómo controlar la velocidad de un motor DC con un módulo ESP32 y L298N

Cómo controlar la velocidad de un motor DC con un módulo ESP32 y L298N

Controlar motores de corriente continua puede ser una tarea sencilla con los componentes y el entendimiento adecuados. En este tutorial, exploraremos cómo controlar dos motores de corriente continua utilizando el microcontrolador ESP32 y el módulo controlador de motor L298N. Al final de esta guía, podrás ajustar la velocidad y la dirección de tus motores en función de las señales PWM del ESP32, permitiendo aplicaciones versátiles en robótica y automatización.

ESP32_L298N_DC_principal

El video que acompaña a este tutorial ofrece una demostración visual de todo el proceso, incluyendo el cableado y la programación (en el video a las 00:00).

Hardware explicado

Módulo de controlador de motor L298N
Módulo controlador de motor L298N

Para lograr el control del motor, utilizaremos el ESP32 y el módulo controlador de motor L298N. El ESP32 es un microcontrolador potente con capacidades de Wi-Fi y Bluetooth, lo que lo hace ideal para proyectos de IoT. El L298N es un controlador de motor en puente H que nos permite controlar la dirección y la velocidad de los motores utilizando señales PWM. El módulo L298N cuenta con dos circuitos en puente H, lo que significa que podemos controlar dos motores de manera independiente. Cada puente H permite controlar la dirección del motor (en sentido horario o antihorario) y la velocidad variando la señal PWM. Al conectar los pines de habilitación y entrada del L298N al ESP32, podemos manipular los motores de manera efectiva.

Detalles de la hoja de datos

Fabricante STMicroelectronics
Número de parte L298N
Tensión de lógica/entrada/salida 5 V
Tensión de suministro 5-46 V (VS)
Corriente de salida (por canal) 2 A máx/canal (máx. abs.)
Corriente de pico (por canal) 2.5 A
Guía de frecuencia PWM 1 kHz - 15 kHz
Umbrales de lógica de entrada 2.5 V (alto), 1.5 V (bajo)
Caída de tensión / RDS(on)/ saturación 1.8 V a 2 A
Límites térmicos 150 °C
Paquete Multiwatt de 15 pines
Notas / variantes Controlador de motor de puente H dual

  • Asegúrate de que la clasificación de voltaje del motor coincida con la tensión de alimentación del L298N.
  • Utilice un enfriamiento adecuado para la operación continua a altas corrientes.
  • Conecta las tierras de todos los componentes para evitar referencias flotantes.
  • Utiliza una frecuencia PWM adecuada para la aplicación (1-15 kHz).
  • Ten cuidado con las clasificaciones de corriente máxima para evitar el sobrecalentamiento.
  • Prueba la dirección del motor antes de finalizar el cableado para evitar daños.
  • Considere capacitores de desacoplamiento en la fuente de alimentación para estabilidad.

Instrucciones de cableado

ESP32_L298N_wiring

Para conectar el L298N al ESP32, comienza conectando los dos motores de corriente continua a los terminales de salida del L298N. Conecta el Motor 1 a los terminales etiquetados comoOUT1yOUT2, y Motor 2 aOUT3yOUT4. La polaridad de los motores no importa ya que el L298N manejará la dirección. A continuación, conecta tu fuente de alimentación externa alVMSyGNDterminales en el L298N. Asegúrese de que la tensión sea adecuada para sus motores, típicamente entre 5V y 46V. El5Vel terminal en el L298N se puede utilizar para alimentar el ESP32 si es necesario, pero asegúrese de que se cumplan los requisitos de corriente. Para los pines de control, conecteENAa GPIO 19,IN1a GPIO 18, yIN2a GPIO 5 para el Motor 1. Para el Motor 2, conectaIN3a GPIO 17,IN4a GPIO 16, yENBa GPIO 4. Finalmente, conecta las tierras del ESP32 y del L298N juntas para asegurar una referencia común.

Ejemplos de código y tutorial

Los siguientes fragmentos de código ilustran cómo controlar los motores utilizando la biblioteca L298N diseñada para el ESP32. La biblioteca simplifica el proceso de envío de comandos a los motores. Primero, se incluye la biblioteca necesaria y se definen los parámetros del motor:


#include 
#define ENA 19
#define IN1 18
#define IN2 5
#define IN3 17
#define IN4 16
#define ENB 4
Robojax_L298N_DC_motor robot(IN1, IN2, ENA, CHA, IN3, IN4, ENB, CHB);

En este fragmento, definimos los pines de control para ambos motores. La instancia de la bibliotecarobotse crea, que se utilizará para controlar los motores a lo largo del programa. A continuación, configuramos la comunicación serial e inicializamos la instancia del robot en elsetup()función:


void setup() {
  Serial.begin(115200);
  robot.begin();
}

Esto inicializa la comunicación serial para depuración y prepara la biblioteca de control del motor para su funcionamiento. Finalmente, la lógica de control principal se coloca en elloop()función, donde podemos rotar los motores y ajustar su velocidad:


void loop() {
  robot.rotate(motor1, 80, CW); // run motor1 at 80% speed in CW direction
  delay(3000); // wait for 3 seconds
  robot.brake(1); // brake motor1
  delay(2000); // wait for 2 seconds
}

Este extracto demuestra cómo rotar el Motor 1 al 80% de velocidad en dirección de las agujas del reloj durante tres segundos antes de frenar. El código completo incluye lógica adicional para el Motor 2 y velocidades variables, que se pueden ver en el programa completo cargado debajo del artículo.

Demostración / Qué Esperar

Al ejecutarse, los motores deberían responder a las señales PWM enviadas desde el ESP32. Verás el Motor 1 girando en sentido horario a un 80% de velocidad, seguido de una acción de frenado. El programa también incluye lógica para gestionar variaciones de velocidad de forma gradual, que se puede probar observando la aceleración del motor del 0% al 100% (en el video a las 05:00). Los errores comunes incluyen no conectar adecuadamente las tierras, lo que puede llevar a un comportamiento errático, y exceder las calificaciones de corriente del L298N, causando que se sobrecaliente. Asegúrate de monitorizar el comportamiento del motor y ajustar los parámetros según sea necesario.

Marcas de tiempo del video

  • 00:46 Introducción
  • 04:07 Cableado ESP32 con L298N
  • 06:10 Preparando el IDE de Arduino para trabajar con placas ESP32
  • 08:15 Código de Arduino explicado
  • 15:00 Demostración del control de un solo motor
  • 16:00 Demostración del control de 2 motores de CC
  • 17:00 Demostración de alimentación del ESP32 desde L298N y alimentación externa

Imágenes

Módulo de controlador de motor L298N
Módulo de controlador de motor L298N
ESP32_L298N_DC_main
ESP32_L298N_DC_main
ESP32_L298N_wiring
ESP32_L298N_wiring
278-Library Example for L298N Module to control DC motors
Idioma: C++
/*
 * Library Example for L298N Module to control DC motors
 * 
 * This code is to control a single motor. For two motor control, please open L298N_DC_2_Motors.
 * This code is ready for ESP32.
 * Watch video instructions for this code:  https://youtu.be/2JTMqURJTwg
 * 
 * Written by Ahmad Shamshiri on December 24, 2019 
 * in Ajax, Ontario, Canada. www.robojax.com
 * 
 * 
  * 
 * Get this code and other Arduino codes from Robojax.com.

or make a donation using PayPal http://robojax.com/L/?id=64

 *  * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

#include <Robojax_L298N_DC_motor.h>
// motor 1 settings
#define CHA 0
#define ENA 19 // this pin must be PWM enabled pin if Arduino board is used
#define IN1 18
#define IN2 5

// motor 2 settings
#define IN3 17
#define IN4 16
#define ENB 4// this pin must be PWM enabled pin if Arduino board is used
#define CHB 1

const int CCW = 2; // do not change
const int CW  = 1; // do not change

#define motor1 1 // do not change
#define motor2 2 // do not change

// for single motor
//Robojax_L298N_DC_motor robot(IN1, IN2, ENA, CHA, true);	

// for two motors without debug information	// Watch video instruction for this line: https://youtu.be/2JTMqURJTwg
Robojax_L298N_DC_motor robot(IN1, IN2, ENA, CHA,  IN3, IN4, ENB, CHB);

// for two motors with debug information
//Robojax_L298N_DC_motor robot(IN1, IN2, ENA, CHA, IN3, IN4, ENB, CHB, true);

void setup() {
  Serial.begin(115200);
  robot.begin();
  //L298N DC Motor by Robojax.com

}

void loop() {
  
 // robot.demo(1);
  robot.rotate(motor1, 80, CW);//run motor1 at 60% speed in CW direction
  robot.rotate(motor2, 70, CCW);//run motor1 at 60% speed in CW direction
  
  delay(3000);

  robot.brake(1);
  robot.brake(2);  
  delay(2000);


  robot.rotate(motor1, 100, CW);//run motor1 at 60% speed in CW direction
  delay(3000);
  
  robot.rotate(motor2, 100, CCW);//run motor1 at 60% speed in CW direction
  
  robot.brake(1);
  robot.brake(2);   
  delay(2000);  

  for(int i=0; i<=100; i++)
  {
    robot.rotate(motor1, i, CW);// turn motor1 with i% speed in CW direction (whatever is i) 
    delay(100);
  }
  delay(2000);
  
  robot.brake(1);
  delay(2000);  
  
  for(int i=0; i<=100; i++)
  {
    robot.rotate(motor2, i, CW);// turn motor1 with i% speed in CW direction (whatever is i) 
    delay(100);
  }
  delay(2000);
  
  robot.brake(2);
  delay(2000);    
  // Robojax L298N Library. Watch video instruction https://youtu.be/2JTMqURJTwg
}

Cosas que podrías necesitar

Recursos y referencias

Archivos📁

Bibliotecas de Arduino (zip)

Archivo de Fritzing