Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Sujets - hinano70

Pages: [1]
1
Discussions ouvertes / Problème pour utiliser l'horloge externe du PCA9685
« le: novembre 07, 2020, 10:33:58 pm »
Bonjour
Je veux commander une quarantaine de cantons en PWM avec plusieurs PCA9685. Lorsqu'une loco change de canton, les 2 signaux de commande sont identiques pour éviter un court-circuit. Ca marche très bien si 2 cantons successifs sont reliés au même PCA9685. Mais si je les relie à 2 PCA9685 différents, il y a un court-circuit. J'ai mis du temps à trouver la raison : les signaux PWM doivent être déphasés entre PCA différents !
J'ai vu qu'on pouvait utiliser une horloge externe qui règlerait ce problème de désynchronisation et qu'on pouvait la "piloter" avec la fonction : setExtClk ()
http://adafruit.github.io/Adafruit-PWM-Servo-Driver-Library/html/class_adafruit___p_w_m_servo_driver.html
Mais à partir de là, je coince ! Mon circuit est commandé avec un Arduino Méga, où puis-je récupérer un signal d'horloge et qu'en faire avec le PCA9685 ?
Il y a bien une broche EO, mais je ne sais quoi en faire...
Merci pour votre aide ....
J'ai oublié de dire qu'il y a derrière les PCA des ponts en H L298N sur chaque alimentation de canton et que malheureusement je n'ai pas commandé tous les PCA9685 en même temps et chez le même fournisseur

2
Bonjour
Ceci est mon 1er message, j'espère ne pas me tromper de lieu pour ma demande !
Sur les bons conseils de Locoduino, j'ai réalisé une commande de passage à niveau (capteurs IR pour la détection, SG90 pour les barrières, LEDs pour les feux clignotants). Tout fonctionne correctement pour les leds en tout ou rien (0 et 255 dans analogWrite)
Je me suis inspiré de l'article "La PWM : Qu’est-ce que c’est ?" pour faire un clignotement progressif. Débutant, j'ai adapté le programme au mien. Seul, il fonctionne très bien :

byte cycle = 0;  // cycles de clignotement
long fading = 5;  //rapidité du clignotement
byte intensite = 0;  //intensité lumineuse
long LedTime = millis();   // timer pour le clignotement

void setup() {
pinMode(10, OUTPUT);  //sortie Led
}

void loop() {
clignote();
}

void clignote()
{
if ( millis() > LedTime + fading)     // vitesse de clignotement
   {
   LedTime = millis();   // reinit le timer
 

   switch (cycle) {
           case 0 :       // croit
              intensite += 10;
              if (intensite == 250) {cycle = 1; fading=200;}
              break;
           case 1 :      // allumé
              cycle = 2; fading=5;
              break;
           case 2 :      // décroit
              intensite -= 10;
              if (intensite == 0) {cycle = 3; fading=200;} break;
           case 3 :      // éteint
              cycle = 0;
              fading=5;
              break;
                }
analogWrite(10,intensite);
   }
}


Si j'intègre cet ensemble dans mon programme (ci-dessous), la Led ne s'éclaire pas. Elle ne le fait que si l'intensite est à 255 ! (254 ne fonctionne pas !!!)
Je tourne en rond, donc si qq'un peut m'aider. Merci. Je suis sur Nano.

#include <Servo.h>
/* define a header file. Special attention here, you can call the servo function directly from Arduino's software menu  bar Sketch>Importlibrary>Servo, or input
#include <Servo.h>. Make sure there is a space between #include and  <Servo.h>. Otherwise, it will cause compile error.*/
Servo servoPNA; // servo voie A
Servo servoPNB; // servo voie B
boolean detect1A,detect1B;
boolean  olddetect1A,olddetect1B;
boolean detect2A,detect2B=1;
boolean  olddetect2A,olddetect2B=1;
boolean  lastdetect2A,lastdetect2B=1;
boolean readingPNA,readingPNB;
long lastPNATime,lastPNBTime;   // derniere fois que le detecteur a change
long PNDelay = 500; // durée maxi des micro-coupures
int avertissement = 2000; // durée avant fermeture
byte cycle = 0;  // cycles de clignotement
long fading = 10;
byte intensite = 0;
long LedTime = millis();                   // timer pour le clignotement
long PNTime = millis();                    // timer pour les moteurs d'aiguillage
boolean  ferme=0,fermeA=0,fermeB=0;
byte angleA=140;

