Clase Motor: una clase para manejar motores de corriente continua




Presentación


La clase DCMotor permite controlar un motor de corriente continua (DC) mediante tres pines GPIO en microcontroladores compatibles con MicroPython, como el ESP32. Utiliza dos pines digitales para definir la dirección de giro (mediante un puente H o driver externo) y un pin PWM para regular la velocidad del motor con precisión.

El constructor recibe como parámetros los objetos pin1 y pin2 (salidas digitales), pin_control (objeto PWM), y opcionalmente los valores mínimo y máximo del ciclo de trabajo. Estos últimos definen el rango útil de potencia en el que el motor responde de forma efectiva, evitando comandos demasiado bajos que no generan movimiento.

Por defecto, minimo está establecido en 750 y maximo en 1023, valores adecuados para la resolución de 10 bits del PWM del ESP32 (rango 0–1023). Esto asegura que incluso al 1% de velocidad solicitada, el motor reciba suficiente potencia para comenzar a girar.

La clase incluye métodos intuitivos: avance(velocidad) y retroceso(velocidad) para mover el motor en ambas direcciones, y stop() para detenerlo completamente. Internamente, el método ciclo(velocidad) mapea un porcentaje de velocidad (1–100%) a un valor de duty cycle dentro del rango [minimo, maximo] mediante interpolación lineal.

Funcionamiento de los métodos principales


Al llamar a avance(velocidad), el pin1 se activa (1) y el pin2 se desactiva (0), estableciendo la dirección de giro hacia adelante. Simultáneamente, el pin PWM ajusta su ciclo de trabajo al valor calculado según la velocidad solicitada.

El método retroceso(velocidad) invierte la polaridad: pin1 = 0 y pin2 = 1, lo que hace que el motor gire en sentido contrario, manteniendo el mismo control de velocidad a través del pin PWM.

El método stop() garantiza una detención segura: pone el ciclo de trabajo a 0 y desactiva ambos pines de dirección, evitando estados indefinidos en el driver del motor.

Consideraciones técnicas


Esta implementación asume que el hardware externo (como un L298N o similar) interpreta correctamente las señales de los pines para invertir la polaridad del motor. Además, el uso de un valor mínimo de duty cycle evita que el motor reciba tensiones insuficientes que podrían causar vibraciones sin movimiento real.

Es importante tener en cuenta que los valores de minimo y maximo deben ajustarse según el tipo de motor, la fuente de alimentación y el driver utilizado. En plataformas con diferente resolución PWM (por ejemplo, Raspberry Pi Pico con rango 0–65535), estos parámetros deben redefinirse para mantener el comportamiento esperado.



Código


El código de la clase esta en el archivo motor.py.



Descarga de la libreria


Descargar Libreria



A continuación, coloco a modo de ejemplo un pequeño código para mostrar cómo se utiliza esta clase.



    
from machine import Pin, PWM
import time
import motor  # Importamos el módulo motor.py

# === Configuración de pines para ESP32 ===
PIN1 = Pin(12, Pin.OUT)      # IN1 del puente H
PIN2 = Pin(14, Pin.OUT)      # IN2 del puente H
PIN_CTRL = PWM(Pin(27), freq=1000)  # EN del puente H (PWM)

# Crear instancia del motor
mi_motor = motor.DCMotor(pin1=PIN1, pin2=PIN2, pin_control=PIN_CTRL)

# === Prueba del motor ===
try:
    print("Motor: Avanzando al 50% de velocidad")
    mi_motor.avance(50)
    time.sleep(2)

    print("Motor: Avanzando al 100% de velocidad")
    mi_motor.avance(100)
    time.sleep(2)

    print("Motor: Retrocediendo al 50% de velocidad")
    mi_motor.retroceso(50)
    time.sleep(2)

    print("Motor: Deteniendo")
    mi_motor.stop()
    time.sleep(1)

    print("Prueba finalizada.")

except KeyboardInterrupt:
    print("Interrumpido por el usuario")

finally:
    mi_motor.stop()  # Aseguramos que el motor se detenga

    

Quedo disposición de quien quiera hacerme consultas o sugerencias mi correo electronico es carlosvaccaro1960@gmail.com