Premier pas en programmation, et incomprehension.

Bonjour a vous :slight_smile:

Je souhaiterais débuter un projet en robotique, un quadrupède pour être précis.
Après avoir rechercher sur le Net divers éléments, tel que le mouvement a appliquer sur chaque pattes, la dimension des diverses pièces (servomoteur, contrôleur…etc) pour réalisation du "corp" par impression 3D
j'ai donc pris la décision d'acheter ce qui me sembler être le mieux a mon niveau.

x1 Arduino Mega
X1 PCA9685
X10 Servomoteurs

Après raccordement du PCA9685 a l'Arduino, en respectant bien le branchements,

  • 5V Arduino => VCC du PCA9685
  • GND // => GND //
  • A4 (analog-in) => SDA //
  • A5 (analog-in) => SCL //

Ensuite le raccordements de deux servomoteurs sur les Pins (1 et 9) du PCA9685.

Voila pour la partie câblage…
passons a la programmation, j'ai trouvé plusieurs scripts identiques.
j'en ai donc déduis, que le problème que je vais vous exposé ne vient pas de la (A voir)

 //bibliothèque necessaire
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

 //Servomoteurs utilisés
uint8_t servo1 = 1;
uint8_t servo9 = 9;

#define SERVOMIN  150
#define ANGLEMIN  1
#define SERVOMAX  600
#define ANGLEMAX  179

void setup() {
  Serial.begin(9600);
  Serial.println("Controle des Servo Moteur #1 et #9!");

  pwm.begin();
  
  pwm.setPWMFreq(60);  // Les servo sont mis-à-jour à ~60 Hz
  Serial.println("Fin de setup()");
}

void loop() {
  //--- Controle du Servo ( 1 )
  Serial.println("Servo #1 à 45 degrés");
  int pulseLen = map( 45, 0, 180, SERVOMIN, SERVOMAX );
  pwm.setPWM(servo1, 0, pulseLen);

  delay(1000);

  //--- Controle du Servo ( 9 )
  Serial.println("Servo #9 à 30 degrés");
  pulseLen = map( 30, 0, 180, SERVOMIN, SERVOMAX );
  pwm.setPWM(servo9, 0, pulseLen);
  
  delay(1000);

    //--- Controle du Servo ( 1 )
  Serial.println("Servo #1 à 120 degrés");
  // Transformation de degré (0 à 180) en pulse (SERVOMIN à SERVOMAX)
pulseLen = map( 120, 0, 180, SERVOMIN, SERVOMAX );
  pwm.setPWM(servo1, 0, pulseLen);
  
  delay(1000);

  //--- Controle du Servo ( 9 ) ---
  Serial.println("Servo #9 à 150 degrés");
  pulseLen = map( 150, 0, 180, SERVOMIN, SERVOMAX );
  pwm.setPWM(servo9, 0, pulseLen);
  
  delay(1000);
  
  //--- Les deux servo à 0
  Serial.println("Servo #1 et #9 à 150 degrés");
  pulseLen = map( 0, 0, 180, SERVOMIN, SERVOMAX );
  pwm.setPWM(servo1, 0, pulseLen);
  pwm.setPWM(servo9, 0, pulseLen);
}

Le code est vérifié, puis téléversé, tous ce passe bien, les leds de l'arduino clignotte (apriori signe de bon fonctionnement) Néanmoins rien ne ce passe...

Pensant que cela venait de l'alimentation, j'ai donc décidé d'alimenter le PCA9685 (pensant que les servos ne recevais pas assez de puissance) en ajoutant un UBEC 5A, voulant en faire un quadrupède autonome, j'ai branché ce UBEC a un porte batterie.

le UBEC a une entrée de 7.4V - 50V
Et en sort du 5.5V - 5A
Mes batteries donnent du 11.1V - 9A

Et toujours rien, aucun signe de fonctionnement quel qu'il soit de mes servos >:(

Outre la solution, j'aimerais comprendre mon erreur, pour divers projets futur.

désolé du pavé, j'ai essayé de détaillé au mieux mon projet, si vous avez des avis ou demande je suis a votre écoutes :slight_smile:

Est ce qu'un code très simplifié permet de faire bouger un seul servo ?

j'ai essayer le même code en ne laissant que le Servo1, mais rien n'y change, aucun mouvement détecté..

Commence par tester les exemples de la bibliothèque Adafruit_PWMServoDriver

Oui ce que je viens de faire, mais encore la aucun mouvement. Est-ce que (au cas ou l'alimentation de mon PCA9685 n'est pas viable) l'Arduino mega seul peut il faire fonctionner un seul Servomoteur? Car je réalise les essais avec et sans, pour essayer de solutionner ceci.

Bonjour,

Sur l'arduino mega, SDA et SCL ne sont pas sur A4 A5.
Utilises les pins SDA et SCL (près du connecteur USB)
Tu peux aussi utiliser les pins 20 et 21

Merci Kamill, effectivement tu avais raison.

J'ai relancé les tests en utilisant la bibliothèque Adafruit_PWMServoDriver avec un seul Servo pour ne pas saturer l'alimentation de l'Arduino, mais je n'ai pas de mouvement hélas.

j'ai testé mes servos directement sur l'Arduino pour être sur qu'ils fonctionnaient, et ils fonctionnent bien.

Problème toujours présent, je continue d'investiguer :slight_smile:

Excusé moi du double post, en alimentant le PCA9685 avec le 5V de l'Arduino, sur le VCC et le GND (sur le coté) et le "domino" en même temps avec ma Breadboard, les servomoteurs fonctionnent.

j'en déduit donc que je n'avais pas la bonne alimentation (Batterie) sur mon PCA9685, ainsi que du problème de bornage dit plus haut.

il me reste donc a solutionner ce problème d'alim pour donner libre court a mon projet :slight_smile:

Est ce que les masses sont bien reliées ente elles ?

Sur les cartes PCA9685 que je connais il y a deux alimentations: VCC et V+

  • VCC est l'alimentation du PCA9685 et doit être reliée au 5V de l'arduino (ou au 3.3V pour les cartes fonctionnant sous 3.3V)
  • V+ est reliée à la barre d’alimentation V+ et sert à l'alimentation des servomoteurs. Elle peut être reliée à une alimentation externe si le courant demandé est important, mais peut être reliée aussi à la sortie 5V de l'arduino si le courant demandé est faible (en général ça fonctionne avec un seul servo).

V+ peut être fourni soit par le bornier soit par le pinheader.

Bonsoir,

Oui j'ai remarqué que même en alimentant le V+ du PCA9685 indépendamment avec une batterie, rien ne ce passer. Et effectivement, en reliant alors la masse du PCA coté V+ a l'Arduino, alors mon servomoteur ce mettait a fonctionner.

Chose étonnante, car pour moi la masse coté VCC suffisait. mais en réalisant des tests avec une batterie 5V - 5A que j'ai branché sur le V+ du PCA, j'ai relier alors la masse en tirant un second câble sur l'Arduino, et tout a fonctionné :wink:

Merci pour votre aide, maintenant que ceci est résolu, je peut continuer d'avancer dans le programme, et je vous ferais alors part de mes avancés dans ce projet, fichier Stl, conception etc :slight_smile: