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