Aller au contenu


shuptuu

Inscrit(e) (le) 17 janv. 2023
Déconnecté Dernière activité janv. 20 2023 02:12
-----

Messages que j'ai postés

Dans le sujet : Servo qui oscille

18 janvier 2023 - 11:27

Problème réglé!!

Merci Oracid, tu m'as mis la puce à l'oreille en me parlant du MG92B que tu utilises en 7.4V, bien qu'il soit donner pour du 6V. Suis retourné voir les specs des MG996R: Operating voltage: 4.8~ 6.6v
Sauf que mon alim envoie du 7.5v

Du coup je viens de tester en baissant la tension à 6v: plus de problème!!

Et ça s'explique: plus la tension est haute, plus le moteur tourne vite. à 7.5v, le moteur va trop vite pour l'électronique interne. Le temps de stopper le moteur quand il a atteint la position, que le moteur a déjà trop dépassé la position. L'électronique reactive le moteur en sens inverse et encore le temps de stopper le moteur quand il a atteint la position, que le moteur a encore déjà trop dépassé la position => oscillation.

Comme quoi, les données constructeurs, ça n'est pas pour rien...
Dans ton cas, tant mieux si ça marche. Fait attention quand même. Selon le type d'effort appliqué sur le servo, ça pourrait se mettre à osciller aussi.
Pour moi, par exemple, sur les bras, je n'ai pas le problème, mais il n'y a pas d'inertie comme il peut y avoir sur la rotation de la tête.
Bonne continuation et encore merci!

 


Dans le sujet : Servo qui oscille

18 janvier 2023 - 03:28

J'ai des #define des valeurs min et max pour chaque servo au début de mon code
#define MouthMin 1052  
#define MouthMax 1376
#define LeftArmMin 610
#define LeftArmMax 2080
#define RightArmMin 544
#define RightArmMax 2030
#define HeadMin 890
#define HeadMax 2100
et ensuite:
 
  myMouth.attach(pinMouth,MouthMin,MouthMax);
  myLeftArm.attach(pinLeftArm,LeftArmMin,LeftArmMax);
  myRightArm.attach(pinRightArm,RightArmMin,RightArmMax);  
  myHead.attach(pinHead,HeadMin,HeadMax);

Oui, quand on envoie une position, le servo maintient la consigne. Dans mon cas, l'ordi peut être très bavard sur le port série et en fait mon refresh n'est pas pour maintenir la consigne mais pour éviter des modifications de consigne trop rapides. Je pourrais rajouter des if et ne faire le writeMicroseconds que si la valeur a changé, mais ça ne change pas grand chose.
Vérifié à l'oscillo, le signal pwm envoyé est très stable. L'oscillation ne vient donc pas du signal pwm et donc pas de mon code.   


Dans le sujet : Servo qui oscille

18 janvier 2023 - 02:08

Merci Oracid pour ton message.
Côté matériel, j'utilise une carte Seeed Xiao à base de Samd21, alimenté par l'usb.

Les servos sont alimentés en 7.5V par un bloc alim 5A.

J'étalonne mes servos également (recherche des min et max) et n'utilise que des .writeMicroseconds() pour les contrôler.

Après côté code, c'est très simple: je reçois des ordres via port série et fait un refresh des servos toutes les 20ms:

if ((millis()-servosupdate)>20){
    myHead.writeMicroseconds(Headvalue);
    myMouth.writeMicroseconds(Mouthvalue);
    myLeftArm.writeMicroseconds(LeftArmvalue);
    myRightArm.writeMicroseconds(RightArmvalue);
    servosupdate=millis();  } 

Mais je ne crois pas que mon problème d'oscillation soit lié à l'étalonnage: dans la petite video que j'ai faite, le servo est en position médiane donc loin du min ou du max, et la consigne pwm ne change pas. C'est vraiment interne au servo, dans sa régulation pour maintenir une position.