Auteur Sujet: Vitesse d'un SERVO  (Lu 9869 fois)

Loco28

  • Newbie
  • *
  • Messages: 24
    • Voir le profil
Vitesse d'un SERVO
« le: décembre 25, 2022, 07:22:12 pm »
Bonjour,
Je veux remplacer une commande de PN à base de moteur par des servos.
Aucun problème pour faire fonctionner le servo comme je le veux, sauf pour ce qui est de la vitesse.
J'ai bien testé ce que j'ai vu sur le site en utilisant la fonction writeMicroseconds(angle)
Si j'obtiens bien le temps souhaité (4s) pour le déplacement voulu (200), le servo se déplace par à coup: (de l'ordre de 10 pas de 20).
Bref, pour bouger une barrière de PN ce n'est pas l'idéal.
Est-ce une limitation du à ce type de servo (9g) ou bien y-a-t-il autre chose à faire?

PourUnTest

  • Newbie
  • *
  • Messages: 1
    • Voir le profil
Re : Vitesse d'un SERVO
« Réponse #1 le: décembre 25, 2022, 09:45:34 pm »
Bonsoir,

peut-être la bibliothèque SlowMotionServo répond à votre problème.
https://www.locoduino.org/spip.php?article159
« Modifié: décembre 25, 2022, 10:06:17 pm par msport »

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1081
  • HO avec DCC++
    • Voir le profil
Re : Vitesse d'un SERVO
« Réponse #2 le: décembre 26, 2022, 06:28:46 am »
Bonjour, effectivement, la bibliothèque SlowMotionServo offre de nombreuses possibilités et elle est assez simple à utiliser pour peu que l'on prenne le temps de "potacher" la doc. Dans votre cas (PN) vous pourriez adopter une fonctionnalité qui est le rebond en fin de course qui serait du plus bel effet sur un PN. La barrière arrive en fin de course et "rebondit" légèrement sous l'effet de son poids contre la buttée puis se stabiliser !

Cependant vous aurez le même problème si vous utilisez la fonction writeMicroseconds à la place de write et vis et versa.

Pour entrer des angles en paramètre, il faut utiliser write()
Si vous utilisez la fonction writeMicroseconds dont la résolution est beaucoup plus importante et qui vous offrira donc de mouvement beaucoup plus fluides, il faut mettre en paramètre de la fonction des microseconds. Un servo travaille généralement dans la plage 800 à 2400 microsecondes.

Entrez writeMicroseconds(1500) et votre servo va se déplacer vers ce qui constitue environ le milieu de sa course. Entrez writeMicroseconds(1000) et il se positionnera vers son début de course et  writeMicroseconds(2000), il se positionnera vers sa fin de course.

Attention, ne cherchez pas à aller à taquet ou au delà dans un sens ou un autre, vous risquez de détruire les engrenages internes.

chris_bzg

  • Sr. Member
  • ****
  • Messages: 319
    • Voir le profil
Re : Vitesse d'un SERVO
« Réponse #3 le: décembre 26, 2022, 10:59:24 am »
...
J'ai bien testé ce que j'ai vu sur le site en utilisant la fonction writeMicroseconds(angle)
Si j'obtiens bien le temps souhaité (4s) pour le déplacement voulu (200), le servo se déplace par à coup: (de l'ordre de 10 pas de 20).
Bref, pour bouger une barrière de PN ce n'est pas l'idéal.
Est-ce une limitation du à ce type de servo (9g) ou bien y-a-t-il autre chose à faire?

Si votre servo se déplace par à coups, on peut suspecter deux choses :
- son alimentation en courant n'est pas suffisante, mais pour un servo 9g, cette alimentation peut être prise sur le 5V de la carte Arduino, tant qu'on ne dépasse pas deux servos
- la force du servo peut ne pas être suffisante, surtout avec un 9g qui est un petit servo (de plus, je ne connais pas le mécanisme de votre PN, il grippe peut-être)
Donc la première chose à faire est d'essayer votre programme avec des servos non reliés à la mécanique du PN. Ensuite, vous verrez si cela corrige ou non le problème. Si la réponse est non, c'est votre programme qui est en cause, par exemple faisant d'autres tâches pendant le mouvement ou utilisant trop la fonction delay().
Pour motoriser un PN avec des servos, vous pouvez lire l'article "Passage à niveau géré par Arduino (3)". Il donne la méthode à utiliser.
Le seul intérêt de SlowMotionServo est d'ajouter un rebond sur la barrière, ce qui se conçoit sur un PN manoeuvré par une garde barrière jusque dans les années 60-70, mais pas pour un PN contemporain (SAL2 ou SAL4).

Loco28

  • Newbie
  • *
  • Messages: 24
    • Voir le profil
