Un servo moteur , permet de contrôler une position en fonction d’une consigne , très pratique en robotique et dans d’autres projets.

Servo vient du mot asservissement

const int FS90_MIN = 500; const int FS90_MAX = 2400;

Le fil rouge est l’alimentation en 5V à 7V max.

Le fil marron ou noir , le GND , le 0 , la masse !

Le fil orange la consigne en PWM du servo-moteur

la consigne ici est envoyé sur le fil orange c’est une PWM , impulsion de 500 à 2400 micro seconde

Durées d’impulsion en MICROSECONDES (µs) :

« Le FS90 utilise un circuit intégré spécialisé et dédié, souvent un NE544 ou un équivalent, qui agit comme le cerveau analogique du servo. Ce n’est pas un microcontrôleur programmable, mais une puce câblée pour exécuter une seule tâche : la commande en boucle fermée d’un moteur pour atteindre une position définie par un signal PWM. »

  • 1 ms (500 µs) = Position 0°
  • 1.5 ms (1450 µs) = Position 90°
  • 2 ms (2400 µs) = Position 180°
/********************************************/
/* Code pour maîtriser un SERVO_MOTEUR FS90 */
/********************************************/
#define signal 10
#define imp 1000
/* 400 <  imp  <2400 */

void setup() 
{
  pinMode(signal, OUTPUT);
}


/* boucle de commande du SERVO_Moteur fréquence 50Hz */
void loop() 
{
  digitalWrite(signal, HIGH);
  delayMicroseconds(imp);  
  digitalWrite(signal, LOW);
  delayMicroseconds(20000-imp);      
}

Code avec un Timer (Circuit intégré dans le Microcontrôleur TWI sur l’atmega328p)

Et la on va utiliser le C++ (car oui le compilateur pour arduino est g++), car l’objet Servo est introduit !

Dans la librairie Servo.h

Sachant que cet objet n’est utilisable que tu les broches possédant un TILDA ~ car si on regarde la documentation de l’ATMEGA328P seul ces broches sont connectable sur un Timer capable de gérer les Temps sans prendre de ressource au microprocesseur du microcontrôleur.

broche à utiliser pour la PWM

~3  ~5  ~6  ~9  ~10  ~11

L’objet Servo()

Fréquence de 50Hz par et on règle la valeur min et max de l’impulsion à 1, le premier paramètre est la PIN utilisée.

#include <Servo.h>

Servo monServo;  /* Créer un objet servo , instanciation de l'objet , appel du constructeur */

void setup() 
{
  monServo.attach(9, 500, 2400);  /* initialisation de l'objet */
  // Positionner à 0° (500µs)
  monServo.writeMicroseconds(500);
  
  delay(1000);  /* Attendre 1 seconde pour la stabilisation */
}

void loop() 
{
  /* Le servo reste à 0°
     et le processeur ne fait rien , il est tout pour vous dans le loop()
     Pas besoin de répéter l'instruction
     le signal PWM est gérer automatiquement par l'objet monServo qui a programmé un circuit dédié Timer (TWI)
   */
}

Maintenant on va utiliser la méthode write qui permet de transmettre l’angle de consigne du servo-moteur

#include <Servo.h>

Servo monServo;  /* Créer un objet servo , instanciation de l'objet , appel du constructeur */

void setup() 
{
  monServo.attach(9, 500, 2400);  /* initialisation de l'objet */
  // Positionner à 0° (500µs)
  monServo.write(0);
  
  delay(1000);  /* Attendre 1 seconde pour la stabilisation et retour à zero*/
}

void loop() 
{
int angle;

for (angle=0;angle<180;angle++)
    {
    monServo.write(angle);
    delay(10);
    }
delay(1000);
monServo.write(0);
delay(1000);
}
Que fais ce code ?