PCA9685 + bouton

Bonjour,

j’essaye d’ activer un servo moteur brancher sur un PCA9685 16 channel Servo controller par l’appui sur un bouton.
Je ne comprend pas car l’appui du bouton es bien reconnu mais le servo moteur ne bouge pas et je ne vois pas mon erreur (bon je suis bien en dessous du niveau débutant).

Quelqu’un pourrait il m’éclairè ?

Merci

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

// Utilisation de l'adresse par défaut 0x40 du Breakout.
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver( 0x40 );

#define SERVOMIN  150 // La longueur d'impulsion 'minimale' (valeur du compteur, max 4096)
#define SERVOMAX  600 // La longueur d'impulsion 'maximale' (valeur du compteur, max 4096)

// Servos Commandés - Numéro de sorties sur le breakout
uint8_t servo1 = 1;

int boutonA = 2;// sortie 2 de l arduino///////////////////
int etatBoutonA =0;// etat du bouton///////////////////////

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
 

   pinMode (2,INPUT);/////////////////////////

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

void loop() {
etatBoutonA = digitalRead (boutonA);

   if(etatBoutonA==HIGH) {
 Serial.println("bouton A ok()");

  int pulseLen = map( 90, 0, 180, SERVOMIN, SERVOMAX );
  pwm.setPWM(servo1, 0, pulseLen);
    delay(3000);
  }

  else
{
   Serial.println("bouton A not()");

   int pulseLen = map( 45, 0, 180, SERVOMIN, SERVOMAX );
  pwm.setPWM(servo1, 0, pulseLen);
   delay(3000);
}

}

Tu branches ton module sur la sortie 1 de l'Arduino qui est aussi utilisée par la liaison série (Serial.println), il doit y avoir des conflits.
Change cette pin et réessaye. La pin choisie doit être compatible du PWM :

On most Arduino boards (those with the ATmega168 or ATmega328P), this function works on pins 3, 5, 6, 9, 10, and 11. On the Arduino Mega, it works on pins 2 - 13 and 44 - 46.

Tu peux aussi ajouter

#define ENABLE_DEBUG_OUTPUT

au début de ton code pour avoir des informations sur le fonctionnement du module sur la console.

Bonjour,

Je ne vois pas d'erreur dans ton code. Ca doit fonctionner.
Tu alimentes ton servo comment? par le connecteur à vis ? par l'alim de l'arduino via le connecteur pinheader?
Tu as bien un pullup sur ton bouton?

j’alimente l’arduino par usb et le module PCA9685 par une autre alimentation j’ai ausi mis un pullup sur le bouton.
j’ai réussi a le faire fonctionner .

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

// Utilisation de l'adresse par défaut 0x40 du Breakout.
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver( 0x40 );

#define SERVOMIN  150 // La longueur d'impulsion 'minimale' (valeur du compteur, max 4096)
#define SERVOMAX  600 // La longueur d'impulsion 'maximale' (valeur du compteur, max 4096)

// Servos Commandés - Numéro de sorties sur le breakout
uint8_t servo1 = 1;

int boutonA = 2;// sortie 2 de l arduino///////////////////
int etatBoutonA =0;// etat du bouton///////////////////////

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

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

   pinMode (2,INPUT);/////////////////////////

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

void loop() {
etatBoutonA = digitalRead (boutonA);

   if(etatBoutonA==HIGH) {
 Serial.println("bouton A ok()");

  int pulseLen = map( 165, 0, 180, SERVOMIN, SERVOMAX );
  pwm.setPWM(servo1, 0, pulseLen);
    
  }

  else
{
   Serial.println("bouton A not()");
int pulseLen = map( 15, 0, 180, SERVOMIN, SERVOMAX );
  pwm.setPWM(servo1, 0, pulseLen);
   

}
delay(500);
}

Merci

C'est un gros coup de bol que ça fonctionne. :slight_smile:

Quand tu fais "pwm.setPWMFreq(1);", ça provoque un débordement dans le calcul du prédiviseur du PCA9685 qui donne 6780 pour le prédiviseur, alors que la valeur doit être sur une octet.
La valeur du prédiviseur est alors fixée à la valeur de l'octet de poids faible soit 125 ce qui donne une fréquence d'environ 50Hz qui est la fréquence qui va bien.