Messages récents

Pages: [1] 2 3 ... 10
1
Vos projets / Re : Re : LaBox" : Une Centrale DCC polyvalente et abordable
« Dernier message par Brunotoutsimple le Aujourd'hui à 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);
2
Vos projets / Re : LaBox" : Une Centrale DCC polyvalente et abordable
« Dernier message par lebelge2 le Aujourd'hui à 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.
3
Vos projets / Re : Éclairage voitures
« Dernier message par bobyAndCo le Aujourd'hui à 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
4
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.
5
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.
*/

Je vous dirais que la dernière parti du code qui suis, j'ai compris le principe, mais la programmation, je suis perdu:
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
}

/*
6
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
7
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

8
Trucs & astuces / Re : Re : Comptage des essieux
« Dernier message par Brunotoutsimple le mai 15, 2024, 09:42:42 am »
Je découvre une chose intéressante en lisant le code posté par Bruno. Dans ce code, on voit qu’il y a un comptage des essieux en entrée de zone et un autre comptage en sortie. Cela nécessite par contre deux doubles capteurs soit quatre en tout.

Il n’est donc pas nécessaire de connaitre à l’avance le nombre d’essieux du convoi. Le système détecte simplement si le nombre d’essieux en sortie est égal ou non avec le nombre calculé en entrée.

En cas de différence, le système envoie une alerte.

C’est assez astucieux !

Christophe

Bonjour
 Non il faut juste un capteur de chaque extrémité d'un canton.
je suis entrain de dessiner cela.

9
Trucs & astuces / Re : Comptage des essieux
« Dernier message par bobyAndCo le mai 14, 2024, 07:53:38 pm »
Je découvre une chose intéressante en lisant le code posté par Bruno. Dans ce code, on voit qu’il y a un comptage des essieux en entrée de zone et un autre comptage en sortie. Cela nécessite par contre deux doubles capteurs soit quatre en tout.

Il n’est donc pas nécessaire de connaitre à l’avance le nombre d’essieux du convoi. Le système détecte simplement si le nombre d’essieux en sortie est égal ou non avec le nombre calculé en entrée.

En cas de différence, le système envoie une alerte.

C’est assez astucieux !

Christophe
10
Vos projets / Re : Re : RailCom: Générateur de CutOut avec booster
« Dernier message par Brunotoutsimple le mai 14, 2024, 03:54:52 pm »
Bonjour Bruno

Ce qui est décrit est une option. Elle semble valable mais n'est pas dans l'esprit du moment. ( au moins sur la version en cours)
Par ailleurs cela impose d avoir une parfaite inter synchro entre les éléments, impose d avoir la gestion du reverse localement.

In fine la souplesse acquise est à mettre en balance avec le cout.

Toutefois les modules conçus ici et utilisés sont parfaitement réutilisables sur un design socle diffèrent.

Ltr

Bonjour Laurent

Etant complètement novice, je vous fais entièrement confiance.
Pages: [1] 2 3 ... 10