Go Down

Topic: Servo moteur I2C PCA9685 (Read 4850 times) previous topic - next topic

vince3011

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)

Code: [Select]

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.

zoroastre

Yep!

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


http://www.adafruit.com/product/815

https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library

As-tu essayé celle-ci ?

@+

Zoroastre.
Gné! ;)

Artouste

...
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 ?

zoroastre

#3
Nov 30, 2014, 10:17 pm Last Edit: Nov 30, 2014, 10:18 pm by 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 ???

Code: [Select]
void setup() {
 
  pwm.begin();
  pwm.setPWMFreq(60);
 
  pwm1.begin();
  pwm1.setPWMFreq(60);
}


@+

Zoroastre.
Gné! ;)

Artouste

#4
Nov 30, 2014, 10:28 pm Last Edit: Nov 30, 2014, 10:29 pm by Artouste
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 ???

Code: [Select]
void setup() {
 
  pwm.begin();
  pwm.setPWMFreq(60);
 
  pwm1.begin();
  pwm1.setPWMFreq(60);
}


@+

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



Code: [Select]
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 );





zoroastre

#5
Nov 30, 2014, 10:39 pm Last Edit: Nov 30, 2014, 10:40 pm by 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 : https://learn.adafruit.com/16-channel-pwm-servo-driver/chaining-drivers

@+

Zoroastre.
Gné! ;)

Artouste

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 : https://learn.adafruit.com/16-channel-pwm-servo-driver/chaining-drivers

@+

Zoroastre.
et donc pour que je me couche moins bete ce soir :smiley-mr-green:
avec la correction d'erreurs le début du code devrait se presenter comment ?

zoroastre

#7
Nov 30, 2014, 10:58 pm Last Edit: Nov 30, 2014, 11:02 pm by zoroastre
Le début est bon en fait. Juste qu'il a oublié de déclarer la seconde puce dans le setup().

Code: [Select]
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() {
  .../...
  }


Gné! ;)

vince3011

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



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

Go Up