Messages récents

Pages: [1] 2 3 ... 10
1
Vos projets / Re : LaBox" : Une Centrale DCC polyvalente et abordable
« Dernier message par trimarco232 le Aujourd'hui à 05:42:10 pm »
Bonjour ,
j'ai des questions (voir des doutes) quant-à la fiabilité d'un tel montage (mais c'est peut-être juste parce que je suis loin d'avoir tout compris) :
- les gens de DCC-EX , c'est des costauds , si on pouvait implémenter le cutout de manière assez fiable dans l'ESP32 , pourquoi ne l'auraient-ils pas fait ?
- c'est le RMT qui est utilisé , car il permet de dérouler le packet indépendamment des errances des cores
- à la fin d'un RMT , il faut recharger les données (pour le packet suivant) , dans le cadre d'une interruption : il vaut mieux que cette interruption se fasse au cours d'un bit dcc 0 , par exemple le packet start bit , car c'est le moment où on peut se permettre des libertés dans les délais , moyennant le stretch de ce bit , ce qui est permis par la norme
- ce code créé plusieurs approximations dans le timing :
- - la latence de l'interruption : 4 à 8us , et pire si des opérations wifi sont en cours
- - les delayMicroseconds() , c'est pas des sciences exactes , en particulier pour un ESP32
- - le digitalWrite , pareil
.
donc , je ne doute pas que tu trouves des signaux acceptables à l'analyseur logique , mais qu'en est-il quand l'ESP32 est un peu sollicité , notamment s'il fait des opérations wifi ?
2
Vos projets / Re : Éclairage voitures
« Dernier message par laurentr le Aujourd'hui à 03:07:26 pm »
Bonjour

Puisque c est un sujet que je connais particulièrement bien je vais pouvoir donner des éléments concrets d'appréciation.

Si tu recherches une commande de type "jour/nuit" le pilotage de la chaine et son exécution est a dimensionné en regard de la conso du montage ( les leds principalement)
Avec 5v et 10K par led cela revient à paralléliser les résistances de 10k... cela va avoir une incidence directe selon leur nombre total...
On peut cette faire une moyenne mais cela reste approximatif.
L échelle des modeles va influer aussi...

Conté conso il faudra privilégié un convertisseur de type DC DC pour éviter les échauffements de convertisseur de tension et de la puissance appelée.

S en suit du coup le stockage anti clignotement qui va avec. Le rôle des super capa joue ici à plein son rôle si on décide d y avoir recours ( ce qui implique un circuit de régulation de charge et possiblement un convertisseur de type BOOST pour repasser en 3v3 ou 5V et/ou le maintenir.

Tu vois donc que le cahier des charges à visée qualitative a des incidences sur ce qu'il faut intégrer et donc possiblement des couts.

Enfin ajouter un CPU pour le contrôle de tout cela ajoute aussi une énergie a intégrer au dispositif.

Alors in fin comment s en sort on?
Les critères sont:
le/les niveau(x) de besoin(s) à couvrir
le niveau de technicité retenu
les contraintes techniques ( encombrement, volumes,...)
le cout de la solution mis en œuvre.


Pour faire echo aux propos du post:
batterie or not batterie?
cpu additionnel (lequel) ou pas
universalité ou montage spécifique à une /des catégories de matériels
chaine de liaison entre les solutions...

Pour une ligne de train avec des ordres de pilotage individualisés il faut à minima 4 fils (bus TWI/I2C: plots SLA SDA +5V GND) voir 6 avec les 2 pôles DCC de chaque rail.
Sinon il faut un CPU par véhicule avec la circuiterie qui va autour.

Enfin j exclurai le relais qui n est à réserver qu'au pire des scenarii ou un transistor ne permet pas d obtenir un résultat analogue ou qu'une  isolation particulière est requise.

Espérant t avoir apporté des clés de réflexion utiles.

Laurent


3
Vos projets / Re : Éclairage voitures
« Dernier message par LocoFred le Aujourd'hui à 01:09:01 pm »
Merci Christophe pour tes remarques, toujours aussi pertinentes !
Je me plonge dans le sujet sur l'alimentation des locos qui a l'air très intéressant...
Par contre, l'éclairage des voitures, ça n'a pas l'air de passionner les foules...
Peut-être parce que l'Arduino n'est pas directement concerné ?..
Quoi que…
Merci pour tes encouragements, je poursuis donc mes recherches.

“Rien ne vaut la recherche lorsqu’on veut trouver quelque chose.”
J. R. R. Tolkien / Bilbo le Hobbit
 ;)
