closed_loop_speed_pid.py
Implémentation d'un contrôleur PID logiciel pour maintenir une vitesse constante en lisant l'encodeur et ajustant le PWM.
Utilise l'interface I2C pour lire les données de l'encodeur et écrire la consigne PWM. Le code suppose des adresses de registre génériques (0x10 pour la vitesse, 0x01 pour le PWM) qui doivent être adaptées au datasheet du firmware M5Stack. Nécessite une alimentation moteur externe stable pour éviter les chutes de tension qui perturbent la lecture de l'encodeur.
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)