Piloter des servos indépendamment grâce à des boutons avec une carte PCA9685 et un Arduino Uno
Description :
Projet permettant de contrôler plusieurs servomoteurs de manière indépendante à l’aide de boutons physiques, en utilisant une carte PCA9685 connectée à un Arduino Uno.
Chaque bouton est associé à un servo ou à une action spécifique, permettant de déplacer le servo à des positions prédéfinies ou ajustables. La carte PCA9685, via son interface I2C, libère les broches PWM de l’Arduino et permet de piloter jusqu’à 16 servomoteurs simultanément avec un contrôle précis.
Cette configuration est idéale pour des projets de robotique, bras articulés, animatronique, ou tout système nécessitant un pilotage manuel interactif de plusieurs servos. Elle illustre également la combinaison efficace de commandes physiques avec la gestion de multiples sorties PWM via un contrôleur dédié.
Prérequis :
- 1 x Carte Arduino Uno
- 1 x Carte PCA9685
- 3 x Servo numérique Sg90
- 3 x Bouton
- 1 x Breadboard
- Fils de connexion
Version IDE :
- Arduino IDE 2.3.5
Bibliothèque :
- Adafruit BusIO (version: 1.17.2 par Adafruit)
- Adafruit-PWM-Servo-Driver-Library-master (version: 3.0.2 par Adafruit)
Vidéo de démonstration :
Schéma de câblage :


Code :
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
#define MIN_PULSE_WIDTH 600
#define MAX_PULSE_WIDTH 2600
#define SERVO_FREQ 50
int BtJaune = 2;
int BtBleue = 3;
int BtVert = 4;
bool EtatBtJaune;
bool EtatBtBleue;
bool EtatBtVert;
uint8_t servonum = 1;
void setup() {
Serial.begin(9600);
pwm.begin();
pwm.setOscillatorFrequency(27000000);
pwm.setPWMFreq(SERVO_FREQ);
delay(10);
pinMode(BtJaune, INPUT_PULLUP);
pinMode(BtBleue, INPUT_PULLUP);
pinMode(BtVert, INPUT_PULLUP);
}
void loop() {
EtatBtJaune = digitalRead(BtJaune);
if (EtatBtJaune == HIGH) {
pwm.setPWM(2, 0, setServoPulse(90));
}
else {
pwm.setPWM(2, 0, setServoPulse(0));
}
EtatBtBleue = digitalRead(BtBleue);
if (EtatBtBleue == HIGH) {
pwm.setPWM(1, 0, setServoPulse(90));
}
else {
pwm.setPWM(1, 0, setServoPulse(0));
}
EtatBtVert = digitalRead(BtVert);
if (EtatBtVert == HIGH) {
pwm.setPWM(0, 0, setServoPulse(90));
}
else {
pwm.setPWM(0, 0, setServoPulse(0));
}
}
int setServoPulse(int angle) {
int pulse_wide, analog_value;
pulse_wide = map(angle, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
analog_value = int(float(pulse_wide) / 1000000 * SERVO_FREQ * 4096);
return analog_value;
}
