Étiquettes : , , , ,

L’un des objectifs principaux de la robotique est d’articuler des objets. Pour se faire, il est très courant d’utiliser des moteurs électriques et plus particulièrement des servomoteurs. Nous allons voir dans cet article, commet programmer la carte Arduino pour pouvoir piloter un servomoteur et nous irons plus loin dans l’utilisation des librairies notamment de Servo.h.

Prérequis: Programmez avec Arduino

Matériel

  • Ordinateur
  • Carte Arduino UNO
  • Câble USB pour connecter la carte Arduino au PC
  • 3x câble mâle/mâle
  • 1x servomoteur

Servomoteur

Les servomoteurs sont de petits concentrés de technologie qui mêlent mécanique et électronique, largement utilisés en modélisme, en robotique et d’en d’autres applications. Ils tiennent leur nom du fait qu’ils peuvent asservir eux même leur position (ou leur vitesse).

Ils sont composés d’un moteur à courant continu, d’une boite de réduction et d’une carte électronique embarquée permettant le contrôle de la position à l’aide d’un signal de modulation de largeur d’impulsion (en anglais : PWM – Pulse Width Modulation).

Schéma de connexion

Le servomoteur est alimenté par une tension au borne du fil noir/marron la masse (GND) et au fil rouge la tension batterie (+5V) ; et est piloté par un le signal PWM envoyé sur le fil jaune/blanc (borne 9). Selon le nombre et la puissance du servomoteur utilisé, il peut être alimenté par la borne 5V de la carte Arduino. La carte Arduino peut être alimentée par l’ordinateur via le port USB.

Code de base pour le contrôle de servomoteur

Pour piloter le servomoteur en position, il faut donc envoyer un signal à modulation de largeur d’impulsion.

//Déclaration des constantes
#define UPDATE_TIME 20

//Déclaration des paramètres
int servoPin = 9;
int pulse = 1500;


void setup() {
  // Code d'initialisation
  pinMode(servoPin,OUTPUT);
  Serial.begin(9600); 
}

void loop() {
  // Code principal
  digitalWrite(servoPin,HIGH);
  delayMicroseconds(pulse);
  digitalWrite(servoPin,LOW);
  delay(UPDATE_TIME);
}

Ceci n’est bien sûr pas très pratique. Le mieux serait de demander une position au servomoteur. Pour cela, on peut créer une sous-fonction qui nous permettrait de convertir une position en largeur d’impulsion. Pour ça nous faisons un peu de math : Si on a :

  • 5V pendant 500µs (0,5ms) correspond à 0 degré
  • 5V pendant 1500µs (1,5ms) correspond à 90 degré
  • 5V pendant 2500µs (1,5ms) correspond à 180 degré

Alors on peut calculer la règle de conversion entre position angulaire et durée d’impulsion

//Déclaration des constantes
#define UPDATE_TIME 20

//Déclaration des paramètres
int servoPin = 9;
int angle = 50;


void setup() {
  // Code d'initialisation
  pinMode(servoPin,OUTPUT);
  Serial.begin(9600); 
}

void loop() {
  // Code principal
  digitalWrite(servoPin,HIGH);
  delayMicroseconds(convertirAngleEnImpulsion(angle));
  digitalWrite(servoPin,LOW);
  delay(UPDATE_TIME);
}

// Déclaration d'un sous fonction
int convertirAngleEnImpulsion(int ang){
  float a = 2000.0/180.0;
  float b = 500;

  return int(a*ang+b);
}

Des programmes bien plus complexes peuvent être écrits pour Arduino mais vous pouvez vous attaquer à de nombreuses applications avec ces connaissances de base et la connaissance de certaines librairies. Comme la librairie du servomoteur que nous allons voir tout de suite.

N.B. Ce code vous montre le principe d’un signal PWM. En pratique, pour appliquer un signal PWM à un servomoteur ou à une LED on utilisera la fonction analogWrite() disponible sur certaine broche de l’Arduino. Cette fonction prend en entrée une valeur de 0 à 255.

//Déclaration des constantes
#define UPDATE_TIME 20

//Déclaration des paramètres
int servoPin = 9;


void setup() {
  // Code d'initialisation
  pinMode(servoPin,OUTPUT);
  Serial.begin(9600); // Initialise la communication série PC/Arduino
}

void loop() {
  // Code principal
  for(int i=0;i<180;i++){
    analogWrite(servoPin,convertirAngleEnPWM(i));
    delay(UPDATE_TIME);
  }
delay(200);
  for(int i=180;i>=0;i--){
    analogWrite(servoPin,convertirAngleEnPWM(i));
    delay(UPDATE_TIME);
  }
 delay(200);
}

// Déclaration d'un sous fonction
int convertirAngleEnPWM(int ang){
  float a = 255.0/180.0;
  return (a*ang);
}

Contrôle de servomoteur avec la librairie Servo.h

Nous avons vu qu’il est possible de créer des sous-fonctions contenant du code que nous pouvions réutiliser à volonté. Ces sous-fonctions sont stockées dans des librairies, des fichiers extérieurs au programme principal, mais qui peuvent être utilisées pour n’importe quelle application. Elles ont été créées afin d’organiser les programmes de manière plus claire et de simplifier le travail des programmeurs afin d’éviter le copier-coller ainsi que la réécriture de code. Voilà comment on utilise la librairie : On ajoute la librairie dans le code à l’aide du mot clé #include. On regarde la documentation disponible sur le site Arduino afin de pouvoir l’utiliser correctement (par exemple).

