#include <Wire.
h>
#include <Adafruit_PWMServoDriver.h>
// Création de l'objet PCA9685
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// Plage des impulsions pour les servos SG90 (généralement entre 500 et 2500 µs)
#define SERVO_MIN 500
#define SERVO_MAX 2500
// Canaux des servos sur le PCA9685
#define THUMB_CHANNEL 0
#define INDEX_CHANNEL 1
#define MIDDLE_CHANNEL 2
#define RING_CHANNEL 3
#define PINKY_CHANNEL 4
void setup() {
[Link](9600);
[Link]();
[Link](50); // Fréquence standard pour les servos SG90 = 50 Hz
[Link]("PCA9685 initialisé. En attente de commandes...");
}
void loop() {
if ([Link]() > 0) {
String command = [Link](';');
if ([Link]() > 0) {
int thumbAngle = getValue(command, 'T');
int indexAngle = getValue(command, 'I');
int middleAngle = getValue(command, 'M');
int ringAngle = getValue(command, 'R');
int pinkyAngle = getValue(command, 'P');
setServoAngle(THUMB_CHANNEL, thumbAngle);
setServoAngle(INDEX_CHANNEL, indexAngle);
setServoAngle(MIDDLE_CHANNEL, middleAngle);
setServoAngle(RING_CHANNEL, ringAngle);
setServoAngle(PINKY_CHANNEL, pinkyAngle);
}
}
}
// Convertit l'angle (0-180°) en signal PWM (pulse 500–2500 µs)
void setServoAngle(uint8_t channel, int angle) {
angle = constrain(angle, 0, 90);
int pulse = map(angle, 0, 180, SERVO_MIN, SERVO_MAX);
int pwmVal = pulse * 4096 / 20000; // Conversion µs vers valeur PCA9685 (20ms
période)
[Link](channel, 0, pwmVal);
}
// Récupère la valeur associée à une lettre (ex: 'T90' renvoie 90)
int getValue(String data, char id) {
int startIndex = [Link](id);
if (startIndex != -1) {
int endIndex = [Link](' ', startIndex);
String valueStr = (endIndex == -1) ?
[Link](startIndex + 1) :
[Link](startIndex + 1, endIndex);
return [Link]();
}
return 90; // Par défaut
}