Bonjour à tous, je viens vers vous car je suis un peu perdu dans mon projet ![]()
Je travaille sur un projet de robotique (un r2d2 taille réelle) qui utilise plusieurs cartes UNO communiquant entre elles via un système i2c (jusqu'ici tout va bien). Sur la dernière carte (esclave) de la chaine je souhaite utiliser un module PCA9685, en suivant quelques tutos et docs j'arrive à faire fonctionner le module seul.
(mon code de base pour faire réagir le PCA)
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver();
void setup() {
Serial.begin(9600);
pwm1.begin();
pwm1.setPWMFreq(60);
// Déplacement initial des servos
pwm1.setPWM(0, 0, 150); // Servo 0 position basse
pwm1.setPWM(1, 0, 150); // Servo 1 position basse
}
void loop() {
// Exemple simple pour tester
pwm1.setPWM(0, 0, 300); // Servo 0 position haute
delay(1000);
pwm1.setPWM(0, 0, 150); // Servo 0 position basse
delay(1000);
}
Vient maintenant mon problème, en voulant additionner ce code ainsi que le système i2c, je n'ai plus rien qui fonctionne, lors de la réception d'une commande, tout le système freeze. J'ai beau vérifier mes branchements, tout est à sa place. J'ai également remarqué qu'une fois la carte connectée aux autres via les ports SCL et SDA, même l'ancien code ne répond plus non plus , pourtant mon module PCA est connecté aux bornes A4 et A5.
(mon code de base pour le PCA + le code i2c)
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
#include <SoftwareSerial.h>
//nommage "pwm1"et adressage de la carte "0x40"
Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x40);
void setup()
{
Wire.begin(4); // join i2c bus with address #4
Wire.onReceive(receiveEvent); // register event
pwm1.begin();
pwm1.setPWMFreq(60); // Analog servos run at ~60 Hz updates
//initialisation de la positions de départ des servos
pwm1.setPWM(0,0,20); //setPWM(numeros du servos, 0, impulstion à donner au servos)
pwm1.setPWM(1,0,20); //je ne sais pas encore à quoi correspont le "0" central
Serial.begin(9600); // start serial for output
}
void loop()
{
//delay(100);
}
void topOuvrir(){
pwm1.setPWM(0,0,90);
}
void topFermer(){
pwm1.setPWM(0,0,20);
}
void bottomOuvrir(){
pwm1.setPWM(1,0,90);
}
void bottomFermer(){
pwm1.setPWM(1,0,20);
}
// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany)
{
String commande = "";
while(Wire.available()) // loop through all but the last
{
char c = Wire.read(); // receive byte as a character
commande += c;
}
Serial.println(commande);
if (commande == "01"){
topOuvrir();
}
if (commande == "02"){
topFermer();
}
if (commande == "03"){
bottomOuvrir();
}
if (commande == "04"){
bottomFermer();
}
}
Il y a quelque chose que je dois surement avoir raté ou mal compris mais malgré mes recherches je ne trouve actuellement pas la réponse, j'ai essayé d'attribué l'adresse 0x40 au PCA, cela ne change rien. Je suis sur de bien recevoir les commandes de ma carte maitre, les 3 autres esclaves reçoivent bien aussi les commandes (et le print s'affiche bien avant de crash).
Merci d'avance à ceux qui prendront le temps de me répondre,
bonne soirée,
Yann

