Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Actionneurs > Les moteurs électriques > Les servomoteurs > Trouver le neutre d’un servomoteur modifié

Trouver le neutre d’un servomoteur modifié

samedi 12 mars 2011, par Julien H.

Lorsqu’un servomoteur a été modifié pour tourner continuellement (on parle de "rotation continue"), on perd l’asservissement en position. Le circuit électronique fait une lecture figée du potentiomètre (ou des résistances selon la nature de la modification) et n’atteint donc jamais la position que vous lui demandez d’atteindre.

Explications pour modifier un servomoteur en rotation continue

La première étape lorsqu’on reçoit un servomoteur à rotation continue ou qu’on en fabrique un est de déterminer quelle est la valeur du "neutre", soit la consigne à envoyer pour que le moteur ne tourne plus.

JPEG - 211.6 ko

Note : certains parlent de "servomoteurs à 360°" mais le terme de "rotation continue" est plus explicite. De plus il y a réellement des servomoteurs non modifiés qui peuvent réaliser un grand angle de rotation (parfois même plus d’un tour) donc il faut éviter les confusions.



 Principe

Le signal typique d’un servomoteur a une largeur à niveau haut variable entre 1 et 2 millisecondes : on pourrait croire que le neutre est à 1,5 millisecondes mais ce n’est pas toujours le cas, selon la qualité de la modification et des composants utilisés (potentiomètre fixé ou résistances produisant une division de la tension).

Avec le logiciel Arduino, c’est exactement la même chose : le développeur ne voit pas la largeur du signal en millisecondes, mais demande un angle entre 0 et 180. Or un servomoteur à rotation continue ne va pas s’arrêter à une consigne de 90 !

 Raison

On pourrait penser qu’il suffit de couper le signal du servomoteur pour arrêter la roue. Sauf que la plupart des servomoteurs de modélisme standard ont un asservissement qui varie selon l’écart entre la position courante lue sur le potentiomètre et la consigne du signal que la radiocommande ou le contrôleur envoie : plus l’écart est grand, plus la vitesse de rotation est grande. Donc si vous utilisez ces servomoteurs modifiés pour propulser un robot, vous ne pouvez pas simplement utiliser une consigne pour avancer et une consigne pour reculer. En plus il faut inverser les deux consignes, car généralement les moteurs sont disposés en miroir et le sens de rotation est différent pour chacune des roues lorsqu’on souhaite avancer dans la même direction.

Enfin, il est intéressant de connaitre ce neutre afin de réaliser un contrôle de vitesse automatique : vous utilisez les valeurs de consigne autour du neutre pour obtenir des vitesses plus ou moins rapides (voir les graphes sur nos autres articles). Avec des formules d’asservissement, le développeur n’a pas forcément la maitrise de l’arrêt des roues : en donnant une vitesse moyenne et un cap, le contrôleur va en déduire la vitesse de chacune des roues à tout instant, il faut donc être bien certain de la valeur du neutre.

PNG - 7.3 ko

 Code source

Il y a plein de façons différentes, je vous donne celle que j’avais imaginée il y a deux ans lors de la réalisation du Pobot Easy.


/**
* @author Julien Holtzer - julien.holtzer gmail.com
* @date 23-05-2009
*
* This code is intended to test the "zero" position of a 360� servomotor.
* Modified servomotor Futaba S3003 used on the Pobot Easy mobile robot
* is turning continuously in one direction or another depending on the
* standard servo command.
*
* Considering that a Servo (in standard Arduino 0013 library) can receive
* an angle in degree as command between 0 and 180, the zero should be 90,
* but due to the physical modification, it isn’t that simple.
*
* This code will help the user to test several values sent via a serial terminal
* for tuning the control software of any robot using this kind of modified servo.
*/

#include

<Servo.h>

// servo object representing the motor
Servo serv ;

// servo connection to the Arduino (digital output 9 or 10)
int servPin = 9 ;

// default value that will be updated when the user sends a new value
int valeur = 90 ;

void setup()

// configure your serial terminal to 9600, N, 8, 1 (standard configuration for Arduino)
Serial.begin(38400) ;
// attach the servo with standard values
serv.attach(servPin) ;

void loop()

// test if a new value has been received
if (Serial.available())

// update without any control
valeur = Serial.read() ;

// update the command of the servo
serv.write(valeur) ;

// confirm the current value (equivalent to a servo position but continously rotating)
Serial.print("> position : ") ;
Serial.print(valeur) ;
Serial.println() ;

// 1/2 second delay to avoid saturation (don’t update values more than twice per second)
delay(500) ;


Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici
  • Ce formulaire accepte les raccourcis SPIP [->url] {{gras}} {italique} <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document