J'aime pas configurer ces 3 valeurs de PID alors j'ai cherché comment m'en passer. J'ai testé ce code. Il me convient et je voulais votre avis.
void PiloteMoteur::update(unsigned int vitesseMesuree, unsigned int duration) { float output = (float)_setpoint * 255.0 / 280.0; // PWM 100% -> 280 fronts/100ms if( duration < 2000) { // On accélère sur 2s de 0 à output output = output * duration / 2000; } else { // On gère une correction proportionnelle basée sur l'erreur float errorRatio = 0; if(_setpoint > 0) { errorRatio = (_setpoint - vitesseMesuree) / _setpoint * 255.0 / 280.0; } output = output + (output * errorRatio); } byte command = constrain((int)output, 0, 255); analogWrite(_pinPWM, command); }
Voilà, j'ai une correction de la commande du moteur fonction de la vitesse mesurée sans avoir de PID.
Cette simplification a un prix.
- Il faut être dans une zone linéaire du ratio feedback/setpoint.
- Il faut gérer une accélération avant de corriger. Il faut que le moteur soit déjà lancé pour pouvoir appliquer ce code simple. En partant de la vitesse 0, je trouvais pas ce chose simple pour éliminer l'asservissement par PID.
Sur l'écran, j'affiche le feedback (vitesseMesuree) pour les 4 moteurs. Au dessus c'est la commande strafe et rotation. J'y reviendrai.