position_control_absolute.py

Unité de pilotage moteur à encodeur M5Stack (DRV8837DSGR) · Fichier : position_control_absolute.py · Langage : MicroPython · Usage : Déplacement précis vers une position absolue définie par le compteur d'encodeur.

Asservissement de position utilisant la lecture du compteur d'encodeur pour arrêter le moteur une fois la cible atteinte.

Lit la position absolue via I2C (registre 0x20 supposé) et applique une correction proportionnelle. Le code gère l'inversion de direction et la saturation de puissance. Il est crucial de vérifier la résolution de l'encodeur (PPR) pour calibrer la constante de gain.

position_control_absolute.py

import time
from m5stack import i2c

ADDR = 0x2F
bus = i2c.I2C(1)

def read_position():
    # Lecture de 4 octets pour la position (32 bits)
    data = bus.readfrom_mem(ADDR, 0x20, 4)
    return int.from_bytes(data, 'little', signed=True)

def set_motor_power(power):
    # Écriture de la puissance moteur (-100 à 100 ou PWM brut)
    # Supposons un registre de direction et de vitesse
    bus.writeto_mem(ADDR, 0x02, bytes([abs(power), 1 if power > 0 else 0]))

target_pos = 1000  # Cible en ticks d'encodeur
max_power = 80
min_power = 10

while True:
    current_pos = read_position()
    error = target_pos - current_pos
    
    if abs(error) < 5:
        set_motor_power(0)
        print("Position atteinte")
        break
        
    # Contrôle proportionnel simple
    power = int(error * 0.5)
    if power > max_power: power = max_power
    elif power < -max_power: power = -max_power
    elif abs(power) < min_power: power = min_power if power > 0 else -min_power
    
    set_motor_power(power)
    time.sleep(0.01)

← Retour à la fiche