Auteur Sujet: Bibliothèque SlowMotionServo  (Lu 2529 fois)

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1190
    • Voir le profil
Bibliothèque SlowMotionServo
« le: mars 26, 2015, 06:16:57 pm »
Bonjour à tous,

En me replongeant dans le travail que j'avais effectué pour piloter 8 servo-moteurs, voir la série d'articles sur mon blog, j'ai voulu remettre les choses à plat.

En effet, quand on pilote un servo-moteur pour bouger les aiguilles d'un aiguillage, on se moque un peu de la manière dont le mouvement est effectué, du moment qu'il est lent. J'avais donc fait un mouvement linéaire sans phase d'accélération ou de décélération. Donc le plus basique possible.

Voulant maintenant manœuvrer des portes de remise, je voulais un mouvement réglable en vitesse, mais aussi que la position angulaire suive une trajectoire qui ne soit pas forcément une droite. Je veux par exemple que la porte vienne en butée puis rebondisse et s'arrête progressivement.

je me suis demandé si il n'existait pas une bibliothèque pour effectuer des mouvements lents sur les servo-moteurs et je n'ai absolument rien trouvé.

J'en ai donc fait une.

On peut donc pour chaque servo :

  • définir les positions minimum et maximum ;
  • régler la vitesse indépendamment dans chaque sens de déplacement ;
  • définir une trajectoire quelconque sous la forme d'une courbe mathématique ;

3 trajectoires sont disponibles toutes faites :
- linéaire
- accélération puis décélération en sinus
- accélération en sinus, rebond sur la butée et décélération en 1/temps

Pour l'instant j'ai un prototype qui tourne mais il faut que je finisse de monter une remise pour montrer le mouvement des portes :) Il faut également que je vérifie que l'Arduino arrive à calculer des fonctions complexes pour 8 servos sans que le mouvement en pâtisse.

Je me servirai de cette bibliothèque pour mettre à jour le logiciel pour piloter 8 servo-moteurs.

On peut la récupérer ici : https://github.com/Koryphon/SlowMotionServo

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 190
    • Voir le profil
    • Locoduino
Re : Bibliothèque SlowMotionServo
« Réponse #1 le: mars 27, 2015, 09:13:17 am »
Très intéressant comme biblio. Une pile pour le projet locoduino.
Mis en todo pour étudier cela correctement.
En regardant rapidement, il faut que je m'inspire de la fonction update pour la mienne mais comme les objets changent de nom, il faut que je me remettre dedans. La todo est trop longue.
G.

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1190
    • Voir le profil
Re : Bibliothèque SlowMotionServo
« Réponse #2 le: mars 27, 2015, 10:49:11 am »
J'ai vérifié hier soir que l'on pouvait calculer des fonctions sinus en flottant pour 8 servos sans que le mouvement en soit affecté. J'avais un peu peur qu'au niveau calcul ça ne passe pas mais en fait c'est bon :)

Une fois les valeurs min et max définies via setMin, setMax ou setMinMax pour définir les deux valeurs extrêmes d'un coup. Ces valeurs sont en micro-secondes. La position à atteindre via goTo s'exprime avec un nombre flottant de 0.0 à 1.0

La vitesse (setSpeed, setMinToMaxSpeed et setMaxToMinSpeed) s'exprime aussi avec un nombre flottant. Par défaut la vitesse est de 1.0 (hier c'était 0.0001 mais maintenant je divise par 10000 ce qui est passé à setSpeed, c'est plus sympa d'être autour de 1). On peut descendre en dessous.
« Modifié: avril 13, 2015, 03:29:05 pm par Jean-Luc »

railyRabbit

  • Newbie
  • *
  • Messages: 26
    • Voir le profil
Re : Bibliothèque SlowMotionServo
« Réponse #3 le: mai 10, 2015, 06:57:50 pm »
Hello,

J'ai découvert cette semaine la librairie VarSpeedServo, avec la quelle j'ai un peu joué. C'est pratique, on peut régler la vitesse mais elle n'intègre pas de courbes à proprement parler.

rR

TF53

  • Newbie
  • *
  • Messages: 47
    • Voir le profil
