Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Programmation > Apprendre à coder > Programmation Arduino > Ralentisseur de servomoteur

Ralentisseur de servomoteur

dimanche 20 octobre 2013, par Jean-Pierre, Julien H.

Cet article est une astuce pour contrôler la vitesse d’un servomoteur sans alourdir son programme principal. L’idée vient des modélistes qui utilisent des radio-commandes, et consiste à intercaler entre le signal et le servomoteur une petite puce qui fera l’intermédiaire.

Une petite carte électronique avec un micro-contrôleur, un potentiomètre et deux connecteurs identiques : un en entrée depuis une carte plus complexe ou un récepteur de radio-commande et un en sortie pour piloter un servomoteur.

Voilà en résumé un petit projet très intéressant pour ceux qui veulent piloter au ralenti un servomoteur sans avoir à gérer dans leur programme les différentes pauses nécessaires pour atteindre une vitesse lente constante.

Une carte électronique avait déjà été réalisée il y a quelques temps mais nous avons décidé de refaire ce projet et de le rendre public.

Par exemple pour piloter un bipède équipé de 4 servomoteurs ou plus, un programme sur un micro-contrôleur unique devra gérer les événements (capteurs, programme autonome, commandes externes) et les consignes de servomoteurs. Mais entre deux consignes, un servomoteur de modélisme classique peut s’avérer beaucoup trop rapide. Il faut alors gérer une transition lente de l’une à l’autre, pour les 4 moteurs, de manière simultanée. Intercaler 4 petites cartes intermédiaires avec leur propre code peut donc avoir du sens. D’autres usages existent, et nous espérons rendre service à un grand nombre de roboticiens ou de modélistes.

Codes sources

Voici un premier code comprenant une lecture d’un signal servo sur une patte, et la commande d’un unique servomoteur sur une autre patte, avec un délai entre chaque transition d’une consigne à l’autre. Tout est géré par le programme : le nombre d’incréments du signal PPM d’un servomoteur et le délai entre deux mises à jour de la position réelle commandée au servomoteur pour rejoindre la consigne reçue sur la patte de contrôle.

/* Ralentisseur de servomoteur
 *
 * Idée : Jean-Pierre C.
 * Programme : Julien H. pour Pobot
 *
 */

#include <Servo.h>

// entrée en lecture du récepteur R/C
#define SERVO_IN  8

// sortie vers un servomoteur
#define SERVO_OUT  9

// nombre d'incréments en µs entre deux mises à jour
// (premier paramètre de vitesse du servomoteur)
#define  INCR  1

// délai entre deux lectures de la consigne en ms
// (second paramètre de vitesse du servomoteur)
#define  DELAI  10


Servo s;

// la consigne de servomoteur en µs
int consigne = 1000;

// la position courante du servomoteur
int courante;

void setup()
{
  pinMode(SERVO_IN,OUTPUT);
  s.attach(SERVO_OUT);

}

void loop()
{
  // mise à jour de la consigne

  consigne = pulseIn(SERVO_IN,HIGH,50000);

  if (courante < consigne)
  {
    courante += INCR; 
  } 
  else {
    courante -= INCR; 
  }

  s.writeMicroseconds(courante);

  delay(DELAI);

}

Pour les plus pressés ou les réfractaires à Arduino, nous avons compilé ce programme pour un AVR ATmega8 avec horloge interne à 1 MHz en utilisant la patte PB0 (digital 8 de l’Arduino) en entrée et PB1 (digital 9 de l’Arduino) en sortie.

Voilà, la prochaine étape est de faire un circuit imprimé pour le micro-contrôleur et les deux connecteurs, voire de rendre la vitesse modifiable par un potentiomètre.

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.