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.


Messages - hinano70

Pages: [1] 2
1
Merci, je teste ce week-end (il faut que je réadresse les sections ....)
Je viens de tester une version plus simple à modifier, pour voir (je ne suis pas un pro en électronique) :
sortie16 L298 > diode > section 16
sortie17 L298 > diode > section 17
J'ai rajouté 2 diodes donc.
Cette fois au lieu d'un ralentissement, il y a une très légère accélération au changement de section, mais plus de broutement.
Au risque de faire hurler Simontpellier, j'alimente encore les L298 qu'avec 2 fils sur In1 et In2 !

En fait j'utilise des PCA pour tout, j'en ai déjà installé 6 et je vais en rajouter au moins 2 pour les feux sur lesquels je travaille actuellement!
- commande des moteurs d'aiguillage SG90
- alimentation des sections
- commande des feux de signalisation (ce qui permet de moduler l'éclairement)
ça marche nickel sauf lorsqu'il y a changement de PCA sur 2 sections contigües, mais ça progresse !!!

2
j'ai réfléchi ... ! ... ?

il y a sans doute une solution beaucoup plus simple, tout dépend de la capacité de vos systèmes à la mettre en oeuvre, mais on est quand-même sur le forum locoduino, ça doit être possible !
l'idée, c'est de s'attaquer à la racine du problème, cad. à la transition entre deux pca9685, qui sont on l'a vu, forcément désynchronisés
on va prendre par exemple, pour fixer les idées, 31 sections, donc 2 pca :
- le 1er pca commande les sections 1 à 16, le 2ème pca commande les sections 16 à31
- donc la section 16 peut être, au choix, commandée par le 1er ou par le 2ème pca
- quand le train passe de la section 15 à la section 16, la section 16 est commandée par le 1er pca (pas par le 2ème) : la transition entre la section 15 et la section 16 se fait nickel
- quand le train passe de la section 16 à la section 17, la section 16 est commandée par le 2ème pca (plus par le 1er) : la transition entre la section 16 et la section 17 se fait chrome
- le choix duquel des 2 pca pour la section 16 se fait par un simple "ou câblé", avec 2 diodes et une résistance de pull down de 470R ; la sortie correspondante du pca qui ne commande pas la section 16 est simplement mise à 0%

que vous en pense-t-il ?

La voila ma solution !: commencer par alimenter une section par 1 PCA et finir de l'alimenter par un autre. Merci trimarco232.
Ca peut être fait logiciellement. Mais le montage avec 2 diodes ... m'intéresse et je n'ai pas bien compris. Peux tu me faire un petit schéma, merci.

3
J'ai déconnecté 2 cantons pour les connecter comme indique Simontpellier pour tester. Pas de tension ! Est-ce parce que tous les autres cantons sont encore commandés par les In1 et In2 ? Si il faut que je déconnecte tout pour essayer, ça va être galère ! Et je ne pense pas que ça règle le problème de désynchronisation des horloges. J'avais regardé à l'oscillo les signaux envoyés aux rails, ils étaient très propres en commandant sur IN1 et In2..

4
Oui, tous les 0V sont reliés ensemble.
La solution que j'ai trouvée pour les ponts en H me paraissait plus intéressante car elle me fait gagner un fil (2 au lieu de 3 pour les cantons à double sens), mais je vais tester...

5
Voici un programme de principe qui devrait fonctionner, je ne l'ai pas testé, et un schéma (j'espère ne rien avoir oublié) du circuit. J'utilise un Méga2560.
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver( 0x40 );// cantons alim 12V
Adafruit_PWMServoDriver pwm2 = Adafruit_PWMServoDriver( 0x41 );// cantons alim 12V

byte vitesse = 80;
byte pin0Driver1 = 0;  // pin0 du pwm1 : PCA9685 N°1
byte pin0Driver2 = 0;  // pin0 du pwm2 : PCA9685 N°2

void setup() {
pwm1.begin();
pwm1.setPWMFreq(60);
pwm2.begin();
pwm2.setPWMFreq(60);

pwm1.setPWM(pin0Driver1, 0, 20*vitesse);
pwm2.setPWM(pin0Driver2, 0, 20*vitesse);

//on peut aussi utiliser 2 pins de chaque PCA9685 pour pouvoir inverser le sens de circulation
}

void loop() {
}

