Piloter un Pan tilt avec servos SG90 et un joystick connecté à un arduino
Description :
Ce projet consiste à piloter un système Pan-Tilt (support motorisé permettant des mouvements horizontaux et verticaux) à l’aide de deux servomoteurs SG90 contrôlés par un joystick analogique connecté à une carte Arduino.
La particularité de ce montage est que la vitesse de déplacement des servos varie en fonction de l’inclinaison du joystick :
- Si le joystick est légèrement déplacé, le mouvement est lent et précis.
- Si le joystick est fortement incliné, le mouvement devient plus rapide.
Ainsi, l’utilisateur peut contrôler à la fois la direction et la vitesse du Pan-Tilt, permettant un pilotage fluide et progressif.
Prérequis :
- 1 x Carte Arduino Uno
- 2 x Servo numérique Sg90
- 1 x Joystick KY-023
- 1 x Condensateur 1000μf 16v (optionnel)
- Fils de connexion
- 1 x Breadboard
Vidéo de démonstration :
Schéma de câblage :


Code :
#include <Servo.h>
Servo myservo1; // créer un objet Servo pour contrôler un servo
Servo myservo2; // créer un objet Servo pour contrôler un servo
#define VRX_PIN A0 // Broche Arduino connectée à la broche VRX
#define VRY_PIN A1 // Broche Arduino connectée à la broche VRY
#define SW_PIN 2 // Broche Arduino connectée à la broche SW
int xValue = 0; // Pour stocker la valeur de l'axe X
int xValueCentre = 0;
int yValue = 0; // Pour stocker la valeur de l'axe Y
int yValueCentre = 0;
int SWValue = 0; // Pour stocker la valeur du bouton SW
int Poservo1 = 90;
int Poservo2 = 90;
unsigned long previousMillis = 0;
int interval = 1000;
void setup() {
Serial.begin(9600);
// Déclare le bouton SW en entrée et on Active
// la résistance de rappel interne
pinMode(SW_PIN, INPUT_PULLUP);
myservo1.attach(5); // attache le servo sur la broche 5 à l'objet Servo
myservo2.attach(6); // attache le servo sur la broche 5 à l'objet Servo
//On lance une procédure pour enregistrer la valeur des joysticks au repos.
Serial.println("Ne pas toucher le Joystick initialisation");
int var = 0;
while (var < 6) {
delay(500);
var++;
Serial.print(".");
}
xValue = analogRead(VRX_PIN);
yValue = analogRead(VRY_PIN);
xValueCentre = xValue;
yValueCentre = yValue;
Serial.println("Initialisation terminer");
Serial.print("xValueCentre = ");
Serial.println(xValueCentre);
Serial.print("yValueCentre = ");
Serial.println(yValueCentre);
myservo1.write(Poservo1);
myservo2.write(Poservo2);
delay(2000);
}
void loop() {
unsigned long currentMillis = millis();
// lire les valeurs analogiques X et Y
xValue = analogRead(VRX_PIN);
yValue = analogRead(VRY_PIN);
// lire la valeur digital du bouton SW
SWValue = digitalRead(SW_PIN);
if (xValue > xValueCentre + 20) {
interval = map(xValue, xValueCentre + 10, 1024, 600, 1);
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
Poservo1 = Poservo1 + 1;
}
}
if (xValue < xValueCentre - 20) {
interval = map(xValue, xValueCentre - 10, 0, 600, 1);
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
Poservo1 = Poservo1 - 1;
}
}
Poservo1 = constrain(Poservo1, 0, 180);
if (yValue > yValueCentre + 20) {
interval = map(yValue, yValueCentre + 10, 1024, 600, 1);
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
Poservo2 = Poservo2 + 1;
}
}
if (yValue < yValueCentre - 20) {
interval = map(yValue, yValueCentre - 10, 0, 600, 1);
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
Poservo2 = Poservo2 - 1;
}
}
Poservo2 = constrain(Poservo2, 0, 180);
myservo1.write(Poservo1); // définit la position du servo en fonction de la valeur mise à l'échelle
myservo2.write(Poservo2); // définit la position du servo en fonction de la valeur mise à l'échelle
}

Merci pour vos super projets. J’ai monte ce projet hier mais étrangement mon servo sur l’axe x va a droite quand je pousse le joystick a gauche et vice versa. Il me semble que tout les câblage son correct, je n’ai pas mis condensateur ni d’alimentation externe. Auriez vous un conseil?
Voici une version corrigée et plus professionnelle de votre message, tout en restant simple et claire :
Version corrigée
Bonjour,
Merci de votre retour.
Pour inverser le sens, il faut modifier la valeur qui incrémente les positions. Par exemple, pour le premier servomoteur, au lieu d’incrémenter, il faut décrémenter pour inverser le mouvement.
Remplacer :
Poservo1 = Poservo1 + 1;par :
Poservo1 = Poservo1 - 1;et le faire sur les 4 calculs
Cordialement