Variation de vitesse de servomoteurs

Bonjour, j'ai récemment acheté un shield moteur Adafruit ainsi que deux servomoteurs (Continuous Rotation : SM-S4303R). Je voudrais savoir si c'est possible de faire varier la vitesse de ses moteurs avec le temps. Par exemple :

vitesse moteur1 : v1(t)= 10t
vitesse moteur2 : v2(t)= 5
t

Est ce que quelqu’un pourrait m'aider à réaliser ce type de programme ou me montrer des exemples s'il vous plait ?

si vous lisez la doc de la classe Servo vous verrez que le paramètre fourni dans la fonction writeMicroseconds() sert à piloter la vitesse (et sens de rotation)

par exemple

  • une valeur entre 1280 et 1480 vous fera tourner entre -150 Tour par minute dans un sens et 0 (arrêt)
  • une valeur entre 1480 et 1520 vous conserve à l’arrêt
  • une valeur entre 1520 et 1720 vous fera tourner entre 0 Tour par minute (arrêt) et +150 Tour par minute (dans l’autre sens)

→ il vous faut donc une formule bête (linéaire par exemple) qui vous donne une courbe de transfert entre le temps et la bonne valeur pour la fonction

Par exemple voici un graphe typique de relation entre le duty cycle et la vitesse en tour par minute d’un moteur à rotation continue
v.png

Vous superposez le temps et votre courbe de vitesse souhaitée en fonction du temps et vous écrivez la fonction de transfert inverse que vous souhaitez voir. Par exemple au t0 sélectionné pour avoir 50 Tours par minute il faudra choisir 1585(à la louche)

Merci pour votre éclairement, c'est exactement ce que je cherchais. Par contre j'avoue avoir un peu de mal à réaliser les boucles sur C (n'étant que familier avec Python). Peut-on utiliser utiliser une variable t représentant le temps comme indice pour gérer des incrémentations ou peut-on bêtement superposer les commandes à la suite ?

Dans une fonction oui - comme indice dans un tableau... ça va dépendre de la taille du tableau que vous avez en tête

Regardez la fonction millis() pour gérer le temps

Sinon pour bien débuter avec l’arduino, un bon point de départ c’est de lire les tutos d’eskimon et un bon tuto en C (et quelques bases de C++)

Petite précision sur le terme servo-moteur "continous".

Pour un vrai servo moteur on lui envoi une position et il s'y maintien.
Les ordres sont des signaux de commande répétitifs avec l' état Haut qui dure entre 1,5ms et 2,5 ms.
1,5 ms correspond à l'angle minimal et 2,5ms correspond à l'angle maximal.

Un "continuous servo" est un moteur à rotation continu comme tous les moteurs classiques.
Sa particularité est qu'il utilise le principe des signaux de commande des vrai servo pour régler sa vitesse et son sens de rotation.
Arret --> largeur de l'état haut = 2ms
Sens de variation : si le temps de l'état haut est supérieur à 2ms le moteur tourne dans un sens, si le temps est inférieur à 2ms le moteur tourne dans l'autre sens.
Vitesse : très logiquement si à 2ms le moteur est à l'arret plus on se rapproche de 1,5ms ou de 2,5 ms plus la vitesse du moteur augmente.

C'était une petite précision pour le cas où tu trouverai de la documentation qui te paraitrait contradictoire.

Très bien, merci beaucoup :slight_smile:

Rebonjour, j'arrive d'aurenavant a contrôler la commande de mes rotors mais je viens de me rendre compte que les deux moteurs (Continuous Rotation : SM-S4303R) reliés à mon moteur Shield ne suivent pas la même loi de vitesse. Une courte étude expérimentale a montrée que les courbes reliant l'instruction a la vitesse possèdent des paliers différents (voire des coefficients directeurs différents). Je me demande ainsi s'il est possible de translater cette courbe pour que lorsqu'on applique la même instruction, les deux moteurs tournent à la même vitesse.

Naivement, je mettrais une fonction par moteur, (sort la commande en fonction de la vitesse désirée) et je m'interdirais de permuter les moteurs..
Il y a un point qui m'inquiéte : que se passe-t-il si les moteurs -ou leur electronique- vieillissent?

Oui c'est ce que j'ai fais mais ça me paraît bizarre que les deux moteurs n'aient pas la même vitesse alors que c'est exactement le même modele...

Vous avez les tolérances d'usinage et celles de l'electronique: avec ça, ce serait étonnant que les moteurs, même du même lot, aient un comportement identique.

dbrion06:
Vous avez les tolérances d'usinage et celles de l'electronique: avec ça, ce serait étonnant que les moteurs, même du même lot, aient un comportement identique.

Ok mais le comportement doit être sensiblement le même, hormis si acheté séparément, dans ce cas c'est pas nécessairement exactement les même modèles.

RemiJaylet:
Rebonjour, j'arrive d'aurenavant a contrôler la commande de mes rotors mais je viens de me rendre compte que les deux moteurs (Continuous Rotation : SM-S4303R) reliés à mon moteur Shield ne suivent pas la même loi de vitesse. Une courte étude expérimentale a montrée que les courbes reliant l'instruction a la vitesse possèdent des paliers différents (voire des coefficients directeurs différents). Je me demande ainsi s'il est possible de translater cette courbe pour que lorsqu'on applique la même instruction, les deux moteurs tournent à la même vitesse.

Comment est mesurée la vitesse?

Si la synchronisation entre les 2 moteurs est importante, il va peut être envisager la mise en place d'une commande en boucle fermée, type régulation PID

Ok mais le comportement doit être sensiblement le même, hormis si acheté séparément, dans ce cas c'est pas nécessairement exactement les même modèles.

Même s'ils proviennent du même lot, ils peuvent vieillir différemment.... ce qui rend votre idée d'asservissement séduisante , au moins à terme (faire une fonction pour les contrôler implique que les tolérances ne se modifieront pas... ce qui est trop optimiste) .

A propos: Quelle est l’importance de la vitesse dans le projet? A quoi vont servir les servos?

Si on reprend l’énoncé en début de sujet, tu veux juste avoir 2 courbes d’accélération différentes, a voir dans le détail si une regulation est pertinente

Je souhaite realiser une camera câblée dans un plan (projet d'étude). J'ai mesuré la vitesse en comptant le nombre de rotations réalisé en un temps précis.
Pour une même commande, la vitesse semble toujours décalée de qlqs RMP pour le deuxième moteur.

C'est une camera qui tourne pour pouvoir admirer un panorama? Alors, peut être que la vitesse de rotation n'a pas d'importance? (c'est ce point qui gêne : parce que, si elle a de l'importance, peut être que votre compte tours peut informer l'arduino , débouchant sur l'idée de Monsieur Jambe - un servo moteur ne consomme presque pas d'UC, donc il reste quelque marges dans votre arduino)