Si on utilise le même PCA9685 pour alimenter les 2 cantons, pas de problème, si on en utilise 2, c'est là que le passage d'un canton à l'autre ne se fait pas correctement.
A essayer : différentes vitesse (0 à 200) et des fréquences différentes.

6
Chez moi, c'est plutôt un ralentissement, peut être est-ce parce que la jonction est dans une zone de ralentissement où le temps d'alimentation est d'environ 1/3. Je vais tester un rapport 1/2.
Mes cantons sont toujours alimentés ainsi :pwm3.setPWM(pin1, 0, 20*vitesse); la vitesse variant de 1 à 200. A l'arrêt la vitesse est 1, l'alimentation est insuffisante pour faire avancer le train, mais suffisante pour charger un condensateur au travers d'une diode et qui se décharge dans les LEDS des lumières (loco + wagons).
Le gros avantage des PCA9685, c'est qu'on peut en mettre autant qu'on veut en parallèle. Je les utilise aussi pour alimenter les servomoteurs qui commandent les aiguillages, pour alimenter les feux de signalisation : il est très facile de faire varier la luminosité des LEDS en faisant varier le duty-cycle.

Je viens de tester un rapport de 1/2 du PWM, c'est beaucoup mieux. Cela me donne une possibilité supplémentaire pour juxtaposer les cantons alimentés par des PCA9685 différents. La discussion fait progresser les choses ! Merci aux contributeurs.

7
Je viens d'essayer avec des fréquences de 60 et 73 (60 et 80 donnent de moins bon résultats)
pwm5.begin();
pwm5.setPWMFreq(60);
pwm6.begin();
pwm6.setPWMFreq(73);
Il y a un ralentissement mais plus de broutement. C'est plus tolérable ! Il faut que je répartisse mes alimentations de sections dans les parties visibles pour limiter les changements de PCA9685, avec 36 sections, ça ne va être simple !

8
Le "broutage" a lieu uniquement au changement de canton, lorsque l'alimentation du train se fait par l'intermédiaire de 2 sections alimentées par 2 PCA9685 différents. Aucun problème lorsque le train est à cheval sur 2 sections alimentées par le même PCA9685. J'ai 2 endroits où j'ai le problème, la cause est la même. Je vais essayé de changer la fréquence d'un des PCA9685 pour qu'il n'y ai plus de battements avec 2 fréquences trop proches.

