Leçon 86 : Contrôler la position d'un servomoteur à l'aide d'un potentiomètre
Imaginez tourner un simple bouton et regarder un bras mécanique suivre précisément chacun de vos mouvements. C'est la magie de combiner un potentiomètre avec un servomoteur. Ce projet, faisant partie du cours Arduino Step by Step de Robojax, démontre un concept fondamental et incroyablement utile en électronique : traduire une entrée analogique en mouvement physique précis. Vous apprendrez à lire une tension variable provenant d'un potentiomètre, à mapper cette valeur sur une plage d'angles, et à commander un servomoteur pour qu'il tourne à cette position exacte. C'est votre porte d'entrée vers la création de projets intuitifs et interactifs où le contrôle manuel rencontre l'automatisation.

Les applications de cette compétence sont vastes et pratiques. Voici quelques idées pour vous inspirer :
- Contrôle de bras robotique : Utilisez un potentiomètre pour positionner manuellement chaque articulation d'un bras robotique pour des opérations précises de prise et de dépôt.
- Système de panoramique et d'inclinaison de caméra : Construisez un support de caméra télécommandé pour des laps de temps ou de la surveillance, effectuant un panoramique et une inclinaison fluides avec une simple rotation d'un bouton.
- Réplique de jauge analogique : Créez une jauge de tableau de bord physique (comme un compteur de vitesse ou un cadran de température) qui bouge en fonction des données du capteur, le potentiomètre servant d'outil de dérogation manuelle ou d'étalonnage.
- Installations artistiques interactives : Créez des sculptures cinétiques qui réagissent aux entrées des spectateurs, où tourner un bouton change la position des pièces mobiles.
- Direction de véhicule miniature : Contrôlez l'angle de direction d'une voiture ou d'un bateau miniature à distance, offrant une sensation plus intuitive et analogique que des boutons numériques.
Ce guide est basé sur le tutoriel vidéo Leçon 86 : Contrôler la position d'un servomoteur à l'aide d'un potentiomètre par Robojax (dans la vidéo à 00:00). Il vous accompagne tout au long du processus, de la compréhension du câblage à l'explication du code qui fait tout fonctionner. Commençons.
Matériel et composants
Pour suivre ce projet, vous aurez besoin des composants suivants :
- Une carte Arduino (par exemple, Uno, Nano)
- Un servomoteur standard (par exemple, SG90 ou MG996R)
- Un potentiomètre (résistance variable, généralement 10kΩ)
- Des fils de connexion
- Une plaque d'essai (optionnelle, pour des connexions plus faciles)
Comprendre le câblage
Le câblage de ce projet est simple. La clé est de fournir les connexions d'alimentation et de signal correctes pour le servomoteur et le potentiomètre. Le servomoteur est un appareil gourmand en énergie, il reçoit donc son alimentation directement de la broche 5V de l'Arduino. Le potentiomètre agit comme un diviseur de tension, et nous lisons la tension à sa broche centrale (le curseur) pour déterminer sa position. (dans la vidéo à 01:05)
Une astuce intelligente utilisée dans ce projet est de créer une source 5V supplémentaire sur une broche numérique pour alimenter le potentiomètre, car certaines cartes Arduino n'ont qu'une seule broche 5V dédiée. Cela se fait dans le code en réglant une broche numérique (broche 8) sur HIGH, ce qui produit 5V. (dans la vidéo à 00:39)
Voici le schéma de câblage mentionné dans la vidéo :
Détaillons les connexions :
- Servomoteur :
- Alimentation (fil rouge) → broche 5V de l'Arduino
- Masse (fil marron/noir) → broche GND de l'Arduino
- Signal (fil orange/jaune) → broche 3 de l'Arduino (une broche compatible PWM)
- Potentiomètre :
- Broche gauche → broche GND de l'Arduino
- Broche centrale (curseur) → broche analogique A0 de l'Arduino
- Broche droite → broche 8 de l'Arduino (définie comme VCC2 dans le code)
Explication du code
Le code de ce projet est élégamment simple. Il utilise quelques fonctions clés d'Arduino pour lire le potentiomètre et contrôler le servomoteur. Concentrons-nous sur les parties configurables que vous pouvez ajuster pour vos propres projets. (dans la vidéo à 03:00)
En haut du croquis, vous définirez les broches et créerez l'objet servomoteur. Ce sont les principales variables que vous modifierez en fonction de votre câblage :
#include <Servo.h>
Servo myservo; // créer un objet servomoteur pour contrôler un servomoteur
int potpin = A0; // broche analogique utilisée pour connecter le potentiomètre
int servoPin = 3; // définir une broche numérique (avec PWM) pour le servomoteur. Peut utiliser uniquement les broches 3, 5, 6, 9, 10, 11
int VCC2 = 8;// définir un VCC supplémentaire pour le potentiomètre
int val; // variable pour lire la valeur de la broche analogique
Voici ce que fait chaque partie :
- Servo myservo; : Cette ligne crée un objet nommé
myservoque nous utiliserons pour contrôler notre servomoteur spécifique. Vous pouvez le renommer, mais vous devez utiliser le même nom plus tard dans le code. - int potpin = A0; : Cela définit quelle broche analogique est connectée au curseur du potentiomètre. Si vous déplacez le fil vers une autre broche analogique, vous devez mettre à jour ce numéro.
- int servoPin = 3; : Cela définit la broche numérique pour le fil de signal du servomoteur. Il est crucial d'utiliser une broche compatible PWM (généralement celles marquées d'un '~' sur la carte). Le commentaire liste les broches valides pour la plupart des Arduino.
- int VCC2 = 8; : C'est la broche que nous utilisons comme source 5V secondaire pour le potentiomètre. Si vous avez une carte avec plusieurs broches 5V, vous pouvez la connecter directement et supprimer cette partie du code.
Dans la fonction setup(), le code initialise le servomoteur et configure la broche d'alimentation supplémentaire. La fonction myservo.attach(servoPin) est essentielle car elle indique à l'Arduino quelle broche est connectée au fil de signal du servomoteur.
void setup() {
Serial.begin(9600); // configuration de la communication série
myservo.attach(servoPin); // attache le servomoteur sur la broche 3 à l'objet servo
pinMode(VCC2, OUTPUT);// définit la broche 8 comme sortie
digitalWrite(VCC2, HIGH);// met la broche 8 à HIGH pour qu'elle agisse comme une broche 5V
}
La logique principale se trouve dans la fonction loop(). Elle lit la valeur du potentiomètre, la convertit en angle, et commande au servomoteur de se déplacer. Les deux fonctions critiques ici sont analogRead() et map(). (dans la vidéo à 04:27)
void loop() {
val = analogRead(potpin); // lit la valeur du potentiomètre (valeur entre 0 et 1023)
val = map(val, 0, 1023, 0, 180); // la convertit pour l'utiliser avec le servomoteur (valeur entre 0 et 180)
myservo.write(val); // définit la position du servomoteur selon la valeur convertie
Serial.print(val);
Serial.println();
delay(50); // attend que le servomoteur atteigne sa position
}
Voici comment cela fonctionne :
- analogRead(potpin) : Cette fonction lit la tension provenant du curseur du potentiomètre et renvoie une valeur entre 0 (0V) et 1023 (5V).
- map(val, 0, 1023, 0, 180) : C'est la clé de tout le projet. Elle prend la valeur brute du potentiomètre (0 à 1023) et la convertit proportionnellement en angle de servomoteur (0 à 180 degrés). Par exemple, si le potentiomètre lit 511 (environ la moitié), la fonction
map()renverra 90, déplaçant le servomoteur à sa position centrale. - myservo.write(val) : Cette fonction prend l'angle calculé (maintenant stocké dans
val) et ordonne au servomoteur de tourner à cette position. - delay(50) : Cela ajoute une petite pause à la fin de chaque boucle. Cela contrôle la fréquence de mise à jour. Un délai plus long (comme 200 ms) fait bouger le servomoteur par étapes, tandis qu'un délai plus court (comme 50 ms) rend le mouvement très fluide. Vous pouvez l'ajuster pour modifier la réactivité. (dans la vidéo à 07:26)
Démonstration du projet en direct
Dans la vidéo, vous pouvez voir le projet en action. Lorsque le bouton du potentiomètre est tourné, le bras du servomoteur suit sa position proportionnellement. Le moniteur série affiche l'angle actuel, confirmant que la conversion fonctionne correctement. Lorsque le potentiomètre est à sa position minimale, le servomoteur est à 0 degré. En tournant le bouton jusqu'à son maximum, le servomoteur tourne en douceur jusqu'à 180 degrés. (dans la vidéo à 06:33)
Cette boucle de rétroaction en temps réel démontre l'intégration transparente d'un capteur analogique avec un actionneur numérique, créant un système de contrôle réactif et intuitif.
Chapitres
- [00:00] Introduction et aperçu du projet
- [01:05] Schéma et câblage
- [02:07] Démonstration du câblage physique
- [03:00] Explication du code
- [06:33] Démonstration et tests en direct
- [07:26] Réglage de la vitesse de réponse du servomoteur
/*
* Lesson 88: Controlling Servo motor a with Potentiometer
* 📚⬇️ Download and resource page https://robojax.com/RJT763
watch full video tutroial: https://www.youtube.com/watch?v=ntRW77mNFFk
Controlling a servo position using a potentiometer (variable resistor)
by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>
modified on 8 Nov 2013
by Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/Knob
Update by Ahmad Shamshiri on Jan 01, 2019 in Ajax, Ontario, Canada
*/
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int potpin = A0; // analog pin used to connect the potentiometer
int servoPin = 3; // define a digital pin (with PWM) for servo. Can use only pin 3, 5, 6,9, 10, 11
int VCC2 = 8;// define extra VCC for potentiometer
int val; // variable to read the value from the analog pin
void setup() {
//
Serial.begin(9600); // setup serial
myservo.attach(servoPin); // attaches the servo on pin 3 to the servo object
pinMode(VCC2, OUTPUT);// set pin 8 as output
digitalWrite(VCC2, HIGH);// set pin 8 HIGH so it acts as 5V pin
}
void loop() {
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023, 0, 180); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val); // sets the servo position according to the scaled value
Serial.print(val);
Serial.println();
delay(50); // waits for the servo to get there
}
Ce dont vous pourriez avoir besoin
-
Amazon
-
Amazon
-
eBay
-
AliExpressAchetez le moteur servo SG90 180 ou 360 sur AliExpress.s.click.aliexpress.com
Ressources et références
Fichiers📁
Autres fichiers
-
Fiche technique du moteur SG90 Seroo
robojax-servo-SG90_datasheet.pdf0.12 MB