Bonjour, j'utilise un nano et une carte PCA9685 pour commander des aiguillages "en mode lent". Je commande 6 aiguillages via des inters sur les broches PD2 à PD7 et cela fonctionne comme je le veux.
Par contre j'ai besoin (pour une autre partie de mon réseau) de passer à 7 aiguillages et je n'y arrive pas... La carte PCA9685 est censée commander 16 servos, j'ai cherché un peu partout je dois être le seul original à vouloir commander mes aiguillages à l'ancienne... Je vous joins le code que j'ai adapté à mon utilisation (avec ma dernière tentative via PB0) qui c'est soldé par un nouvel échec...
Si c'est possible merci d'éclairer ma lanterne....
> // Version 2a 04/01/2022 7 servos
> #include <Wire.h> // librairie I2C
> #include <Adafruit_PWMServoDriver.h> // librairie interface 16 servo-moteurs
>
> //Objet servo PWM
> Adafruit_PWMServoDriver Pca = Adafruit_PWMServoDriver(0x40);
>
> word OUV_015 = 0;
> word FER_015 = 0;
>
> //Constantes
>
> #define nbPCAServo 7 //Nombre de valeur tableau
>
> //Parametres position min & max par servo
> int MIN_IMP [] ={500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500}; //Valeur minimum des servo 0°
> int MAX_IMP [] ={2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500};//Valeur maximum des servo 180°
> int Posi[]= {500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500}; //Objectif de position au depart à 0°
> boolean BP [] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //Image de l'entrée indexée
> boolean OUV[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //Ordre d'ouverture du servo indexé
> boolean FER[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //Ordre de fermeture du servo indexé
> int Pas[] = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}; //Pas d'incrementation (vitesse du mvt des servo)3, 5, 7, 9, 11, 1, 3, 6, 9, 11
> int i; //index du programme
>
>
> void setup()
> {
> //Serial.begin(9600);
> // Init PCA carte extension servo
> Pca.begin();
> Pca.setPWMFreq(50); // servos à ~50 Hz
> Pca.setPWM(7,0,0);//(adresse, val depart, val fin)
> // Init des entrées
> pinMode(PD2,INPUT_PULLUP); //Borne D2 du nano
> pinMode(PD3,INPUT_PULLUP); //Borne D3 du nano
> pinMode(PD4,INPUT_PULLUP); //Borne D4 du nano
> pinMode(PD5,INPUT_PULLUP); //Borne D5 du nano
> pinMode(PD6,INPUT_PULLUP); //Borne D6 du nano
> pinMode(PD7,INPUT_PULLUP); //Borne D7 du nano
> pinMode(PB0,INPUT_PULLUP); //Borne D9 du nano
>
> }//Fin de setup
>
> void loop()
> {
> BP[0] = digitalRead(PD2);
> BP[1] = digitalRead(PD3);
> BP[2] = digitalRead(PD4);
> BP[3] = digitalRead(PD5);
> BP[4] = digitalRead(PD6);
> BP[5] = digitalRead(PD7);
> BP[6] = digitalRead(PB0);
>
> //Gestion indéxée des servo
>
> for (int i=0; i<nbPCAServo; i++)
> {
> // Bit OUV ordre d'ouverture du servo
> if (BP[i] == HIGH && Posi[i] == MIN_IMP[i]){OUV[i] = HIGH;}
> if (Posi[i] >= MAX_IMP[i])
> {
> OUV[i] = LOW;
> Posi[i] = MAX_IMP[i];
> bitWrite(OUV_015,i,1);//signalisation ouvert sur servo
> }
> else
> { bitWrite(OUV_015,i,0);}
>
> // Bit FER ordre de fermeture du servo
> if (BP[i] == LOW && Posi[i] == MAX_IMP[i]){FER[i] = HIGH;}
> if (Posi[i] <= MIN_IMP[i])
> {
> FER[i] = LOW;
> Posi[i] = MIN_IMP[i];
> bitWrite(FER_015,i,1);//signalisation fermé sur servo
> }
> else
> {bitWrite(FER_015,i,0);}
>
> // MVT ouverture
> if (OUV[i] == HIGH && FER[i] ==LOW) {Posi[i] = Posi[i] + Pas[i] ;}
>
> // MVT fermeture
> if (FER[i] == HIGH && OUV[i] ==LOW) {Posi[i] = Posi[i] - Pas[i] ;}
>
>
> // Reglage de la position du servo indéxé
>
> Pca.writeMicroseconds(i,Posi[i]);}
>
> //Serial.print(OUV_015,BIN);
> //Serial.print(" ");
> //Serial.println(FER_015,BIN);
> } //Fin de LOOP