closed_loop_speed_pid.py
Implementación de un controlador PID de software para mantener una velocidad constante leyendo el codificador y ajustando el PWM.
Utiliza la interfaz I2C para leer datos del codificador y escribir la consigna PWM. El código asume direcciones de registro genéricas (0x10 para velocidad, 0x01 para PWM) que deben adaptarse a la hoja de datos del firmware de M5Stack. Requiere una fuente de alimentación del motor externa estable para evitar caídas de tensión que perturben las lecturas del codificador.
closed_loop_speed_pid.py
import time
from m5stack import i2c
# Adresse I2C par défaut du driver
ADDR = 0x2F
bus = i2c.I2C(1)
# Configuration PID simple
Kp, Ki, Kd = 2.0, 0.5, 0.1
setpoint = 150 # Vitesse cible (unités arbitraires ou RPM selon config)
integral = 0
last_error = 0
while True:
# Lecture de la vitesse actuelle depuis le registre de l'encoder (ex: reg 0x10)
# Note: Les registres exacts dépendent du firmware M5Stack spécifique
current_speed = bus.readfrom_mem(ADDR, 0x10, 2)
speed_val = int.from_bytes(current_speed, 'little')
error = setpoint - speed_val
integral += error
derivative = error - last_error
output = Kp * error + Ki * integral + Kd * derivative
# Limitation de la sortie PWM (0-255)
pwm_val = max(0, min(255, int(output)))
# Écriture du duty cycle PWM (ex: reg 0x01)
bus.writeto_mem(ADDR, 0x01, bytes([pwm_val]))
last_error = error
time.sleep(0.05)