servo moteur

Bonjour a tous,
Pas de problème pour commander un servo moteur en degré, mais est t'il possible de le commander en demi degré voir moins ?
et aussi réduire la vitesse de déplacement avec une commande par deux boutons poussoir?

Un servo moteur se commande uniquement en millis secondes.
Les degrès ne sont qu'une facilité : une fonction converti les degrès en temps et envoie l'ordre en millis secondes.

L'information que l'on trouve encore partout de tmin = 1ms, tmax = 2ms est obsolette.
La plupart de servo-moteur actuels répondent à t min = 0,5ms et tmax = 2,5 ms (valeurs réelles à confirmer en ouvrant les fichiers de la bibliothèque SERVO qui est incluse à l'IDE arduino)

Capacité des servo moteurs à être commandé en demi degrè :
La réponse est principalement dans la qualité de fabrication des servo.

Un servo c'est :
un moteur,
un train d'engrenage réducteur,
un potentiomètre de retour d'information sur la position de l'axe de sortie
une électronique de commande.

La réponse est "Oui" si :
la piste du potentiomètre est bien homogène
il n'y a pas de jeu ni de point dur dans les engrenages
l'électronique d'asservissement est bien conçue

Avec un servo moteur de type S90 à 1 € la réponse sera non. A ce prix il ne faut pas espérer avoir une mécanique de précision -> tout en plastique moulé !
Il faudra taper dans du matériel de précision (dont engrenage en métal), le prix sera plus élevé.
Seule garantie : une datasheet où il sera noté noir sur blanc le pas min garanti.

Si l'on veut une précision plus importante et un fonctionnement lent, le servo n'est pas du tout adapté. C'est par contre la place d'un moteur pas à pas. Il y a plusieurs actionneurs servo, pas à pas, moteur courant continu, électroaimant, moteur asynchrone.... chacun a un domaine d'utilisation.

Je n'en ai pas l'utilité, c'etait une question que je me posais parmi d'autre :wink: .
Donc si j'ai bien compris, pas de problème, il suffit de commander en un certain nombres de millisecondes pour le faire tourner de x degrés, pour des servo de qualités.
dans la librairie servo.h en effet il est codé:
#define MIN_PULSE_WIDTH 544 // the shortest pulse sent to a servo
#define MAX_PULSE_WIDTH 2400 // the longest pulse sent to a servo

par exemple:
inc = 1500; // neutre servo
monservo.writeMicroseconds (inc+1); incrémentation de 1 micro seconde
ça tourne très doucement, plus on incrémente en micros secondes ( inc+ 50) plus on inscrit un angle important .

Il y a un piège.
Règle, pas forcément bien comprise sur les sites de vulgarisation :
544 c'est toujours pour l'angle minimal que peut faire le servo.
2400 c'est toujours pour l'angle maximal que peut faire le servo.

Le point milieu, ce que tu appelles le neutre n'est pas 1500 mais (544+2400)/2 = 1472.
Pour la conversion en degrés il faut tenir compte de l'amplitude du servo.

Il existe des servos d'amplitude 60°, 90°, 120°, 180°, 270° et probablement d'autres que j'ignore.
Dans la bibliothèque fournie avec l'DE il est supposé que les servos font 180°. La méthode pour piloter un servo avec des angles est fausse pour les autres servos.

Pour compliquer un peu plus dans les servo bas de gamme, par exemple le S90 180°, on trouve selon la réalisation mécanique des modèles qui ont moins de 180° de débattement et d'autres qui n'ont pas la même mécanique qui font plus de 180°.

ce code a l'air de fonctionner:

#include <Servo.h> 

/**** valeur a changer pour un angle plus ou moins fort ***/
/**********************************************************/
 int incrementation = 10; // environ ( 10 ) pour 1 degré
  
/**********************************************************/

 // entrés pin pour boutons
 int bt1 = 5; 
 int bt2 = 6;
 
 int inc=1472;  // milieu au démarrage 
 
// Crée un objet de type "Servo", nommé -> monservo
Servo monservo;  
 
void setup() 
{ 
  monservo.attach (3);   //entrée pin servo 
 
  monservo.writeMicroseconds (1472);  // met le servo au milieu
  
    pinMode(bt1, INPUT_PULLUP);
    pinMode(bt2, INPUT_PULLUP);
    
  //Serial.begin(9600);
} 
 
void loop () 
{
  // Récuperer valeur des boutons
  int b1 = digitalRead(bt1); // Plus
  int b2 = digitalRead(bt2); // Moins

  // Appuie bt1 Plus
  if (b1 == LOW) {
    inc = inc+incrementation; // incrémentation de la fréquance par pas de 10 micros secondes
    if (inc > 2400) { inc = 2400;}  // limite maxi servo
    monservo.writeMicroseconds (inc);
    delay(100);
  }
    // Appuie bt2 Moins
  if (b2 == LOW) {
    inc = inc-incrementation;
    if ( inc< 544) { inc = 544; }  // limite mini servo
    monservo.writeMicroseconds (inc);
    delay(100);
  }

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.