Infrarouge IR : Commande d’un servomoteur avec Arduino

Commande servomoteur Schéma de principe

Objectifs

  • Savoir le fonctionnement d’un servomoteur
  • Savoir comment contrôler un servomoteur avec Arduino
  • Savoir utiliser un récepteur IR avec Arduino
  • Etc.

Tx/Rx Infrarouge

Fonctionnement

Le mini projet est la deuxième application dédiée à l’utilisation de technologie infrarouge pour la commande et le contrôle des organes (voir le projet 19 dans la rubrique des projets microcontrôleurs). Dans le présent projet on essaye de mettre en pratique la commande d’un servomoteur en utilisant la liaison IR. On utilisera une télécommande IR composée de 21 touches, uniquement les touches « 1 » et « 2 » seront utilisées. Ci-dessous le cycle de fonctionnement du montage :

  • Pa défaut, le servomoteur est orienté avec un ange de 10°, la LED bleue est allumée (LED verte est éteinte) indiquant la position initiale du servomoteur.
  • Lorsqu’on appuie sur la touche « 1 » de la télécommande : On incrémente  l’angle d’un pas égal à 10° pour chaque appui, au même temps on fait clignoter la LED verte afin d’indiquer l’incrémentation effective de l’angle et la réception de la commande par le récepteur IR. Lorsque le compteur e l’angle atteint 180°, on réinitialise à 10° puis on allume la LED bleue (position initiale).
  • Lorsqu’on appuie sur la touche « 1 » de la télécommande : On réinitialise le moteur, autrement dit, a position le servomoteur à 10° puis on  allume la LED bleue.

Note : Il est recommandé de ne pas faire fonctionner le servomoteur avec un angle au voisinage du zéro au risque d’instabilité (vibration). D’où le choix d’un angle initial égal à 10°.

Servomoteur SG90

Spécifications

Minuscule et léger avec une puissance de sortie élevée. Le servomoteur peut pivoter d’environ 180 degrés (90 dans chaque direction), et fonctionne comme les types standard avec un format plut petit. Vous pouvez utiliser n’importe quel code dédié aux servomoteurs, matériel ou bibliothèque pour contrôler ce type de moteur. Pratique pour débuter en robotique sans oublie son coût faible.

  • Dimension: 22,2 x 11,8 x 31 mm environ.
  • Couple de décrochage: 1,8 kgf cm
  • Vitesse de fonctionnement: 0,1 s / 60 degrés
  • Tension de fonctionnement: 4,8 V (~ 5 V)
  • Largeur de la bande morte: 10 µs
  • Plage de température: 0 ºC – 55 ºC
  • Voir datasheet SG90

servomoteur SG90

Commande

Le SG90 dispose de trois pins : Alimentation +5V (rouge), Masse (Marron) et le signal de commande (Orange). La commande du moteur est basée sur le signal PWM d’une fréquence égale à 50 Hz (période de 20 ms). Contrairement à la variation de la vitesse d’un moteur à CC dont on peut ajuster le rapport cyclique du 0% à 100%, le servomoteur n’autorise qu’une variation allant de 1 ms à 2 ms : D’une autre façon un rapport cyclique variant de 1 ms /20 ms=5% à 2 ms/20 ms=10%. Si on utilise le formalisme 0-180° alors : 1 ms (angle 0°), 1.5 ms (angle 90°) et 2 ms (angle 180°). Ci-dessous les étapes de programmation d’un servomoteur.

Commande servomoteur SG90

1. Déclaration du servomoteur : <Servo.h>

#include <Servo.h>

// Déclaration du servomoteur 
Servo myservo;

2. Initialisation

void setup()  
{
  // Affectation du pin au servomoteur  
  myservo.attach(9);
}

3. Commande

…
myservo.write(10); // Position 10°
delay(500) ; 

myservo.write(90); // Position 90°
delay(500) ; 

myservo.write(170); // Position 170°
delay(500) ; 

myservo.write(10); // Position 10°
delay(500) ; 
…

Programme Arduino

#include "IRremote.h"
#include <Servo.h>

// Déclaration du servomoteur 
Servo myservo;  
unsigned short val_servo=10;

// Numéro du pin sortie du récepteur 
long int res_val;
const int receiver = 11; 

// Indicateur lampe 
const int ServoON = 2;
const int ServoOFF = 3;

// Pin servomoteur 
const int ServoPin = 9;

// Déclaration d'un objet IRrecv
IRrecv irrecv(receiver);           
decode_results results;            

void setup()  
{
  // Init servo-moteur 
  myservo.attach(ServoPin); 
  
  // Init du récepteur 
  irrecv.enableIRIn();
  
  // Indicateur mise en marche 
  pinMode(ServoON, OUTPUT);
  pinMode(ServoOFF, OUTPUT);
  
  // Initialisation 
  digitalWrite(ServoON, LOW);   
  digitalWrite(ServoOFF, HIGH);                                        
  myservo.write(10); 
}

void loop()  
{
  // Lecture de la télécommande 
  if (irrecv.decode(&results))
  {
    // Récupération du code   
    res_val = results.value;
    
    // Application d'un mode de démarrage du moteur
    MotorMode(res_val);
     
    // Réception de la nouvelle valeur
    irrecv.resume();
  }  
}

void MotorMode(long int res_val) 
{
  switch(res_val)
  {
    // Mode 1: Incrémentation de l'angle (+10)
    case 0xFF30CF: // Code '1'   

      // Incrémation postion 
      val_servo=val_servo+10; 
      if (val_servo>=180)
      {
        val_servo=10;
        myservo.write(val_servo); 
        digitalWrite(ServoOFF, HIGH); 
        break;
      }
      myservo.write(val_servo); 
      digitalWrite(ServoON, HIGH);
      digitalWrite(ServoOFF, LOW);
      delay(100);
      digitalWrite(ServoON, LOW);
      break;
  
    // Mode 2: Initialisation de l'angle à 10 degré 
    case 0xFF18E7: // Code '2'    
      
      // Initialisation servo 
      digitalWrite(ServoON, LOW);
      digitalWrite(ServoOFF, HIGH);
      val_servo=10;
      myservo.write(val_servo); 
      delay(100);
      break;
  }
}

Photos du projet

Photos Infrarouge IR Commande d’un servomoteur avec Arduino (5)

Photos Infrarouge IR Commande d’un servomoteur avec Arduino (4)

Photos Infrarouge IR Commande d’un servomoteur avec Arduino (3)

Photos Infrarouge IR Commande d’un servomoteur avec Arduino (2)

Photos Infrarouge IR Commande d’un servomoteur avec Arduino (1)

Vidéo démonstration

Téléchargement

Tout les projets microcontrôleur