Servo moteur I2C PCA9685

Bonjour,

Je suis en cours de réaliser un hexapode avec 18 servomoteurs. J'ai acheté deux shields de type PCA9685 (Adafruit 16 channel).

J'ai connecté les deux PCA9685 en série. Un ayant pour adresse 0X40 (0-9 servo) et l'autre adresse 0X41(10-18 servo)

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver( 0x40 );
          uint8_t servo0 = 0;
          uint8_t servo1 = 1;

//PCA9685 number 2 adr=1

     Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver( 0x41 );
          //uint8_t servo = 10;


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

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

void loop() {
  //--- Controle du Premier Servo (no 1) ---
  Serial.println("Servo #1 à 45 degrés");

  // Transformation de degré (0 à 180) en pulse (SERVOMIN à SERVOMAX)
  int pulseLen = map( 45, 0, 180, SERVOMIN, SERVOMAX );
  pwm.setPWM(servo1, 0, pulseLen);
  
  delay(1000);

//--- Controle du Premier Servo (no 10) ---
  Serial.println("Servo #10 à 45 degrés");

  // Transformation de degré (0 à 180) en pulse (SERVOMIN à SERVOMAX)
  int pulseLen = map( 45, 0, 180, SERVOMIN, SERVOMAX );
  pwm.setPWM(servo10, 0, pulseLen);
  
  delay(1000);
  }

Les servomoteurs à l'adresse 0X41 ne fonctionnent pas.

Pouvez-vous m'aider.

Bonne soirée.

Yep!

La boutique Adafruit vend effectivement des PCA9685 en proposant une librairie sur Github :

As-tu essayé celle-ci ?

@+

Zoroastre.

vince3011:
...
J'ai connecté les deux PCA9685 en série. Un ayant pour adresse 0X40 (0-9 servo) et l'autre adresse 0X41(10-18 servo)
...

Bonsoir
Les compos I²C ne se connectent pas en série sur le bus mais en // , les adresses doivent préalablement etre affectées en hard .

schema/photos de ton dispositif ?

Re,

Ça vient de me sauter aux yeux !

Tu as oublié de déclarer ton 2ème PCA9685 dans ton setup. Tu mets bien le premier pwm et il est où le second ???

void setup() {
 
  pwm.begin();
  pwm.setPWMFreq(60);
 
  pwm1.begin();
  pwm1.setPWMFreq(60);
}

@+

Zoroastre.

zoroastre:
Re,

Ça vient de me sauter aux yeux !

Tu as oublié de déclarer ton 2ème PCA9685 dans ton setup. Tu mets bien le premier pwm et il est où le second ???

void setup() {

pwm.begin();
  pwm.setPWMFreq(60);

pwm1.begin();
  pwm1.setPWMFreq(60);
}




@+

Zoroastre.

bonsoir zoroastre
c'est pas déclaré "correctement" avant le setup ?

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver( 0x40 );
          uint8_t servo0 = 0;
          uint8_t servo1 = 1;

//PCA9685 number 2 adr=1

     Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver( 0x41 );

Oui. Les adresses des puces sont bien déclarées, mais le setup ne démarre que l'objet pwm. Le programme nie complètement l'existence de pwm1.

C'est confirmé sur le tutoriel : Chaining Drivers | Adafruit PCA9685 16-Channel Servo Driver | Adafruit Learning System

@+

Zoroastre.

zoroastre:
Oui. Les adresses des puces sont bien déclarées, mais le setup ne démarre que l'objet pwm. Le programme nie complètement l'existence de pwm1.

C'est confirmé sur le tutoriel : Chaining Drivers | Adafruit PCA9685 16-Channel Servo Driver | Adafruit Learning System

@+

Zoroastre.

et donc pour que je me couche moins bete ce soir :grin:
avec la correction d’erreurs le début du code devrait se presenter comment ?

Le début est bon en fait. Juste qu'il a oublié de déclarer la seconde puce dans le setup().

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver( 0x40 );
          uint8_t servo0 = 0;
          uint8_t servo1 = 1;

//PCA9685 number 2 adr=1

     Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver( 0x41 );
          //uint8_t servo = 10;


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

  pwm.begin();
  
  pwm.setPWMFreq(60);  // Les servo sont mis-à-jour à ~60 Hz

// LA PARTIE OUBLIEE
  pwm1.begin();
  pwm1.setPWMFreq(60);
// Etc

  Serial.println("Fin de setup()");
}

void loop() {
  .../...
  }

Je tiens à vous remercier pour votre aide et d'avoir corriger mes erreurs.

Bonnes fêtes de fin d'année.