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.