Re : Re : Bibliothèque SlowMotionServo
« Réponse #4 le: mai 10, 2015, 11:12:55 pm »
J'ai vérifié hier soir que l'on pouvait calculer des fonctions sinus en flottant pour 8 servos sans que le mouvement en soit affecté. J'avais un peu peur qu'au niveau calcul ça ne passe pas mais en fait c'est bon :)

Une fois les valeurs min et max définies via setMin, setMax ou setMinMax pour définir les deux valeurs extrêmes d'un coup. Ces valeurs sont en micro-secondes. La position à atteindre via goTo s'exprime avec un nombre flottant de 0.0 à 1.0

La vitesse (setSpeed, setMinToMaxSpeed et setMaxToMinSpeed) s'exprime aussi avec un nombre flottant. Par défaut la vitesse est de 1.0 (hier c'était 0.0001 mais maintenant je divise par 10000 ce qui est passé à setSpeed, c'est plus sympa d'être autour de 1). On peut descendre en dessous.

La bibliothèque est en effet très interessante, cependant, une question me reste à l'esprit?
A quoi correspond le paramètre vitesse? est ce qu'il y a une conversion à faire entre la valeur qu'on rentre dans le paramètre et la valeur de la vitesse réelle?

Ceci m'amène à une autre question : Ayant commencé la programmation par l'assembleur (sur PIC), je me demandais si avec le C++ on pouvait, tout comme en assembleur, compter le nombre de cycles d'horloge utilisés par instruction? Le C++ étant un language haut niveau, il me parait difficile de déduire des temps précis uniquement grace au programme. Mais peut être que je me trompe?

Tim

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1190
    • Voir le profil
Re : Re : Re : Bibliothèque SlowMotionServo
« Réponse #5 le: mai 11, 2015, 12:12:37 pm »
A quoi correspond le paramètre vitesse? est ce qu'il y a une conversion à faire entre la valeur qu'on rentre dans le paramètre et la valeur de la vitesse réelle?

La position du servo est une fonction du temps. Le temps est la durée en millisecondes depuis l'instant initial où le mouvement est lancé. La vitesse est en fait un facteur multiplicatif du temps. Le temps est normalisé entre 0.0 (position initiale) et 1.0 (position finale). Par défaut la vitesse est de 1, ce qui correspond à 0,0001 de facteur multiplicatif. C'est à dire que pour atteindre un temps normalisé de 1, il faudra 10s. Dans l'exemple la vitesse est mise à 2, il faut donc 5s pour accomplir le mouvement. La position est aussi normalisée en fonction des positions min et max. la vitesse angulaire sera donc différente selon l'écart max-min.

Citer
Ceci m'amène à une autre question : Ayant commencé la programmation par l'assembleur (sur PIC), je me demandais si avec le C++ on pouvait, tout comme en assembleur, compter le nombre de cycles d'horloge utilisés par instruction? Le C++ étant un language haut niveau, il me parait difficile de déduire des temps précis uniquement grace au programme. Mais peut être que je me trompe?

On peut mais il faut aller voir le code assembleur généré par le compilateur. Quoiqu'il en soit, ici le temps en compté via un timer et est donc indépendant du code qui s'exécute.

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1190
    • Voir le profil
Re : Re : Bibliothèque SlowMotionServo
« Réponse #6 le: mai 11, 2015, 02:44:40 pm »
J'ai découvert cette semaine la librairie VarSpeedServo, avec la quelle j'ai un peu joué. C'est pratique, on peut régler la vitesse mais elle n'intègre pas de courbes à proprement parler.

C'est une modification de la bibliothèque Servo originale. Effectivement le mouvement est seulement linéaire et on ne peut pas avoir une courbe de position en fonction du temps donc pas de possibilité de simuler des accélérations et décélérations, ni des rebonds.

SlowMotionServo intègre aussi un détachement automatique quand le servo a fini son mouvement avec un délai avant détachement programmable. Cela permet d'éviter qu'il ne grogne en butée contre une force de rappel, typiquement ce que l'on a sur un aiguillage.

La contrainte de SlowMotionServo est d'appeler répétitivement update dans loop.