void setup()
{
servoPNA.attach(5);// servo A
servoPNB.attach(6);// servo A
//Serial.begin(9600);
pinMode(2,INPUT); //entrée A
pinMode(3,INPUT); //sortie A
pinMode(7,INPUT); //entrée B
pinMode(8,INPUT); //sortie B
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
servoPNA.write(140);
servoPNB.write(140);

analogWrite(10,0);// Led A
analogWrite(11,0);// Led B
}
void loop()
{

detect1A=digitalRead(2); //reading=0 si train
if ((olddetect1A==1 && detect1A==0) && fermeA==0) {fermeA=1; if (fermeB==0) {PNTime = millis()+avertissement; LedTime = millis();} }  // ferme voie A
olddetect1A=detect1A;

readingPNA = digitalRead(3); //reading=0 si train
if (readingPNA != lastdetect2A) {lastPNATime = millis();}  //déclenchement chrono
if ((millis() - lastPNATime) > PNDelay) {// si le delai est atteint, le changement est valide sinon le changement est ignore (parasite ou inter-wagon)
                                        if (readingPNA != detect2A) {detect2A = readingPNA;} // changement valide                                                       
                                        }

lastdetect2A=readingPNA;
if (olddetect2A==0 && detect2A==1) {fermeA=0; lastPNATime = millis();}  // ouvre voie A
olddetect2A=detect2A;


detect1B=digitalRead(7);
if ((olddetect1B==1 && detect1B==0) && fermeB==0) {fermeB=1; if (fermeA==0) {PNTime = millis()+avertissement; LedTime = millis();} }  // ferme voie B
olddetect1B=detect1B;

readingPNB = digitalRead(8); //reading=0 si train
if (readingPNB != lastdetect2B) {lastPNBTime = millis();}  //déclenchement chrono
if ((millis() - lastPNBTime) > PNDelay) {// si le delai est atteint, le changement est valide sinon le changement est ignore (parasite ou inter-wagon)
                                        if (readingPNB != detect2B) {detect2B = readingPNB;} // changement valide                                                       
                                        }

lastdetect2B=readingPNB;
if (olddetect2B==0 && detect2B==1) {fermeB=0; lastPNBTime = millis();}  // ouvre voie B
olddetect2B=detect2B;

ferme = (fermeA || fermeB);

if ((ferme==1) || (angleA<140)) { clignote();}
else {Serial.println("ouvert");analogWrite(10,0); analogWrite(11,0);cycle = 0; intensite=0; fading = 5;}


if ((ferme==1) && (angleA>50)) {fermePN();}

if ((ferme==0) && (angleA<140)) {ouvrePN();}

//Serial.println(angleA);
}


void clignote()
{

//Serial.println(intensite);
if ( millis() > LedTime + fading)     // vitesse de clignotement
   {
   LedTime = millis();   // reinit le timer
 

   switch (cycle) {
           case 0 :       // croit
              intensite += 10;
              if (intensite == 250) {cycle = 1; fading = 200;}
              break;
           case 1 :      // allume
              cycle = 2; fading=5;
              break;
           case 2 :      // decroit
              intensite -= 10;
              if (intensite == 0) {cycle = 3; fading = 200;} break;
           case 3 :      // eteint
              cycle = 0;
              fading = 5;
              break;
                }
   analogWrite(10,intensite);
   }
}

void ouvrePN()
{
             if ((millis() - PNTime) > 20) {PNTime = millis(); angleA+=1; servoPNA.write(angleA); servoPNB.write(angleA); }
}

void fermePN()
{
             if (millis() > (20+PNTime)) {PNTime = millis(); angleA-=1; servoPNA.write(angleA); servoPNB.write(angleA);  }
}

Pages: [1]