Servo (suite)

Bonjour,

Après avoir bien recherché de la documentation j'en suis arrivé à dire que la norme actuelle de commande des servo est 0,5ms 2,5ms et non plus 1ms 2ms.
Source :
Documentation vendeurs sur Aliexpress.
Les servo type S90 n'ont aucune documentation, les servos type MG995, quand ils en une, indiquent 0,5ms/2,5ms.

J'ai fais un montage de test et je confirme S90 c'est aussi 0,5 ms/2,5ms.

J'en ai ouvert un (Tower pro-> 180°), le circuit intégré de commande est un AA51880 (on trouve une datasheet de 1 page mais aussi une version de 10 pages).
J'ai fait la même opération avec le DM-S0090D-> 270° : CI PZMOS-5X totalement inconnu pas de datasheet trouvée.

Pour l'angle j'ai lu que (je cite) "la méthode write n'est là que pour faciliter la tâche de certain" : elle ne fait que convertir un angle en microsecondes et utilise writeMicroseconds(). Elle le fait mal puisqu'elle part du principe qu'il n'existe que des servo 180 ° alors qu'il existe des 90, 120, 180 270 et même 300 °

Le pas de commande est bien de 4µs ce qui laisse entrevoir une résolution de 0,36° pour un servo 180° ou de 0,54° pour un servo 270°

Avec les servo S90 la réalité est à des années lumière de la théorie.

Autant jeter de suite un voile pudique sur la linéarité des S90.
Si on fait pas par pas de 4µs on tourne quand cela veut et quand cela se décide à tourner ce peut être de 16 ou 20 pas d'un coup.
Si on fait un incrément de 16µs (soit 4 pas) dans un sens puis dans l'autre, et qu'on a la chance que cela tourne à chaque fois, on ne revient jamais au point de départ (toujours à ± 2 pas près).
Le 270 (DM-S0090D) est pire que le 180 (Tower Pro) qui est déjà lamentable.

Ces objets sont tout juste bons pour lever une barrière de passage à niveau pour les amoureux des trains miniatures. Mais on fait la même chose en bien plus simple.

La seule explication que je vois pour les valeurs 544µs et 2400µs : c'est une tentative pour limiter la course à exactement 180° sur l'exemplaire qui a servi à l'écriture de la bibliothèque.
Vu le peu de confiance que j'ai maintenant dans ce matériel je reste persuadé qu'un étalonnage, au moins par fournisseur, est indispensable.

Plutôt que "d'attacher" un servo par la forme réduite comme on le voit partout :
mon_servo.attach(pin);
qui utilise par défaut les valeur min = 544 et max = 2400
Je conseille la forme complète :
mon_servo.attach(pin, 500, 2500) si l'étalonnage à permis de déterminer les valeur min = 500 et max = 2500.

Programme de test :

  • deux boutons un pour incrémenter, l'autre pour décrémenter
  • chaque bouton déclenche une interuption soit pour incrémenter soit pour décrémenter.

Attention j'ai mis des Serial.print dans une interruption que personne ne hurle :grin: : le programme ne fait strictement rien d'autre, j'ai été au plus simple :grinning: .

Le programme est réglé pour faire des sauts de 4 pas. On ramener à un pas en remplaçant 16 par 4.

t_pulse_270 += 16 ;

La variable "lecture" me sert à contrôler qu'il n'y a pas eu de rebond (montage sur un coin de table).

lecture = servo_270.readMicroseconds();

Fonctions d'interruption :

void incremente()
{
  t_pulse_270 += 16 ;
  servo_270.writeMicroseconds(t_pulse_270) ;
  lecture = servo_270.readMicroseconds();
  Serial.println(t_pulse_270);
  Serial.print("t_pulse =");Serial.print(t_pulse_270);
  Serial.print("   Lecture = "); Serial.println(lecture);
}
       
void decremente()
{
  t_pulse_270 -= 16 ;
  servo_270.writeMicroseconds(t_pulse_270) ;
  lecture = servo_270.readMicroseconds();
  Serial.print("t_pulse =");Serial.print(t_pulse_270);
  Serial.print("   Lecture = "); Serial.println(lecture);
}

