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; //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 ServoLib::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
- Pilotez plusieurs servomoteurs avec un contrôleur série
- Pilotez un moteur CC
- Pilotez un moteur pas à pas
Référence
- La THE référence https://www.arduino.cc/
- plus particulièrement référence servo https://www.arduino.cc/en/Reference/Servo
- référence librairie : https://arduino.cc/en/Guide/Libraries
- Programmez avec Arduino
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie
Bonjour,
Petit problème de syntaxe dans l’exemple avec servo.h
char s= »1.5″;
il faut mettre:
char s = 1.5;
Enfin j’ai fait ça et ça fonctionne
la variable s n’est pas utilisé. merci