J'ai un analyseur logique, mais je n'ai pas de carte Arduino, alors je fais un croquis de ce que la carte pourrait produire comme signaux de sortie si j'ai bien compris le fonctionnement de servo.cpp :
Oracid "attach()" ses 8 servo aux sorties D2 à D9.
A chaque fois que la routine d'interruption de servo.cpp est appelée par le TIMER, elle active une sortie (un des 8 servos, à tour de rôle), programme le TIMER avec la largeur d'impulsion du servo en cours de traitement, puis rend la main. Lorsque l'impulsion du dernier servo a été générée, elle programme le TIMER pour attendre jusqu'à la prochaine période de 20ms (valeur de REFRESH_INTERVAL).
La période REFRESH_INTERVAL doit être supérieure ou égale à la somme des largeurs d'impulsion maximales des huit servos. Les MG92b prennent jusqu'à 2.5ms, ca fait 20ms. Tous les servos ne sont pas à 2.5ms, donc on peut réduire un peu, tout en conservant une marge. En moyenne, si tous les servos sont au neutre à 1.5ms, ca fait 12ms.
Donc la marge d'optimisation reste faible :
- 20ms c'est le maximum jamais atteint (8x 2.5ms)
- 16ms est peut etre un bon compromis (8x 2.0ms)
- 12ms c'est trop peu (8x 1.5ms)
Si on baisse trop cette valeur, alors la routine active les 8 servos les uns après les autres, et recommence toute de suite avec le premier servo, sans faire de pause.
La période n'est plus constante, elle varie en fonction de la somme des largeurs d'impulsion.
Donc, on peut peut-être améliorer la cadence de quelques ms sans trop de risque en jouant sur le REFRESH_INTERVAL.
Une solution pour vraiment augmenter la cadence aurait peut etre été de prendre une carte avec 8 vraies sorties PWM (Mega ou autre). La Mega est un peu plus lourde par contre.
Enfin,il y a un léger risque de déphasage entre la routine d'It de servo.cpp et le code forward() de Oracid, D'ailleurs, ca doit déjà être le cas aujourd'hui depuis un certain temps avec les robots à base d'Arduino. Et cela même si on configure le délai dans forward() et le REFRESH INTERVAL de servo.h avec la même valeur (20ms par défaut , ou mieux si on trouve une plus petite valeur). Certains servos risquent d'être décalés de 20ms. Il faudrait modifier le code de servo.cpp pour émettre un signal, au moment du traitement de la pause pour REFRESH INTERVAL par exemple, et le capturer dans la boucle forward() pour les synchroniser parfaitement. C'est faisable, mais à distance et sans carte Arduino, je passe mon chemin ! Désolé, c'était juste une idée en l'air :-)
Patrick.