Go Down

Topic: Servomoteur (Read 3374 times) previous topic - next topic

dam3

Bonjour,

   j'ai actuellement un petit soucis sur le pilotage de mon servomoteur car celui ci n'est pas linéaire, le servomoteur saccade. (servomoteur HS-84MG, carte arduino UNO)
j'utilise se code la :
  for(pos = 0; pos < 180; pos += 1)
   { myservo.write(pos);
    delay(15);
Il y a t-il un moyen pour supprimé se "défaut" dans le programme? changer le servomoteur? car à vitesse plus élever le saccadement est supprimé.
merci de votre aide d'avance


Super_Cinci

Essaie avec delay(250), car je ne suis pas sûr que la lib accepte un délai si court...

dam3

Merci pour ta réponse mais le problème si je met le delay à 250 je me retrouve avec mon servomoteur qui saccade encore plus car le signal attend encore plus entre chaque "pas"

vince3838

Salut, essaye avec la fonction  myservo.writeMicroseconds   de 1000 à 2000 avec un delay plus court

skywodd

Bonjour,

Le délai de 15ms est peut être un peu juste (la fréquence de rafraichissement d'un servomoteur est de 50Hz = 20ms).
Essaye un delay(20) avec une incrémentation de pos += 10, en faisant cela ton servomoteur saccadera moins car il n'aura pas à faire des pas de +1 à chaque fois.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Super_Cinci

Peux-tu nous mettre le code complet, car j'ai un sérieux doute. En effet, la lib Servo envoie une pulse dont la durée dépend de la valeur utilisée dans myservo.write(); . Tu ne devrais pas avoir besoin de gérer le délai entre les pulses, la lib utilise un timer pour ça. Il faut savoir que la méthode .write() génère une brève pause dans le délai entre les pulses, et c'est peut-être ça qui te gêne si tu l'utilises trop souvent...

dam3

bonjour,

je joins le code.
Car en changent  (pos1 = 0; pos1 <90; pos1 +=1) par  (pos1 = 0; pos1 <90; pos1 +=10) et en changent le delay  cela ne change la vitesse mais la fluidité du servomoteur reste néanmoins la même.

skywodd


je joins le code.
Car en changent  (pos1 = 0; pos1 <90; pos1 +=1) par  (pos1 = 0; pos1 <90; pos1 +=10) et en changent le delay  cela ne change la vitesse mais la fluidité du servomoteur reste néanmoins la même.

J'avais oublié de préciser, si tu fait 10x plus de pas à chaque tour de boucle il faut un délai 10x plus grand pour avoir la même vitesse, sinon ça revient à faire la même chose :smiley-mr-green:
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

dam3

skywodd je ne comprend pas bien se que tu veux dire? peux tu écrire le code stp?

skywodd


skywodd je ne comprend pas bien se que tu veux dire? peux tu écrire le code stp?

Un truc dans ce genre:
Code: [Select]
for(pos = 0; pos < 180; pos += 10) {
    myservo.write(pos);
    delay(200);
}
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

dam3

je ne peux pas mettre pos 180 car si je fais cela le servomoteur fera une rotation de 180 degrés au lieu des 90 recherché.

dam3

Je me pose une question serai t il possible de faire un truc de style :
for ( pos = 0; pos<90, pos = 0,1)
{
  myservo.write (pos);
  delay (20);
}

ce qui ferai que j'augmente le nombre de pas et donc moins se saccade.

fdufnews

pos doit être un entier

dam3

oui pos doit être un entier l'idée serai d'avoir plus de pas pour avoir moins de saccade. mais comment l'écrire?

Christian_R

Tu as essayé avec un autre servomoteur ?
Parce qu'avec un incrément de 1° j'obtiens un mouvement bien fluide.
Christian

Go Up