Re : Vitesse d'un SERVO
« Réponse #4 le: décembre 26, 2022, 07:32:55 pm »
Bonsoir,
Merci d'abord pour vos différentes réponses.
Le PN est une fabrication perso (3D) et il est commandé actuellement pas un micro-moteur + vis sans fin.
L'axe des barrières comprend un levier (2mm) et 1 tige descend vers un autre levier solidaire de l'axe relié au moteur (via pignon et vis sans fin). L'axe est commun aux 2 barrières.
J'ai tout calculé pour que le mouvement des barrières se fasse en 4 ou 5s.
Tout fonctionne sauf, qu'avec les jeux, il y a des différences entre les deux barrières dans les positions ouvertes ou fermées.

Mon idée est donc de commander le mouvement par 2 servos eg90, les tiges actuelles étant reliées aux levier des servos.
Pour respecter les temps d'ouverture/fermeture, il me faut une vitesse très lente au niveau des servos. La course est également très petite.
Je fais donc des essais sur un servo posé sur ma table de travail.
Pour avoir le déplacement et la vitesse voulues, je dois mettre speedServo à 150 (voir plus) et limiter le déplacement à 5°.
Sauf que ce déplacement va se faire en 3 ou 4 bonds comme si ce servo avait un problème de résolution, ce qui n'est pas acceptable au niveau du mouvement des barrières.
J'ai fait la même constatation avec "writemicrosecond". Par exemple, je faisais des "+1" à partir de 1500 et le servo bougeait seulement à 1520, 1540, 1560, .....
Le servo est-il la bonne solution pour mon montage?
Y-at-il des servos avec une meilleure résolution (comme pour les moteurs pas à pas)?

msport

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2217
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
Re : Vitesse d'un SERVO
« Réponse #5 le: décembre 26, 2022, 08:47:46 pm »
Est-ce une limitation du à ce type de servo (9g) ?
Non, j'ai utilisé ce type de servo SG90 avec la bibliothèque SlowMotionServo sans a coups.
Testez avec les exemples de celle ci.
Cordialement

JPB

  • Newbie
  • *
  • Messages: 47
    • Voir le profil
Re : Vitesse d'un SERVO
« Réponse #6 le: décembre 27, 2022, 06:59:51 am »
Bonjour,
J'avais ce problème d'à-coup sur mes barrières au début et résolu ce soucis en mettant une alim 5V séparée et un condo de 100nF (0,1µF) au plus près des servos. D'autre part, le montage est basé sur de la corde à piano et un angle de presque 90° des servos. L'effet est très réaliste...

chris_bzg

  • Sr. Member
  • ****
  • Messages: 319
    • Voir le profil
Re : Re : Vitesse d'un SERVO
« Réponse #7 le: décembre 27, 2022, 10:17:13 am »
...
Tout fonctionne sauf, qu'avec les jeux, il y a des différences entre les deux barrières dans les positions ouvertes ou fermées.
...
Le servo est-il la bonne solution pour mon montage?
Y-at-il des servos avec une meilleure résolution (comme pour les moteurs pas à pas)?

Lorsque j'ai développé mon PN décrit dans la série d'articles et dans Loco-Revue, j'ai eu moi aussi des différences de positions entre les deux barrières, mais j'ai trouvé la solution, celle qui est décrite dans l'article 3 au sujet de la transmission du mouvement. Au final, les deux barrières étaient bien synchronisées et le mouvement était lent, sans à coups et réaliste comme ceux des PN SAL2.

Le servo est UNE solution mais pas la seule. Si un moteur avec vis sans fin donne un meilleur résultat, pourquoi voulez-vous changer pour un servo ?

