Le principe du servomoteur c'est d'être asservi en position.
Le problème :
A chaque nouvelle position "envoyé" au servomoteur, en utilisant une arduino et de la librairie servo, voir les tests par jekert ici le servomoteur va essayer d'y aller le plus vite possible, ce qui en fonction de ce qu'on fait n'est pas toujours le plus adapté ou le plus pratique.
Code de base :
//Bibliothèque : #include <Servo.h> //Ajoute la librairie Servo //servo1 : Servo servo1; //Déclare un nouveau servomoteur nommé servo1 int pos = 0; //Position initiale du servo #define PAUSE 2000 //Symbolise la pause en ms entre chaque mouvements du servo #define MIN 500 // Position 0° en microseconde #define MAX 2500 // Position 180° en microseconde void setup() { servo1.attach(9, MIN , MAX); //Attache servo1 au pin 9 avec MIN et MAX les extrêmes en } void loop() { servo1.write(0); // on va à 0° delay(PAUSE); // On attend 2000ms = 2s ( voir valeur du define PAUSE 2000 ) servo1.write(180); // on va à 180° delay(PAUSE); // On attend 2000ms = 2s ( voir valeur du define PAUSE 2000 ) }
Vidéo :
[Video]
La solution théorique :
Il est possible en rajoutant un peu de code et en rusant de changer la vitesse de déplacement.
Le principe de base est simple : il faut décomposer le mouvement en une succession de plusieurs positions !
Supposons qu'on veuille aller de 0 à 180° on va en faite dire qu'on veut aller à 2° puis 4° puis 6° ... jusqu'à 180°
Apres il y a deux façon différentes de voir la chose :
1) Base de temps fixe :
On peut fixer une base de temps et changer le nombre d'incrémentation.
Supposons qu'on fasse une boucle récurrente toute les 500ms.
Si dans cette boucle j'incrémente l'angle de position souhaité par le servo de 1° je vais voir le servomoteur se déplacer à une vitesse théorique de 2° par seconde ( 1s = 2 * 500ms = 2* 1° => 2° )
Cependant si maintenant au lieu d'incrémenter de 1 on incrémente de 2° on va voir le servomoteur se déplacer à une vitesse de 4°/s ... Ce qui donne bien une première façon de faire !
2) Incrémentation fixe :
On peut aussi fixer une base d'incrémentation et changer le délais entre les incrémentation, c'est à dire changer la fréquence d'exécution de notre boucle où on va mettre à jour la position du servo !
Je décide que dans cette boucle à chaque fois j'incrémenterais la position de 1°, du coup si j'exécute cette boucle toute les 500ms je me retrouve bien avec ma vitesse de 2° par seconde, cependant si maintenant j'exécute toujours cette même action d'incrémenter de 1° mais toute les 250ms je me retrouve bien avec une vitesse de 4°/s ...
3) Le mix pour les plus téméraires !
On peut s'ammuser à faire varier à la fois la base d'incrémentation et la base de temps pour complexifier (mais aussi pour " affiner " les réglages possible en fonction du besoin )
Défis
Proposer des codes arduino (accompagné d'une petite explication ,c'est à dire à minima la méthode choisie dans l'explication théorique ci dessus, et même d'une vidéo du résultat sinon c'est pas drôle ) Faîte danser vos robots!
Vous pouvez bien entendu aussi bien faire vos propres fonctions qu'utiliser une librairie si vous en avez une ( ou la faire si vous êtes courageux
)
PS:
N'hésitez pas à proposer une façon de faire même si c'est loin d'être optimal voir même à proposer d'autres solutions théorique si vous en avez !
1) c'est en forgeant qu'on devient forgeron et il n'y a que ceux qui font jamais rien qui ne font jamais de bêtises mais du coup ils n'apprennent jamais rien
2) La démarche sera beaucoup plus intéressante en explicitant pour un tel code n'est pas super, et comment on peut l'améliorer. Cela sera d'autant plus profitable pour le membre qui aura posté sont code mais aussi pour toute la communauté
J'espère que l'idée vous plaira !