Et pour finir une petite photo pour montrer qu'avec une breadboard les fils Dupont de 20 cm et le câblage mode "perchoir à mouche" qui les accompagnent ne sont pas une fatalité.

servo.jpg

servo.jpg

Salut

oui ces moteurs ce sont des petits gadgets pour bidouiller

Pour l'angle j'ai lu que (je cite) "la méthode write n'est là que pour faciliter la tâche de certain" : elle ne fait que convertir un angle en microsecondes et utilise writeMicroseconds()

Il est aussi dit:

// treat values less than 544 as angles in degrees (valid values in microseconds are handled as microseconds)

write ne fait pas forcément la conversion. write(1000) appelle simplement writeMicroseconds(1000) sans conversion.
J'ai regardé srevo.cpp, mais je n'ai pas encore compris quel est le principe pour gérer les impulsions. Peut être que ça viendra. Je me pose des questions sur la limite à 12 du nombre de servo par timer.
Les servos sont utilisés en radiocommande, c'est pratique, fonctionnel et adapté surtout à l'émission analogique.
Utiliser une servo piloté par une Arduino, cela me laisse songeur: on part d'une valeur numérique, que l'on transforme péniblement en largeur d'impulsion, laquelle doit être de nouveau convertie en tension pour être comparée à la valeur d'un pont diviseur à résistance. Comme si on ne pouvait pas donner directement la valeur de la tension. Par radio d'accord, mais en local? En plus il y en a qui râlent parce que ce n'est pas assez précis.

write ne fait pas forcément la conversion. write(1000) appelle simplement writeMicroseconds(1000) sans conversion.

Quand on lit que write() reçoit une valeur d'angle et writeMicrosecond() reçoit une valeur en µs cela s'appelle simplement une sécurité anti connerie pour programmeurs étourdis.

Utiliser une servo piloté par une Arduino, cela me laisse songeur: on part d'une valeur numérique, que l'on transforme péniblement en largeur d'impulsion, laquelle doit être de nouveau convertie en tension pour être comparée à la valeur d'un pont diviseur à résistance.

Les servomoteurs sont en priorité des matériels professionnels qui peuvent faire plusieurs kW de puissance et qui s'utilisent en milieu perturbé. Certains utilisent des moteurs pas à pas d'autres des moteurs triphasés : ne me demande pas comment cela fonctionne j'ai juste lu l'information.
Certains sont 90°, 120 °, 180°, 270° et certains sont capables de faire plusieurs tours.
Ce n'est pas le modélisme qui a fixé la norme.

Comme par hasard la fréquence de récurrence est de 20 ms qui n'est rien d'autre que le 50 Hz du secteur qui répond à des normes très précises et constitue une horloge de qualité à bon marché en milieu industriel.

Les servo tel que décrit dans le tuto d'Eskimon n'existent plus, ses explications sont là pour donner les bases du fonctionnement.

Transmettre une commande avec une tension continue est extrêmement difficile si on veut respecter une parfaite intégrité du signal
Pour un servo 180° un pas d'angle de 1° correspondrait à un écart de niveau de 27 mV (5V divisés par 180°). Gérer des pas de 27mV sur un signal qui peut faire plus de 4V d'amplitude est une vraie gageure. Rien qu'avec le bruit thermique c'est intransportable. Alors qu'avec la solution retenue 1° correspond à une différence de temps de 11µs que l'on sait mieux transporter qu'une différence d'amplitude.

A ce que j'ai compris il existe deux solutions "numériques" :

  1. l'historique avec la PWM à 20 ms
  2. une plus récente sans PWM et avec l'information de consigne d'angle transmise en liaison série (mais peut-être aussi selon d'autres protocoles)

Mais il n'y a pas que la commande qui compte :
le jeu mécanique, les frottements et/ou les points durs, la linéarité du potentiomètre,la qualité du contact curseur du potentiomètre, le gain de boucle de l'asservissement etc......

Je suis déçu de la qualité des S90 mais pas vraiment surpris, à 2€ il ne faut pas demander l'impossible.
En regardant d'un peu plus prés il y a la zone de prix 1€/4€, la suivante est plutôt 8€/12€ avec des servos plus gros et des engrenages en métal.