Control de motores DC#
Objetivo#
Se realizará un sistema de control de motores de corriente directa (DC) con ayuda de un driver L298N.
Nota
En esta práctica, se utilizará el RP2040.
Descripción#
Los sistemas de control son parte integral de nuestra sociedad actual y tienen múltiples aplicaciones, desde mantener una temperatura deseada hasta mantener la estación espacial en órbita. La definición de un sistema de control es: conjunto de procesos que en conjunto nos ayudan a obtener una salida esperada con un desempeño deseado dada una entrada específica.
Un sistema de control de motores DC puede ser fácilmente adecuado para aplicaciones como:
Propulsión de vehículos
Robots Móviles - Drones - Robots con ruedas u orugas
Sistemas de refrigeración - Control de ventiladores - Extracción de humos
Instalaciones de transporte - Bandas de transporte
Sistemas de automatización - Persianas/Cortinas inteligentes
Electrodomésticos y herramientas - Aspiradoras - Licuadoras - Dremel - Esmeril - Taladros
Si bien existen muchas más, esta lista da una amplia idea de las aplicaciones de los motores DC.
Esta práctica se enfocará en realizar un sistema para controlar la velocidad y dirección de motores DC de manera precisa utilizando un dispositivo ESP32 o RP2040 con MicroPython.
Requisitos#
1x Driver L298N
Alimentación de 12 V
Opcionalmente, se recomiendan los kits de robótica que incluyen motores y drivers:
Código#
Una vez realizadas las conexiones para un motor, se puede controlar dicho motor DC con el controlador L298N sin usar PWM, con el siguiente código. Ten en cuenta que en este ejemplo el motor solo podrá encenderse o apagarse, sin control de velocidad.
Nota
Código realizado para MicroPython utilizando la DualMCU con el microprocesador RP2040. Recuerda que puedes intercambiar entre microcontroladores con el selector USB.
Download unitRP2040_motors1.py:#
Diagrama para controlar un motor:

1from machine import Pin
2import time
3
4# Configura los pines para controlar el L298N
5l298n_enable = Pin(7, Pin.OUT) # Conecta a EN del L298N
6l298n_input1 = Pin(14, Pin.OUT) # Conecta a IN1 del L298N
7l298n_input2 = Pin(9, Pin.OUT) # Conecta a IN2 del L298N
8
9# Habilita el motor
10l298n_enable.on()
11# Control del motor
12l298n_input1.on()
13l298n_input2.off()
14
15# Espera 5s
16time.sleep(5)
17# Deshabilita el motor
18l298n_enable.off()
19
20# Espera 1s
21time.sleep(1)
22# Habilita el motor
23l298n_enable.on()
24# Control del motor, sentido contrario
25l298n_input1.off()
26l298n_input2.on()
27
28# Espera 5s
29time.sleep(5)
30l298n_enable.off()
El siguiente paso es controlar la velocidad del motor: para ello se utiliza PWM. La velocidad máxima del motor se logra con el valor 65536; se recomiendan pruebas con diferentes valores para encontrar la velocidad adecuada a cada proyecto.
Download unitRP2040_motors2.py:#
Diagrama para controlar dos motores:

1from machine import Pin, PWM
2import time
3
4# Configura los pines para controlar el L298N
5l298n_enable = Pin(7, Pin.OUT) # Conecta a EN del L298N
6l298n_input1 = Pin(14, Pin.OUT) # Conecta a IN1 del L298N
7l298n_input2 = Pin(9, Pin.OUT) # Conecta a IN2 del L298N
8
9# Habilita el motor
10l298n_enable.on()
11
12# Prepara el PWM
13pwm1 = PWM(l298n_input1)
14pwm1.freq(1000)
15
16pwm2 = PWM(l298n_input2)
17pwm2.freq(1000)
18
19# Define la velocidad del motor (ajusta el valor según sea necesario)
20motor_speed = 65536 # Velocidad máxima
21
22pwm1.duty_u16(motor_speed)
23pwm2.duty_u16(0)
24
25time.sleep(5)
26
27motor_speed = 40000
28
29pwm1.duty_u16(motor_speed)
30pwm2.duty_u16(0)
31
32time.sleep(2)
33
34motor_speed = 65536 # Velocidad máxima
35
36pwm1.duty_u16(0)
37pwm2.duty_u16(motor_speed)
38
39time.sleep(5)
40
41motor_speed = 40000
42
43pwm1.duty_u16(0)
44pwm2.duty_u16(motor_speed)
45
46time.sleep(2)
47
48l298n_enable.off()
Tomando como base los códigos anteriores, se puede controlar dos motores DC utilizando el driver L298N simultáneamente, controlando velocidad, dirección y encendido/apagado.
Download unitRP2040_motors3.py:#
Download unitRP2040_motors3.py
1from machine import Pin, PWM
2import time
3
4# Configura los pines para controlar el L298N
5l298n_enableA = Pin(7, Pin.OUT) # Conecta a ENA del L298N
6l298n_input1 = Pin(14, Pin.OUT) # Conecta a IN1 del L298N
7l298n_input2 = Pin(9, Pin.OUT) # Conecta a IN2 del L298N
8l298n_enableB = Pin(4, Pin.OUT) # Conecta a ENB del L298N
9l298n_input3 = Pin(8, Pin.OUT) # Conecta a IN3 del L298N
10l298n_input4 = Pin(11, Pin.OUT) # Conecta a IN4 del L298N
11
12# Habilita los motores
13l298n_enableA.on()
14l298n_enableB.on()
15
16# Prepara el PWM
17pwm1 = PWM(l298n_input1)
18pwm1.freq(1000)
19pwm2 = PWM(l298n_input2)
20pwm2.freq(1000)
21pwm3 = PWM(l298n_input3)
22pwm3.freq(1000)
23pwm4 = PWM(l298n_input4)
24pwm4.freq(1000)
25
26# Define la velocidad del motor (ajusta el valor según sea necesario)
27motor_speed = 65536 # Velocidad máxima
28
29pwm1.duty_u16(motor_speed)
30pwm2.duty_u16(0)
31pwm3.duty_u16(motor_speed)
32pwm4.duty_u16(0)
33
34time.sleep(5)
35
36motor_speed = 40000
37
38pwm1.duty_u16(motor_speed)
39pwm2.duty_u16(0)
40pwm3.duty_u16(motor_speed)
41pwm4.duty_u16(0)
42
43time.sleep(2)
44
45motor_speed = 65536 # Velocidad máxima
46
47pwm1.duty_u16(0)
48pwm2.duty_u16(motor_speed)
49pwm3.duty_u16(0)
50pwm4.duty_u16(motor_speed)
51
52time.sleep(5)
53
54motor_speed = 40000
55
56pwm1.duty_u16(0)
57pwm2.duty_u16(motor_speed)
58pwm3.duty_u16(0)
59pwm4.duty_u16(motor_speed)
60
61time.sleep(2)
62
63l298n_enableA.off()
64l298n_enableB.off()
Prudencia
Ten en cuenta que este código es un ejemplo y puede que necesites ajustarlo según tu configuración específica y necesidades.
Resultados#

Conclusiones#
Esta actividad ejemplifica de manera destacada los sistemas de control al haber desarrollado exitosamente un sistema para motores DC. Este logro sienta las bases para diversos proyectos futuros, introduciendo conceptos clave de MicroPython, PWM (Modulación de Ancho de Pulso) y un mejor manejo de la tarjeta de desarrollo Dual MCU.
Referencias#
Nise, N. (2019). Control Systems Engineering. Editorial Wiley.