Information
Une description technique du fonctionnement d’un servomoteur est disponible sur la page dédiée
Piloter un servomoteur pour le robot
Servomoteurs
Installer la bibliothèque ESP32Servo puis piloter un ou plusieurs servomoteurs en position, avec l'Arduino IDE ou PlatformIO.
Pré-requis :
Logiciels :
Machines/Outils :
Qu’est-ce qu’un servomoteur ? : Un servomoteur est un moteur électrique qui permet de contrôler des mouvements précis en termes de position, de vitesse et d’accélération. Très populaire en robotique, il est utilisé pour des applications nécessitant un contrôle précis, comme les bras robotiques, les voitures télécommandées, ou les systèmes de caméra motorisée.
Fonctionnement de base : : Les servomoteurs se contrôlent grâce à un signal PWM (Pulse Width Modulation). En fonction de la largeur de l’impulsion, ils adoptent une position spécifique (généralement entre 0° et 180°).
Avant de piloter des servomoteurs avec Arduino, il va falloir installer une librairie développée pour l’ESP32. Dans ce cadre, vous pouvez utiliser la librairie ESP32Servo, créée par Kevin Harrington et John K. Bennett. La marche à suivre dépend de l’environnement que vous utilisez.
Rendez-vous dans l’onglet de gauche Library Manager, recherchez ESP32Servo dans la barre de recherche, puis sélectionnez la bibliothèque créée par Kevin Harrington et John K. Bennett. Cliquez ensuite sur Install pour l’ajouter à votre projet.
Sous PlatformIO, les bibliothèques se déclarent directement dans le fichier de configuration du projet plutôt que via un gestionnaire graphique. Ajoutez ESP32Servo dans lib_deps de votre fichier platformio.ini :
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
lib_deps =
madhephaestus/ESP32Servo
Cette bibliothèque fonctionne exactement comme la bibliothèque Arduino classique Servo, mais elle est spécialement adaptée aux microcontrôleurs de type ESP32.
La bibliothèque Servo (ou ESP32Servo dans le cas de l’ESP32) permet de contrôler facilement des servomoteurs en générant des signaux PWM (Pulse Width Modulation). Ces signaux déterminent la position du servomoteur en ajustant la largeur de l’impulsion envoyée.
PWM et Position du Servomoteur :
Simplification avec la Bibliothèque : La bibliothèque Servo gère automatiquement la génération des signaux PWM en fonction de l’angle que vous spécifiez dans le code. Cela vous évite de configurer manuellement les timers ou d’écrire un code complexe.
Voici les principales fonctions de la bibliothèque et leur utilisation :
Servo.attach(pin)Lie un servomoteur à une broche spécifique de votre microcontrôleur.
Servo monServo;
monServo.attach(9); // Attache un servomoteur à la broche D9
Servo.write(angle)Positionne le servomoteur à un angle précis (entre 0° et 180°).
monServo.write(90); // Place le servo à 90°
Servo.writeMicroseconds(value)Permet un contrôle plus précis en envoyant directement une largeur d’impulsion (en microsecondes).
monServo.writeMicroseconds(1500); // Impulsion pour 90° (position médiane)
Servo.detach()Déconnecte le servomoteur de la broche, libérant ainsi les ressources.
monServo.detach(); // Libère la broche utilisée par le servomoteur
Voici un exemple simple pour comprendre comment utiliser la bibliothèque Servo :
#include <ESP32Servo.h>
Servo monServo;
void setup() {
monServo.attach(D7); // Attache le servo à la broche D7
}
void loop() {
monServo.write(0); // Positionne le servo à 0°
delay(1000); // Pause de 1 seconde
monServo.write(180); // Positionne le servo à 180°
delay(1000); // Pause de 1 seconde
}
Vous allez devoir imaginer des séquences de marche et bien d’autres pour votre robot. Afin de faire cela, nous allons utiliser des foncitons comme vu dans les chapitres précédentS. L’objectif par la suite est donc de mettre au point des séquences de marche et de les tester. Pour cela, vosu pouvez par exemple commencer par créer une fonction void walk() permettant au robot de marcher.
void walk(){
FootLeft.write(90));
LegLeft.write(90);
FootRight.write(90);
Legright.write(90);
delay(1000);
FootLeft.write(45);
LegLeft.write(90);
FootRight.write(90);
Legright.write(90);
//etc...
}
Cet exemple est très basique, et vous constaterez rapidement que modifier ce type de séquences peut devenir fastidieux à mesure que votre projet se complexifie.
Pour aller plus loin, il serait intéressant d’intégrer des fonctions qui permettent de piloter plusieurs servomoteurs avec des vitesses différentes ou de simplifier la création et la gestion des séquences. Cela rendra votre code plus lisible, modulaire et évolutif pour des applications plus avancées.