4
Vos projets / Re : Re : LaBox" : Une Centrale DCC polyvalente et abordable
« Dernier message par Brunotoutsimple le mai 16, 2024, 09:19:45 pm »
Bonjour.

Je viens de recevoir un ESP32 pour construire « La Box »
Pressé d’explorer le code pour la rendre compatible RailCom.

La modification est très simple, ajout de deux delay au bon endroit.
Dans le fichier DCCRMT.cpp, chercher :

void IRAM_ATTR interrupt(rmt_channel_t channel, void *t) {

La modifier comme ci-dessous.

void IRAM_ATTR interrupt(rmt_channel_t channel, void *t) {             
  delayMicroseconds(22);
  digitalWrite(25,1);
  delayMicroseconds(412);  //  ___________---___________
  digitalWrite(25,0);
  RMTChannel *tt = channelHandle[channel];
  if (tt) tt->RMTinterrupt();
  if (channel == 0)
    DCCTimer::updateMinimumFreeMemoryISR(0);
}
et dans le setup(), mettre la pin D25 en sortie :
pinMode(25, OUTPUT);

L’introduction du CutOut dans la trame DCC se fait de manière matérielle avec un circuit TTL logique 7400 (4 portes Nand) ,  voir les photos en pièces jointes.
De cette façon le signal DCC original n’est pas altéré, que du contraire, il est tamponné.
Placer des Delay dans une interruption, n’est pas très élégant, il est possible de les remplacer par des Timers.

Bien à vous.

Bonsoir

Super Lebelge2!
Etant novice, Vous dites que c'est pas très élégant de mettre des delays pour des interruptions et c'est ce que j'avais lu pour les interruptions pour Arduino. Est-ce que vous serait possible de modifier le programme afin d'introduire les Timers que vous le suggérez.
Vous dites d'ajouter la ligne suivante dans le setup(), c'est où? SVP
dans le setup(), mettre la pin D25 en sortie :
pinMode(25, OUTPUT);
5
Vos projets / Re : LaBox" : Une Centrale DCC polyvalente et abordable
« Dernier message par lebelge2 le mai 16, 2024, 08:07:20 pm »
Bonjour.

Je viens de recevoir un ESP32 pour construire « La Box »
Pressé d’explorer le code pour la rendre compatible RailCom.

La modification est très simple, ajout de deux delay au bon endroit.
Dans le fichier DCCRMT.cpp, chercher :

void IRAM_ATTR interrupt(rmt_channel_t channel, void *t) {

La modifier comme ci-dessous.

void IRAM_ATTR interrupt(rmt_channel_t channel, void *t) {             
  delayMicroseconds(22);
  digitalWrite(25,1);
  delayMicroseconds(412);  //  ___________---___________
  digitalWrite(25,0);
  RMTChannel *tt = channelHandle[channel];
  if (tt) tt->RMTinterrupt();
  if (channel == 0)
    DCCTimer::updateMinimumFreeMemoryISR(0);
}
et dans le setup(), mettre la pin D25 en sortie :
pinMode(25, OUTPUT);

L’introduction du CutOut dans la trame DCC se fait de manière matérielle avec un circuit TTL logique 7400 (4 portes Nand) ,  voir les photos en pièces jointes.
De cette façon le signal DCC original n’est pas altéré, que du contraire, il est temponné.
Placer des Delay dans une interruption, n’est pas très élégant, il est possible de les remplacer par des Timers.

Bien à vous.
6
Vos projets / Re : Éclairage voitures
« Dernier message par bobyAndCo le mai 16, 2024, 09:49:08 am »
Bonjour Fred,

Voilà un projet intéressant.

Quelques remarques puisque tu sollicites les avis :

1° - Je ne suis pas très partisan d’utiliser le bus DCC à autres choses que la traction. J’aurais personnellement choisi un autre mode de commande par exemple à base de WiFi ou de Bluetooth. Puisque tu envisages de placer la « mécanique » dans un fourgon à bagages, un ESP32 de petite taille pourrait facilement s’y loger avec le reste.

2° - Si tu choisis tout de même le bus DCC pour les commandes, je te conseille d’utiliser un décodeur autre que celui de la locomotive. De la même manière, tu trouveras sur le site toutes les informations pour réaliser un décodeur d’accessoires à base d’Arduino (ou ESP) à loger dans le fourgon.

3° - Pour l’énergie, l’une des solutions est en effet de prendre celle-ci sur les rails et de mettre un pont de diodes pour redresser le courant. Il faudrait ajouter dans ton montage un condensateur qui évitera les scintillements et maintiendra l’éclairage en cas de microcoupures liées par exemple à une voie un peu sale. Il faut prendre en compte la consommation de courant qui peut ne pas être négligeable s’il y a plusieurs wagons équipés, voire plusieurs trains ! Cela peut aussi jouer en cas de détection par consommation de courant sur le réseau.

4° - Comme tu prévoies un wagon suiveur, il peut aussi être envisagé de mettre un accu de petite taille dans ce wagon (18650…). Celui-ci se rechargeant en permanence (mais en « tirant » un courant limité (pont de diodes et résistance) ou alors que le wagon suiveur est stationné à des endroits précis du réseau directement en DC avec des palpeurs sous le wagons.

Il y a un sujet sur le forum qui aborde ces questions dans le cas de l'alimentation des locomotives mais le principe est le même. J'avais réalisé un montage à base de 18650. A voir ici : https://forum.locoduino.org/index.php?topic=1252.msg13601#msg13601

Comme tu le vois, il y a de nombreux moyens d’arriver au résultat et je suis certain que plusieurs autres solutions te seront proposées. Avant de se lancer, je pense qu’il faut bien regarder tous les avantages et inconvénients de chaque hypothèse.

Bonne chance pour ce projet

Christophe
7
Vos projets / Éclairage voitures
« Dernier message par LocoFred le mai 15, 2024, 11:30:16 pm »
Ami(e)s Locoduinistes, ça n'est pas sans plaisir que je parcours régulièrement vos messages plus instructifs les uns que les autres !
Encouragé et soutenu par certains d'entre vous, je me lance pour aborder un nouveau sujet auquel je n'ai pas trouvé de réponses :
quelle serait la meilleure solution pour éclairer une rame de voitures par bandeau de led ainsi qu'allumer les feux de fin de convoi ?

Mes contraintes:
- Commander à distance ces allumages via le décodeur de la loco ou un autre décodeur placé dans un fourgon.
- Se servir de crochets conducteurs à aimants du type REE modeles (2 fils).

De là en découlent quelques questionnements :
- L'intensité nécessaire à l'alimentation de quelques bandeaux de led nécessite-t-il l'utilisation de relais ou d'autres solutions sont-elles possibles ? 
- En utilisant qu'un fil pour commander l'éclairage et un autre pour les feux de fin de convoi (seulement deux fils à faire transiter entre chaque voiture ou wagon), peut-on envisager la prise du courant directement sur les rails ?

Et j'en suis arrivé à élaborer le projet suivant, loin d'être certain que ce soit la meilleure  solution et surtout, loin d'être certain du choix des composants et de leur positionnement...
Excusez mon schéma qui n'est pas très orthodoxe mais devrait être compréhensible ?..



Mon idée serait d'alimenter les bandeaux ou les feux de fin de convoi en prenant le courant sur les rails, par les essieux, de transformer ce courant en DC en passant par un pont redresseur (DB207S ?), d'en abaisser la tension à 12v pour passer par un relai (G5V-1 ?) avant d'alimenter soit le bandeau, soit les feux de fin de convoi...
Le relai serait commandé par une des fonctions auxiliaires du décodeur.

1°/ Ce schéma vous semble-t-il correcte ?
2°/ Je ne suis absolument pas certain d'avoir bien identifié les bornes du relai G5V-1 ?
3°/ Si la réponse à mes deux premières question est positive, est-il possible d'alimenter la bobine du relai par le DC+ ou faut-il obligatoirement utiliser le commun positif du décodeur (ce qui obligerait à faire transiter trois fils entre chaque voiture) ?
4°/ Et enfin, la diode 1N4148 est-elle utile, indispensable ou juste envahissante ?..

Merci à tous pour vos réponses, conseils, retours d'expérience et propositions, espérant par là même être utile à d'autres plus discrets...

Sincèrement,
Fred.
8
Trucs & astuces / Re : Comptage des essieux
« Dernier message par Brunotoutsimple le mai 15, 2024, 01:07:17 pm »
Bonjour Christophe

Voici un autre programme pour faire fonctionner ce montage avec écran LCD pour vérifier le fonctionnement. Je n'ai pas le matériel pour le faire.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);  // Initialisation de l'afficheur LCD - 20 chiffres 4 lignes
int Impulse;                         // Impulsions au point de lecture
int Axles;                          // sont des essieux / 4 ou des aimants

// Définir les broches pour les entrées analogiques
const int analogl = A0;
const int analog2 = A1;
const int analog3 = A2;
const int analog4 = A3;

int counter1 = 0;      // Compteur1 des valeurs incrémentales
int lastEncoded1 = 0;  // Dernière valeur encodée
int counter2 = 0;      // Compteur2 pour les valeurs incrémentales
int lastEncoded2 = 0;  // Dernière valeur encodée

// Barrières photoélectriques de 1-4
int LS1;
int LS2;
int LS3;
int LS4;

void setup() {
  Wire.begin();  // Initialise le bus I2C
  lcd.init();    // Initialise l'écran LCD
  lcd.backlight();
  Serial.begin(9600);  // Démarre la communication série
  pinMode(7, OUTPUT);  // La LED s'allume lorsqu'elle est occupée
  pinMode(8, OUTPUT);  // La LED s'allume lorsqu'elle est libre
}

void loop() {
  updateEncoder();
  // Lire la valeur entre 0 et 1023 sur l'entrée analogique A0
  // si plus petit à 20 => alors LS1 actif
  int Value1 = analogRead(analog1);
  if (Value1 < 20) LS1 = 1;
  else LS1 = 0;
  // Lire la valeur entre 0 et 1023 sur l'entrée analogique A1
  // si plus petit à 20 => alors LS2 actif
  int Value2 = analogRead(analog2);
  if (Value2 < 20) LS2 = 1;
  else LS2 = 0;
  // Lire la valeur entre 0 et 1023 sur l'entrée analogique A2
  // si plus petit à 20 => alors LS3 actif
  int Value3 = analogRead(analog3);
  if (Value3 < 20) LS3 = 1;
  else LS3 = 0;
  // Lire la valeur entre 0 et 1023 sur l'entrée analogique A3
  // si plus petit à 20 => alors LS4 actif
  int Value4 = analogRead(analog4);
  if (Value4 < 20) LS4 = 1;
  else LS4 = 0;

  if (Impulse != 0) {
    digitalWrite(7, LOW);
  } else {
    digitalWrite(7, HIGH);
  }
  if (Impulse == 0) {
    digitalWrite(8, LOW);
  } else {
    digitalWrite(8, HIGH);
  }
  Impulse = counter1 - counter2;  // Différence entre les Impulsions des capteurs
  Axles = Impulse / 4;           // Essieux ou magnette
  lcd.setCursor(0, 0);
  lcd.print("A0");
  lcd.print("   ");
  lcd.print("Al");
  lcd.print("   ");
  lcd.print("A2");
  lcd.print("   ");
  lcd.print("A3");
  lcd.setCursor(0, 1);
  lcd.print("   ");
  lcd.print(Value1);
  lcd.print("   ");
  lcd.print(Value2);
  lcd.print("   ");
  lcd.print(Value3);
  lcd.print("   ");
  lcd.print(Value4);
  lcd.setCursor(0, 2);
  lcd.print("Impulse  ");
  lcd.print(Impulse);
  lcd.print("   ");
  lcd.setCursor(0, 3);
  lcd.print("Axles   ");
  lcd.print(Axles);
  lcd.print("   ");
  Serial.println(Impulse);  // Affiche la lecture actuelle du compteur
  Serial.println(Axles);   // Affiche les essieux actuels
}

void updateEncoder()  // Mise à jour du compteur
{
  int encoded1 = (LS1 << 1) | LS2;  // Encode les deux signaux en une seule valeur << est l'opérateur de décalage de bit gauche
  int encoded2 = (LS3 << 1) | LS4;
  int sum1 = (lastEncoded1 << 2) | encoded1;                                             // Somme 1 de la valeur codée actuelle
  int sum2 = (lastEncoded2 << 2) | encoded2;                                             // Somme 1 de la valeur codée actuelle
  if (sum1 == 0b1101 || sum1 == 0b0100 || sum1 == 0b0010 || sum1 == 0b1011) counter1++;  // Compter
  if (sum1 == 0b1110 || sum1 == 0b0111 || sum1 == 0b0001 || sum1 == 0b1000) counter1--;  // Décompter
  if (sum2 == 0b1101 || sum2 == 0b0100 || sum2 == 0b0010 || sum2 == 0b1011) counter2++;  // Compter
  if (sum2 == 0b1110 || sum2 == 0b0111 || sum2 == 0b0001 || sum2 == 0b1000) counter2--;  // Décompter
  lastEncoded1 = encoded1;                                                               // Sauvegarde la valeur codée 1 actuelle
  lastEncoded2 = encoded2:                                                               // Sauvegarde la valeur codée 2 actuelle
}

/*
En mode comptage, les lignes responsables de l'affichage et de la sortie série doivent être verrouillées avec //.
Ils sont supprimés à des fins de tests.
*/

9
Trucs & astuces / Re : Re : Comptage des essieux
« Dernier message par Brunotoutsimple le mai 15, 2024, 11:11:46 am »
Il y a en effet un capteur à chaque extrémité mais chaque capteur à bien deux leds comme on peut le voir sur la photo ou sur le schéma.

C'est aussi visible dans le code :


// Initialisation des variables
int a=0; // Etat du premier capteur
int b=0; // État du deuxième capteur
int c=0; // État du troisième capteur
int d=0; // État du quatrième capteur

Vu comme cela exactement. J'aurai dû ecrire comme ceci:
// Initialisation des variables
int a=0; // Etat de la Led 1 du premier capteur
int b=0; // Etat de la Led 2 du premier capteur
int c=0; // Etat de la Led 1 du Second capteur
int d=0; // Etat de la Led 2 du Second capteur
Voici le schéma du Capteur ainsi que le calcul de la résistance R1.
Après, il peut être fait autrement, je suis pas électronicien. Exemple donné pour un ESP32 mais vous pouvez mettre un autre microprocesseur type ATtiny414 ou autre
10
Trucs & astuces / Re : Comptage des essieux
« Dernier message par bobyAndCo le mai 15, 2024, 09:56:10 am »
Il y a en effet un capteur à chaque extrémité mais chaque capteur à bien deux leds comme on peut le voir sur la photo ou sur le schéma.

C'est aussi visible dans le code :


// Initialisation des variables
int a=0; // Etat du premier capteur
int b=0; // État du deuxième capteur
int c=0; // État du troisième capteur
int d=0; // État du quatrième capteur

Pages: [1] 2 3 ... 10