Enfin, oui il existe des servos de meilleures qualité et forcément plus chers. Leur positionnement est plus précis (pas au point d'atteindre une précision de 1 avec writeMicroseconds(), mais meilleure que les 9g trouvés dans les boites de début). Leur force de déplacement est aussi plus importante (certains sont utilisés en aéromodélisme pour des maquettes géantes (petits gros) où les forces aérodynamiques sont importantes).

Tout cela pour dire que la solution que j'ai présentée dans la série d'articles permet d'obtenir un PN réaliste, paramétrable et adaptable à tous les réseaux. S'en inspirer ou pas ne dépend que de vous.

Loco28

  • Newbie
  • *
  • Messages: 24
    • Voir le profil
Re : Vitesse d'un SERVO
« Réponse #8 le: décembre 27, 2022, 05:21:26 pm »
Bonjour,
Le problème avec un seul moteur c'est que cela nécessite une mécanique extrêmement précise pour synchroniser parfaitement les barrières et le "jeu", bien qu'étant l'âme de la mécanique, n'est pas forcément le bienvenu dans un montage à cette échelle avec des pièces en 3D. De plus, le mouvement ne peut-être piloté qu'en termes de durée de fermeture ou d'ouverture..
Comme je l'ai dit, cela fonctionne mais je cherche à améliorer, donc déjà avec 2 "moteurs" et pour le pilotage précis, 2 pistes: moteurs pas à pas ou servos.
Pour l'instant je n'ai pas pu tester la bibliothèque "SlowMotionServo" car je n'ai qu'un ESP32 sous la main pour des tests et manifestement cette bibliothèque ne fonctionne pas avec.
Donc passage par la case appro d'un Arduino avant de poursuivre.

chris_bzg

  • Sr. Member
  • ****
  • Messages: 319
    • Voir le profil
Re : Vitesse d'un SERVO
« Réponse #9 le: décembre 27, 2022, 06:00:27 pm »
Des deux solutions, le servo est la plus facile à mettre en oeuvre. En effet, un servo se positionne précisément entre 0 et 180°, alors qu'un moteur PaP n'a pas d'origine pour décompter les pas.
Je vous invite donc à regarder les principes que j'ai développé pour le PN et vous en inspirer. De plus, c'est transposable à un ESP32 puisque la bibliothèque ESP32Servo est faite pour lui. Le système de came excentrique m'a donné toute satisfaction afin de transformer un mouvement important (90° de rotation) en un mouvement court (translation de quelques millimètres).

Loco28

  • Newbie
  • *
  • Messages: 24
    • Voir le profil
Re : Vitesse d'un SERVO
« Réponse #10 le: décembre 30, 2022, 05:48:22 pm »
Bonsoir,
J'ai reçu un Arduino donc je peux reprendre mon projet.
J'ai testé la bibliothèque SlowMotionServo: c'est très bien, le mouvement me convient (avec le petit programme proposé).
Par contre, le programme que j'ai fait pour tester les différentes fonctions (position max, min, vitesse, ...) ne fonctionne pas: j'ai droit à un déplacement (vers position initial probablement) puis un petit déplacement à "toute vitesse" puis plus rien.
Je pense que j'ai besoin d'un peu d'aide.
Merci d'avance

#include <Servo.h>
#include <SlowMotionServo.h>
 
  SMSLinear monServo;
 
void setup() {
  Serial.begin(115200); // communication avec le moniteur
  monServo.setPin(10);
  monServo.setMin(700);
  monServo.setMax(1800);
  monServo.setSpeed(1.7);
  monServo.setInitialPosition(0.1);
  monServo.goTo(0.0);
}
void loop() {
 
    SlowMotionServo::update(); /* actualisation de la position */ 
    monServo.goTo(1.0);
    delay(2000);
    monServo.goTo(0.0);
    delay(2000);
}  // fin de loop
« Modifié: décembre 30, 2022, 06:41:46 pm par msport »

chris_bzg

  • Sr. Member
  • ****
  • Messages: 319
    • Voir le profil
Re : Vitesse d'un SERVO
« Réponse #11 le: décembre 30, 2022, 07:09:19 pm »
Peut-être que votre problème vient de ceci :
SlowMotionServo::update()
Met à jour les positions de tous les servos. Cette fonction de classe doit être appelée dans loop(). Il ne faut pas que le temps d’exécution de loop() soit trop long sinon le mouvement du ou des servomoteurs se fera par à-coups [1]. Il faut notamment et absolument bannir delay().
Ceci est écrit dans l'article qui décrit la bibliothèque SlowMotionServo.
Mais avant d'utiliser SlowMotionServo, avez-vous déjà tenté d'écrire un programme de déplacement lent avec simplement Servo ? Ou avez-vous utilisé un des exemples de cette bibliothèque comme Sweep ?

« Modifié: décembre 30, 2022, 07:21:17 pm par chris_bzg »

Loco28

  • Newbie
  • *
  • Messages: 24
    • Voir le profil
Re : Vitesse d'un SERVO
« Réponse #12 le: décembre 30, 2022, 08:10:02 pm »
Bonsoir,
Effectivement j'ai oublié cette particularité "delay".
Donc je supprime mais cela ne change pas.
Juste pour être sûr, quand je demande un goTo(1.0) je vais vers la position que j'ai défini comme "max" et goTo(0.0) vers la "min"?
Sinon j'ai déjà testé un servo avec un ESP32 mais les déplacements sont soit "lisses" mais rapides, soit "saccadés" et lent, d'où mon intéret pour SlowMotion

chris_bzg

  • Sr. Member
  • ****
  • Messages: 319
    • Voir le profil
Re : Vitesse d'un SERVO
« Réponse #13 le: décembre 31, 2022, 10:42:47 am »
Utilisez votre carte Arduino et le programme sweep et changez la valeur des delay() pour déterminer ce qu'il vous faut pour réaliser un mouvement lent sans qu'il soit saccadé.
Avant d'utiliser SlowMotionServo, il faut déjà avoir utilisé Servo, et je ne suis pas sûr que vous l'ayez fait puisque vous ne répondez pas aux questions qu'on vous pose et qui nous permettrait de cerner plus facilement vos difficultés.
Après, il ne faut pas rêver non plus : la précision du servo est de l'ordre du degré pour un servo de qualité, et si vous voulez augmenter la durée du mouvement, il y aura un moment où il sera saccadé, que ce soit avec Servo ou SlowMotionServo. Tout est donc question de compromis, et pour ma part, ce que j'ai utilisé pour mon PN me semble un bon compromis car crédible. Avez-vous regardé ?
Si vous voulez aller au-delà, il vous faudra utiliser un moteur, un encodeur (pour avoir sa position absolue), et une démultiplication pour augmenter le nombre de pas. Le tout en double puisqu'il y a deux barrières. A vous de voir.