//Librairie
#include <Servo.h>

//Déclaration des constantes
#define UPDATE_TIME 15
#define MAX_POS 180
#define MIN_POS 0

//Déclaration des paramètres
int servoPin = 9;
int pulse = 1500;
char s="1.5";
//Déclaration des variables
Servo myServo;  // création d'un objet Servo
// Sur la plupart des cartes, on peut créer jusqu'à douze objets

int pos=0;    // variable contenant la position du servomoteur

void setup() {
  myServo.attach(servoPin); 
}

void loop() {
  for (pos = MIN_POS; pos <= MAX_POS; pos += 1) { 
    myServo.write(pos);              
    delay(UPDATE_TIME);                       
  }
  for (pos = MAX_POS; pos >= MIN_POS; pos -= 1) { 
    myServo.write(pos);             
    delay(UPDATE_TIME);                      
  }
}

Création de sa propre librairie ServoLib.h

La création de librairie permet de réutiliser des morceaux de code dans plusieurs projets sans avoir à les réécrire. Une librairie est composée de deux fichiers en langage c (un fichier .cpp et un fichier .h) ayant le même nom. Le fichier .h, dit header, contient la déclaration des variables, des fonctions et des classes utilisés. Le fichier .cpp contient le code à proprement parler. Ces fichiers doivent être placés dans le dossier portant le nom de la librairie dans le répertoire suivant : .Documents/Arduino/libraries.

Le fichier ServoLib.h

#ifndef ServoLib_h
#define ServoLib_h

//Déclaration des constantes
#define UPDATE_TIME 15
#define MAX_POS 180
#define MIN_POS 0
#define MAX_PULSE_WIDTH 2500
#define MIN_PULSE_WIDTH 500

//Déclaration de la classe
class ServoLib
{
 public:
  ServoLib(); //constructeur
  int servoPin; //broche du servomoteur
  void associePin(int pin); 
  void envoiePosition(int value);
  int convertirAngleEnImpulsion(int ang);
  void appliquerImpulsion(int pulse);
};

#endif

Le fichier ServoLib.cpp

#include <ServoLib.h>

ServoLib::ServoLib(){}

void ServoLib::associePin(int pin){
  servoPin=pin;
  pinMode(servoPin,OUTPUT);
}

void ServoLib::envoiePosition(int value){
  int pulse=0;
  if (value<MIN_POS)
    value=MIN_POS;
  else if (value>MAX_POS)
    value=MAX_POS;

  value=map(value,MIN_POS,MAX_POS,MIN_PULSE_WIDTH,MAX_PULSE_WIDTH);
  pulse=this->convertirAngleEnImpulsion(value);
  this->appliquerImpulsion(pulse);
}

void ServoLib::appliquerImpulsion(int pulse){
  digitalWrite(servoPin,HIGH);
  delayMicroseconds(pulse);
  digitalWrite(servoPin,LOW);
  delay(UPDATE_TIME);
}

int ServoLb::convertirAngleEnImpulsion(int ang){
  float a = 2500/180;
  float b = 500;

  return int(a*ang+b);
}

Le fichier keyword.txt est optionnel. Il permet de modifier la couleur des noms de fonction dans le programme Arduino.

#######################################
# Syntax Coloring Map ServoLib
#######################################

#######################################
# Datatypes (KEYWORD1)
#######################################

ServoLib  KEYWORD1  ServoLib

#######################################
# Methods and Functions (KEYWORD2)
#######################################
associePin KEYWORD2
envoiePosition  KEYWORD2
convertirAngleEnImpulsion KEYWORD2
appliquerImpulsion KEYWORDS2

#######################################
# Constants (LITERAL1)
#######################################
UPDATE_TIME LITERAL1
MIN_POS LITERAL1
MAX_POS LITERAL1
MIN_PULSE_WIDTH LITERAL1
MAX_PULSE_WIDTH LITERAL1

Sans le fichier keywords.txt

Avec le fichier keywords.txt

Lorsque vous rechargez le programme vous pouvez voir dans le Menu Croquis > Inclure une bibliothèque que la librairie que nous venons de créer a été ajoutée à la liste.

Le code peut ainsi être simplifié comme suit :

//Librairie
#include "ServoLib.h"

//Déclaration des paramètres
int servoPin = 9;

//Déclaration des variables
ServoLib myServo;  // création d'un objet Servo
// Sur la plupart des cartes, on peut créer jusqu'à douze objets

int pos=0;    // variable contenant la position du servomoteur

void setup() {
  myServo.associePin(servoPin);
}

void loop() {
  for (pos = MIN_POS; pos <= MAX_POS; pos += 1) {
    myServo.envoiePosition(pos);
    delay(UPDATE_TIME);
  }
  for (pos = MAX_POS; pos >= MIN_POS; pos -= 1) {
    myServo.envoiePosition(pos);             
    delay(UPDATE_TIME);                      
  }
}

Prochaines étapes

Référence

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie