PCA9685 et Arduino Nano, controle de servos simultanés

Bonjour à tous,

Je travaille actuellement sur un projet qui nécessite de contrôler plusieurs servomoteurs à l'aide d'un PCA9685 et d'un Arduino. l'idée étant de programmer un petit robot. J'ai déjà essayé quelques exemples de code disponibles en ligne, mais je rencontre des difficultés pour obtenir le comportement souhaité.

Voici un résumé de mon problème :

  • J'utilise un PCA9685 pour étendre le nombre de sorties PWM de mon Arduino.
  • Mon objectif est de contrôler plusieurs servomoteurs de manière synchrone, en leur faisant effectuer des mouvements spécifiques (mais différents) à des moments précis.
  • J'ai essayé plusieurs exemples de code, mais je n'arrive pas à obtenir le comportement désiré. Soit les servomoteurs ne bougent pas du tout, soit ils ne bougent pas comme prévu.

Voici le matériel que j'utilise :

  • Arduino Nano
  • PCA9685 (16-channel PWM & Servo driver)
  • Plusieurs servomoteurs

Si quelqu'un a déjà travaillé sur un projet similaire ou a des connaissances sur la programmation du PCA9685 avec Arduino, je serais reconnaissant de toute aide ou conseils que vous pourriez me fournir.

Merci d'avance pour votre assistance !

![IMG_7105 - copie|666x500](upload://b8xQw


EkmYj6qZ0LTSX3B1f4XL9g.jpeg)

Re bonjour !
Je vous joins mon montage afin de vérifier s'il n'y a pas de soucis de ce coté là. J'ai regardé pas mal de tutoriel et a chaque fois c'est le même montage.
Au passage j'utilise un Arduino Nano.

Le problème que je rencontre maintenant c'est que les servos ne font pas ce qui est demandé par le programme. Pire meme, après plusieurs essais (sans changer le programme), des fois il ne fait pas la meme chose d'un essai à l'autre... Vraiment incompréhensible !
Et comme je débute dans ce domaine, ca n'aide pas !

J'ai essayé de remplace le PCA et le nano, au cas ou j'aurais grillé un composant, mais cela ne résout pas le problème.

Merci d'avance pour vos retours.


Voici la photo (assez dure à lire...) de mon montage.

Bonsoir buzzy38

Combien, il n'est pas nécessaire, avec une bibliothèque, en général, que le port soit PWM, donc toutes les pin de l'Arduino peuvent être utilisées.
Ainsi, en utilisant une bibliothèque comme VarSpeedServo (8 servo max), tu as 2 gros avantages ,
le réglage de la vitesse:

write(value, speed) - speed varies the speed

et, surtout l'attente ou pas de la fin de la rotation:

write(value, speed, wait) - wait is a boolean that, if true, causes the function call to block until move is complete

avec wait à false, on peut démarrer tout ses servo "en même temps".
Cette bibliothèque a encore d'autres sympa.

Si non, mets ton code en ligne.

A+
Cordialement
jpbbricole

Bonjour Jpbbricole,

Merci pour ta réponse. Je vais essayer avec la bibliothèque que tu suggères. Car effectivement pour l'instant je n'ai besoin que de contrôler 6 servo en simultané, mais dans le futur j'ai pour projet de construire un petit "robot" avec une vingtaine de servo. donc il faudra que je trouve une solution quoiqu'il arrive :wink:

pour info voici le code que j'avais (un peu brouillon je m'en excuse) :

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

#define SERVOMIN  150
#define SERVOMAX  600
#define USMIN  600
#define USMAX  2400
#define SERVO_FREQ 50
#define BUTTON_PIN 2

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

uint16_t angleToPulse(int angle) {
  return map(angle, -90, 90, SERVOMIN, SERVOMAX);
}

void setup() {
  Serial.begin(9600);
  Serial.println("Servo test!");

  pwm.begin();
  pwm.setOscillatorFrequency(27000000);
  pwm.setPWMFreq(SERVO_FREQ);

  pinMode(BUTTON_PIN, INPUT_PULLUP); // Configurer la broche du bouton en entrée avec résistance de pull-up

  // Initialiser les servos à leur position zéro
  pwm.setPWM(0, 0, angleToPulse(0)); // Initialiser le servo à la position neutre
  pwm.setPWM(1, 0, angleToPulse(0));
  pwm.setPWM(2, 0, angleToPulse(0)); // Initialiser le servo à la position neutre
  pwm.setPWM(3, 0, angleToPulse(0));
  pwm.setPWM(4, 0, angleToPulse(0)); // Initialiser le servo à la position neutre
  pwm.setPWM(5, 0, angleToPulse(0));
}