9
Merci pour les réponses.
Le problème n'est pas un problème de décalage, mais un problème de fréquences très légèrement différentes. J'imagine qu'il doit y avoir une sorte de battement lorsque les 2 signaux de fréquences différentes se superposent ce qui fait "brouter" les trains (arrêt-avance-arrêt-...).
trimarco232 m'a donné l'idée de faire un RAZ au moment du changement de canton, mais les battements ont une période inférieure à la durée du passage de l'un à l'autre donc j'ai peur de ne pas régler le problème. Ce qui risque de se passer avec 3 Arduino ayant chacun leur propre horloge.
Pour répondre à simontpellier,le codage des PWM doit bien être de 0 à 4095, vitesse étant un byte et je limite la vitesse à 200 :
if ((millis() - lastTime) > VitesseDelay)
                                                           {
                                                           if (vitesse < consigne) {vitesse += 1;} // phase d'accélération marche avant.
                                                           else if (vitesse > consigne) {vitesse -= 2;} // phase de décélération marche avant.
                                                           if (pin1<16) pwm3.setPWM(pin1, 0, 20*vitesse);    //pin1=pwm
                                                           else if (pin1<32) pwm4.setPWM(pin1-16, 0, 20*vitesse);
                                                                else if (pin1<48) pwm5.setPWM(pin1-32, 0, 20*vitesse);
                                                                     else  pwm6.setPWM(pin1-48, 0, 20*vitesse);
                                                           lastTime = millis();

10
En fait décaler un signal par rapport à un autre est ridicule !
J'ai utilisé un oscillo pour visualiser les signaux PWM. Ils glissent l'un par rapport à l'autre (les horloges étant légèrement décalées) ce qui ne génère pas de court-circuit au passage du train en juxtaposant les signaux dans 2 cantons consécutifs. Je ne me l'explique pas ! Par contre les trains broutent (signaux en phase, décalés, en phase ....). J'ai eu des problèmes de court-circuit en alimentant les 2 cantons consécutifs avec 2 disjoncteurs différents (faits avec des MAX471 + relais...)
Il me reste donc à m'arranger pour mettre les jonctions entre cantons alimentés par des PCA9685 différents dans les parties cachées, mais avec 35 cantons, ça va être dur !
Il y a peut être des modules équivalents au PCA9685 ?

11
Le problème est que les PCA9685 possèdent leur propre horloge et que celles-ci ne sont pas synchro.
Je viens de parcourir le datasheet https://www.nxp.com/docs/en/data-sheet/PCA9685.pdf (c'est assez obscur pour moi), mais on voit bien qu'il y a possibilité de mettre une horloge externe, mais j'ai beau retourner dans tout les sens le shield, il n'y a pas de pin supplémentaire. Aïe ! Mauvais signe :
external clock input[2]   --->   [2]This pin must be grounded when this feature is not use
Dommage ! Plus loin on trouve
To use the EXTCLK pin, this bit must be set by the following sequence:1.  Set the SLEEP bit in MODE1. This turns off the internal oscillator.2.  Write logic 1s to both the SLEEP and EXTCLK bits in MODE1. The switch is now made. The external clock can be active during the switch because the SLEEP bit is set.This bit is a ‘sticky bit’, that is, it cannot be cleared by writing a logic 0 to it. The EXTCLK bit can only be cleared by a power cycle or software reset.EXTCLK range is DC to 50 MHz
Je ne comprends pas tout, mais il semble que la solution était là. Encore fallait-il que je sois capable d'accéder aux registres !!!
Il me reste une solution : si les décalages de phase sont faibles (j'en doute vu ce qui se passe entre 2 : l'alim disjoncte, avec 2 autres les trains broutent aux changement de canton) je peux décaler les signaux PWM:  pwm3.setPWM(N°, 0, vitesse) ---> pwm3.setPWM(N°, 0+x, vitesse+x)

Toutes les remarques pouvant m'aider sont les bienvenues !

12
Merci
Cela m'a permis de trouver ça :
https://www.locoduino.org/spip.php?article203
"Dans un prochain article nous attaquerons le problème de la synchronisation des PWM entre les cantons qui pourront donc être commandés par des Arduino séparés."
C'est tout à fait ce qu'il me faut, mais je n'ai pas trouvé l'article.
Je suis tombé la dessus: http://forum.locoduino.org/index.php?topic=36.0. Je n'ai pas tout compris, il y a une bibliothèque à télécharger https://dl.dropboxusercontent.com/u/67740546/SyncPWM.zip mais le lien ne fonctionne plus !
Chez moi, ça devrait être plus simple puisque je n'ai qu'un seul Méga qui commande tout (pour l'instant)

13
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

14
Merci Thierry, je n'ai pas trop l'habitude de travailler ainsi (flemme d'écrire du code), les commentaires sont tout à fait justes, au bout de quelques temps on ne sait plus trop ce qu'on voulait faire. J'ai bien sûr pris le code et je vais tâcher de suivre les conseils.
Super chris_bzg, ça fonctionne parfaitement (avec le code de Thierry), je n'aurais jamais trouvé ça ! On doit pouvoir mettre les 4 leds de 2mm + R=470ohm en parallèle sur la sortie 11. Sinon il faut que je réaffecte mes sorties, dommage, j'avais fait un "shield" pour monter le nano et brancher aisément les capteurs, moteurs ...
Encore merci à tous.

15
Je progresse:
Lorsque je neutralise les servomoteurs (il faut que je neutralise les 2):
//Servo servoPNA; // servo voie A
//Servo servoPNB; // servo voie B , etc.....
et bien ça marche ??!!
Par contre si je les enlève physiquement en laissant le code, ça ne marche pas.

8 lignes où ça intervient:
Servo servoPNA; // servo voie A
Servo servoPNB; // servo voie B
....
servoPNA.attach(5);// servo A
servoPNB.attach(6);// servo B
servoPNA.write(140); // barrière A ouverte
servoPNB.write(140); // barrière B ouverte
....
servoPNA.write(angle);  //pour ouvrir ou fermer lentement
servoPNB.write(angle);

Je suis un peu dépassé, donc si qq'un a une idée, merci....
Un passage à niveau sans barrière, c'est quand même embêtant !

Pages: [1] 2