Alors, je vois deux solutions pour résoudre ce problème.
Première solution : utiliser une carte qui permet de gérer la vitesse et l'accélération des servomoteurs. Très pratique dans la mesure car cela libère énormément de temps au programme pour faire autres choses.
Oui je sais c'est radical mais c'est vraiment très simple et très efficace....
Deuxième solution : gérer la totalité du déplacement des servomoteurs à partir du programme arduino.
Hypothèses : sur la base énoncée par @Path
On se met dans l'hypothèse à vide ou avec une charge inférieur à son max, et sans butée sur l'amplitude 0 à 180° et la commande en vitesse vise à augmenter/réduire la vitesse max. On va donc supposer que le servomoteur n'est pas gêné, qu'il fonctionne bien, qu'il est bien à la position commandée.
Secteur angulaire à parcourir : 180°.
Vitesse maxi : 180° en 10 secondes, soit 18°/s, soit 1°/56ms.
Ma solution au défi ...
3 phases :
- 1 phase d’accélération, de 0° à 10 °. Si accélération il y a, alors la vitesse angulaire augmente
- 1 phase à vitesse max, de 11° à 170° . Vitesse angulaire constante
- 1 phase de décélération, de 171° à 180°. Si décélération il y a, alors la vitesse angulaire diminue
Pour augmenter/diminuer la vitesse angulaire, soit entre deux pas nous modifions le temps (la base de temps d'incrémentation) , soit sur la même base de temps d'incrémentation nous modifions l'amplitude d'un pas.
Souhaitant éliminer l'utilisation de la fonction delay() dans LOOP et utiliser la fonction millis() via le TIMER INTERRUPT, j'opte pour la modification de la base de temps d'incrémentation à chaque pas de 1°.
La fréquence du timer interrupt : TIMER0, est de 976.5625 Hz soit disons 1KHz ce qui nous donne une interruption toutes les 1ms.......
Admettons que le servomoteur a une vitesse de 18°/s (c’est énorme, oui mais c’est pour l’exemple ce qui donne 10 secondes pour 180° !!), soit 1°/56ms, je décide de définir la durée de mes phases ainsi :
- phase d’accélération, de 0° à 10 ° = 850 ms. Le premier pas aura une durée de 112 ms, le deuxième 106 ms, ….le dernier 58
- phase à vitesse max, de 11° à 169° = 8960 ms. Durée du pas 56 ms
- phase de décélération, de 170° à 180°= 890 ms. Le premier pas aura une durée de 62 ms, le deuxième 68 ms, ….le dernier 116 ms
Soit un cylce en 10700 ms.
Dans le code arduino :
base_temps = 112; // initialisation de la base de temps lastUpdate = millis(); // récupération du temps écoulé num_pas = 1 ;// initialisation du pas if((currentMillis - lastUpdate) >= base_temps) //si base_temps est atteinte { if (num_pas <= 10) // { base_temps = base_temps – 6; // accélération } else if (num_pas >= 170) { base_temps = base_temps + 6; //décélération } else { base_temps = 56; if (num_pas >= 169) { base_temps = base_temps + 6 //petit subterfuge pour avoir le premier pas de la phase de décélération = 62 ms !! } } servo.write(num_pas); //exécution du pas num_pas ++ ; //incrémentation du pas }
Attention, lorsque le servomoteur fera la course de 180° à 0° il faudra penser à initialiser base_temps = 116 et num_pas = 180.
Enfin, pour ce qui est d’utiliser le timer interrupt voir lien suivant :
https://learn.adafru...o-part-2/timers