void loop() {
  // Attendre que le bouton soit enfoncé pour démarrer la séquence
  while (digitalRead(BUTTON_PIN) == HIGH) {
    delay(100); // Attendre 100 ms avant de vérifier à nouveau
  }

  // Servo numéro un
  pwm.setPWM(0, 0, angleToPulse(45)); // Position à 45 degrés
  delay(3000); // Tenir la position pendant trois secondes
  pwm.setPWM(0, 0, angleToPulse(0)); // Revenir à la position zéro
  delay(500); // Attendre 500 ms
  pwm.setPWM(0, 0, angleToPulse(-45)); // Tourner à -45 degrés
  delay(2000); // Tenir la position pendant deux secondes
  pwm.setPWM(0, 0, angleToPulse(45)); // Revenir à 45 degrés
  delay(2000); // Tenir la position pendant deux secondes
  pwm.setPWM(0, 0, angleToPulse(0)); // Revenir à la position zéro
  delay(2000); // Tenir la position pendant deux secondes
  pwm.setPWM(0, 0, angleToPulse(45)); // Revenir à 45 degrés
  delay(2000); // Tenir la position pendant deux secondes
  pwm.setPWM(0, 0, angleToPulse(0)); // Revenir à la position zéro
  delay(3000); // Tenir la position pendant deux secondes

  // Servos 2 et 3
  pwm.setPWM(1, 0, angleToPulse(90)); // Servo 2 à 90 degrés
  pwm.setPWM(2, 0, angleToPulse(90)); // Servo 3 à 90 degrés
  delay(4000); // Tenir la position pendant quatre secondes
  pwm.setPWM(1, 0, angleToPulse(0)); // Revenir à la position zéro pour le servo 2
  pwm.setPWM(2, 0, angleToPulse(0)); // Revenir à la position zéro pour le servo 3
  delay(2000); // Attendre deux secondes avant de recommencer

  // après noir Servo numéro un
  pwm.setPWM(0, 0, angleToPulse(45)); // Position à 45 degrés
  delay(6000); // Tenir la position pendant trois secondes

  pwm.setPWM(0, 0, angleToPulse(-45)); // Tourner à -45 degrés
  delay(2000); // Tenir la position pendant deux secondes

  pwm.setPWM(2, 0, angleToPulse(90));
  delay(20);
  pwm.setPWM(4, 0, angleToPulse(90));
  pwm.setPWM(5, 0, angleToPulse(90));
  delay(20);
  pwm.setPWM(4, 0, angleToPulse(0));
  delay(1500);
  pwm.setPWM(5, 0, angleToPulse(45));
  pwm.setPWM(0, 0, angleToPulse(0)); // Position à 45 degrés
  delay(1000);
  pwm.setPWM(1, 0, angleToPulse(90));
  delay(1000);

  pwm.setPWM(0, 0, angleToPulse(45)); //tourne tete vers moi
  delay(1000);
  pwm.setPWM(1, 0, angleToPulse(0)); //Baisse les bras
  pwm.setPWM(2, 0, angleToPulse(0));
  pwm.setPWM(0, 0, angleToPulse(0)); //tete droite
  delay(1500);

  pwm.setPWM(3, 0, angleToPulse(80)); //salut
  delay(1000);
  pwm.setPWM(3, 0, angleToPulse(0)); // remonte salut
  delay(1000);

  pwm.setPWM(0, 0, angleToPulse(45)); // tourne tete vers moi
  delay(1000);
  pwm.setPWM(2, 0, angleToPulse(90)); //leve bras pour me pointer et tourne tete
  pwm.setPWM(0, 0, angleToPulse(0));
  delay(1000);

  pwm.setPWM(0, 0, angleToPulse(45)); // tourne tete vers moi
  delay(2000);
  pwm.setPWM(0, 0, angleToPulse(-45)); //tourne tete opposé moi
  delay(2000);
  pwm.setPWM(2, 0, angleToPulse(0));
  pwm.setPWM(1, 0, angleToPulse(90));
  delay(500);

  pwm.setPWM(4, 0, angleToPulse(45)); //fait coucou de la main
  pwm.setPWM(4, 0, angleToPulse(-45));
  pwm.setPWM(4, 0, angleToPulse(45));
  pwm.setPWM(4, 0, angleToPulse(-45));
  pwm.setPWM(4, 0, angleToPulse(45));
  pwm.setPWM(4, 0, angleToPulse(-45));
  pwm.setPWM(4, 0, angleToPulse(0));
  delay(100);

  pwm.setPWM(0, 0, angleToPulse(45)); //me regarde
  delay(3000);

  pwm.setPWM(0, 0, angleToPulse(-45));
  delay(1000);

  pwm.setPWM(0, 0, angleToPulse(0));
  delay(1000);

  pwm.setPWM(4, 0, angleToPulse(45)); //fait coucou de la main
  pwm.setPWM(4, 0, angleToPulse(-45));
  pwm.setPWM(4, 0, angleToPulse(45));
  pwm.setPWM(4, 0, angleToPulse(-45));

  pwm.setPWM(0, 0, angleToPulse(45)); //tourne tete

  pwm.setPWM(4, 0, angleToPulse(45));
  pwm.setPWM(4, 0, angleToPulse(-45));
  pwm.setPWM(4, 0, angleToPulse(45));
  pwm.setPWM(4, 0, angleToPulse(-45));

  pwm.setPWM(0, 0, angleToPulse(-45)); //tourne tete

  pwm.setPWM(4, 0, angleToPulse(45));
  pwm.setPWM(4, 0, angleToPulse(-45));
  pwm.setPWM(4, 0, angleToPulse(45));
  pwm.setPWM(4, 0, angleToPulse(-45));

  pwm.setPWM(0, 0, angleToPulse(0)); //tourne tete

  pwm.setPWM(4, 0, angleToPulse(45)); //fait coucou de la main
  pwm.setPWM(4, 0, angleToPulse(-45));
  pwm.setPWM(4, 0, angleToPulse(0));

  delay(2000);
  pwm.setPWM(1, 0, angleToPulse(0));

  delay(5000000000);
}

Cordialement,

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.