Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Actionneurs > Les moteurs électriques > Les servomoteurs > Servomoteur à retour de position

Servomoteur à retour de position

lundi 10 mai 2010, par Julien H.

De la même manière qu’on a pu modifier un servomoteur pour obtenir une rotation continue, on peut modifier un servomoteur de modélisme standard (ici, un Futaba S3003) pour avoir un retour d’informations.

Dans le cas présent, on va tester le servomoteur à retour d’informations de EasyRobotics qui fournit une information de position sous forme d’une tension analogique, via un connecteur supplémentaire.

Matériel

 un servomoteur à retour d’informations
 une carte Arduino
 5 câbles de connexion (3 pour le servo, 2 pour le retour d’info)

Programmation

La commande d’un servomoteur existe déjà pour Arduino (comme nous l’avons déjà présenté dans la rubrique qui lui est dédiée) donc nous allons "étendre" la classe Servo en C++ qui est fournie avec l’environnement de développement sous forme de bibliothèque ("library"). Cela signifie qu’on va ajouter les fonctions et les valeurs propres au retour d’informations, sans avoir à redéfinir le fonctionnement général du servomoteur. C’est ce qu’on appelle "l’héritage" dans les langages orientés objet.

Voici la classe spécifique :


/**
* PositionServo.h
*
* Classe fille de la bibliothèque "Servo"
* définissant les fonctions spécifiques au retour d’informations
*
* (c) 2009 - J. Holtzer pour Pobot
*/

#ifndef PositionServo_h
#define PositionServo_h

#include "WProgram.h"

// déclaration de la classe et de l’héritage de Servo
class PositionServo :
public Servo

// ajout des variables du retour d’informations
private :

// la patte où est connecté le câble de retour d’info
int pinAnalog ;

// le nombre de degrés total entre les deux positions extrema
int totalDegres ;

// la valeur correspondant à la position la plus basse
int valLow ;

// la valeur correspondant à la position la plus haute
int valHigh ;

public :

PositionServo() :
Servo()
// patte ANALOG 0
pinAnalog = 0 ;
// 180 degrés de développement standard
totalDegres = 180 ;
// 205 = 1 volt pour 1024 = 5 volts (ADC 10 bits)
valLow = 205 ;
// 615 = 3 volts pour 1024 = 5 volts (ADC 10 bits)
valHigh = 615 ;
 ;

// personnalisation des valeurs (connexion et débattement)
void set(int pinArg, int degres)
pinAnalog = pinArg ;
totalDegres = degres ;
 ;

// calibrage des positions extrema
void calibrate(int level)
if (level == LOW)
valLow = analogRead(pinAnalog) ;

else
valHigh = analogRead(pinAnalog) ;

 ;

// affichage de la position (valeur analogique brute)
int position()
return analogRead(pinAnalog) ;
 ;

// affichage de la position (valeur en degrés entre 0 et total degrés)
int degres()
return (position()-valLow)*totalDegres/(valHigh-valLow) ;

 ;

#endif

Et voici un sketch de test :


#include "Servo.h"
#include "PositionServo.h"

PositionServo serv ;

int consigne ;

void setup()

pinMode(13,OUTPUT) ;
serv.attach(10) ;
//
Serial.begin(38400) ;
//
consigne = 0 ;
serv.write(consigne) ;

void loop()

while (Serial.available() > 0)

switch (Serial.read())

case ’+’ :
consigne += 10 ;
serv.write(consigne) ;
break ;
case ’-’ :
consigne -= 10 ;
serv.write(consigne) ;
break ;
case ’0’ :
serv.calibrate(LOW) ;
break ;
case ’1’ :
serv.calibrate(HIGH) ;
break ;
default :
Serial.println("> unrecognized command") ;

//
Serial.println(serv.position()) ;
//
delay(333) ;


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 champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.