Auteur Sujet: RailCom: Générateur de CutOut  (Lu 1599 fois)

trimarco232

  • Sr. Member
  • ****
  • Messages: 302
    • Voir le profil
Re : RailCom: Générateur de CutOut
« Réponse #30 le: avril 26, 2024, 12:09:46 pm »
j'ai donné toutes mes hypothèses , mais je suis bien d'accord avec toi : il faut aller au + simple :
- ne pas toucher au code DCC-EX , dès qu'il a assez de bits pour le préamble
- choisir un attiny412 (8 broches , récent) , prévoir le téléversement par l'ESP32 , mais aussi et d'abord par un connecteur externe , sur lequel on pourra brancher un convertisseur USB <-> série , que tout le monde a ; l'un ou l'autre composant supplémentaire nécessaire (résistance , diode) étant aussi à ajouter sur la carte
- utiliser le code de lebelge2 , vu qu'il existe et qu'il fonctionne (le code) ; je n'ai pas non plus compris le problème de l'inversion du signal (l'opposé de l'inverse étant identique à la même chose) ... à défaut , je pourrai proposer la variante que j'ai éditée au point 3) de mon post précédent
« Modifié: avril 26, 2024, 05:39:51 pm par trimarco232 »

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 943
  • HO avec DCC++
    • Voir le profil
Re : Re : RailCom: Générateur de CutOut
« Réponse #31 le: avril 27, 2024, 09:28:47 am »
Bonjour Marc, bonjour à tous,

Je te rejoins totalement sur l’ensemble des points que tu soulignes.

- ne pas toucher au code DCC-EX , dès qu'il a assez de bits pour le préamble

Tu as montré où il était possible de modifier le nombre de bits de préambule dans DCC-Ex, il faudra si nécessaire faire une petite entorse  au principe de ne pas modifier le programme original ou trouver une astuce pour contourner.

- choisir un attiny412 (8 broches , récent) , prévoir le téléversement par l'ESP32 , mais aussi et d'abord par un connecteur externe , sur lequel on pourra brancher un convertisseur USB <-> série , que tout le monde a ; l'un ou l'autre composant supplémentaire nécessaire (résistance , diode) étant aussi à ajouter sur la carte

C’est aussi à mon avis la meilleure solution. A tester, je vais essayer de m’y coller dans la semaine ou les 15 jours à venir.

utiliser le code de lebelge2 , vu qu'il existe et qu'il fonctionne (le code) ; je n'ai pas non plus compris le problème de l'inversion du signal (l'opposé de l'inverse étant identique à la même chose)

J’espère que le belge va nous apporter une réponse sur ce point, sinon je vais essayer au cours du WE de trouver le problème (s’il y en a un) et la solution concernant DCC-Ex.

Par ailleurs, je suis très intéressé par ce que tu appelles le point n°3 pour un autre sujet :

3) décoder , à la manière d'un sniffer , le DCC issu de l'ESP32 , puis le reproduire

C’est un sujet sur lequel nous travaillons à quelques-uns. Si tu as déjà des choses réalisées, cela est très intéressant. L’objectif est de capter l’ensemble des trames DCC qui circulent sur le bus et, au travers d’une passerelle, envoyer ces trames sur un bus CAN pour par exemple permettre à un gestionnaire mais aussi tout autres appareils de connaitre « au plus près » l’état du réseau.

Je m’explique avec un exemple concret. La Box (basée sur DCC-Ex) sait retourner une confirmation de réception de commande, soit en CAN (les méthodes CAN revoyant un accusé de réception pour chaque commande) soit en TCP (WiFi, Ethernet) à l’appareil qui a envoyé cette commande. Mais dans ce dernier cas, seul l’appareil à l’origine de la commande reçoit la confirmation. Par exemple smartphone avec une appli Z21. Mais pas le gestionnaire de réseau par exemple. En cherchant à faire une diffusion CAN des commandes du bus DCC, on rend les informations accessibles à tous.

Donc si tu as déjà des solutions, je suis bien évidement très intéressé. Je vais créer un fil à part pour ne pas interférer avec celui-ci.

Bon week-end  tous

Christophe
« Modifié: avril 27, 2024, 09:31:54 am par bobyAndCo »

lebelge2

  • Newbie
  • *
  • Messages: 29
    • Voir le profil
Re : RailCom: Générateur de CutOut
« Réponse #32 le: avril 27, 2024, 12:46:36 pm »
Bonjour.

Au sujet des trames inversées. (2 fils)

La première via l’entrée  In1  commande la partie droite du pont.
La deuxième via l’entrée In2  commande la partie gauche.
En mettant In1 et In2 à l’état haut, les transistors du haut (gauche et droit) sont passant et provoquent un court-circuit nécessaire à la circulation des data RailCom
Méthode utilisée par les L6203, L928N et autres.

Pour le LMD18200, un fil suffit, car les signaux sont inversés dans le composant.
Un autre fil met le pont en court circuit comme dit plus haut.

Evolution du soft , maintenant accepte les deux polarités.
Fonctionne aussi avec un  Attiny85

Bien à vous.

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 943
  • HO avec DCC++
    • Voir le profil
Re : RailCom: Générateur de CutOut
« Réponse #33 le: avril 27, 2024, 12:51:41 pm »
Merci vraiment une nouvelle fois.


Evolution du soft , maintenant accepte les deux polarités.
Fonctionne aussi avec un  Attiny85


Est-elle disponible cette évolution ???

lebelge2

  • Newbie
  • *
  • Messages: 29
    • Voir le profil
Re : RailCom: Générateur de CutOut
« Réponse #34 le: avril 27, 2024, 12:54:01 pm »
Oui ce soir car je teste.

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 943
  • HO avec DCC++
    • Voir le profil
Re : RailCom: Générateur de CutOut
« Réponse #35 le: avril 27, 2024, 12:57:37 pm »
Ok. Pour le LMD18200, tu as peut-êtr vu que j'ai effectivement ajouté la broche BRAKE. Ca fonctionne nickel !

lebelge2

  • Newbie
  • *
  • Messages: 29
    • Voir le profil
Re : RailCom: Générateur de CutOut
« Réponse #36 le: avril 27, 2024, 08:23:51 pm »
Bonjour.

Ci joint le soft avec un correctif pour décoder les trames inversées.
Fonctionne aussi avec un Attiny85 en version bêta.

Attention changement des Pins pour compatibilité avec l’Attiny
     2   Entrée Dcc
     3   Sortie vers IN1  (ou Dir     pour LMD18200)
     4   Sortie vers IN2  (ou Brake pour LMD18200)

Prévu pour LMD18200 mais rien testé, j’attends la réception de ce module.
Ligne n° 10:       //#define LMD18200

Bien à vous.

// RailCom: Programme pour insérer un CutOut dans les trames DCC.  Arduino Uno, Nano, Micro.  Attiny85.(Betâ)
//
// V.1.0.   24-04-24  Testé avec Bridge Driver L6203 et L298N
// V.1.1.   27-04-24  Upgrade pour Attiny85 et polarité inverse.
//
// lebelge2@yahoo.fr
//--------------------------------- Sélectionné votre  Hardware Bridge Driver------------------------------------
#define L298N           // L6203
//#define LMD18200
//----------------------------------------------------------------------------------------------
volatile uint8_t dccrecState;
volatile uint8_t tempByte;
bool PolariteDcc = true;
bool Brake;
unsigned long currentTime = 0;
unsigned long previousTime = 0;
unsigned long Temps;
#define WAIT_PREAMBLE    0
#define WAIT_START_BIT   1
#define WAIT_DATA        2
#define WAIT_END_BIT     3
#define MaxDccSize 6                         // DCC messages can have a length upto this value

class DccMessage {
  public:
    volatile uint8_t size;
    volatile uint8_t data[MaxDccSize];        // The contents of the last dcc message received
} dccMessage;

struct {
  uint8_t bitCount;                           // Count number of preamble bits / if we have a byte
  volatile uint8_t tempMessage[MaxDccSize];   // Once we have a byte, we store it in the temp message
  volatile uint8_t tempMessageSize;           // Here we keep track of the size, including XOR
} dccrec;                                     // The received DCC message is assembled here

struct {
  uint8_t port;
  uint8_t bit;                                // Bitmask for reading the input Port
  volatile uint8_t *portRegister;
} dccIn;
//---------------------------------------------- SetUp -------------------------------------------------------
void setup() {
#ifdef LMD18200
  Brake = true;
#endif
#ifdef __AVR_ATmega328P__                    // --- Arduino AVR ---
#define PORTx PORTD                          // PORTD
  Serial.begin(250000);
  init_timer2();                             // Timer 2
#elif ARDUINO_AVR_ATTINYX5                   // --- ATTINY CORE ATTINY85 ---  (Micronucleus DigiSpark)
#define PORTx PORTB                          // PORTB
  init_timer1();                             // Timer 1
#else
#error "Unsupported CPU, you need to add another configuration section for your CPU"
#endif
#define PinIn 2                               // Entrée trames Dcc sans CutOut
#define PinOut1 3                             // Sortie trames DCC avec CutOut           (LMD18200: Dir (sans CutOut))
#define PinOut2 4                             // Sortie trames DCC inversées avec CutOut (LMD18200: Brake (uniquement CutOut))
  pinMode(PinIn, INPUT);
  pinMode(PinOut1, OUTPUT);
  pinMode(PinOut2, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(PinIn), Dcc_Interrupt, CHANGE );
  dccIn.port = digitalPinToPort(PinIn);
  dccIn.bit = digitalPinToBitMask(PinIn);
  dccIn.portRegister = portInputRegister(dccIn.port);
}
//--------------------------------------------- Loop --------------------------------------------------------
void loop() {}
//------------------------------------------- Attiny 85 -----------------------------------------------------------
#ifdef ARDUINO_AVR_ATTINYX5
void init_timer1(void) {
  noInterrupts();              // disable all interrupts
  TCCR1 = 0;                   // B0 à B3: diviseur par 1, 2, 4, 8
  TCNT1 = 102;                 // preload the timer
  TIMSK = 4;                   // the timer is used in overflow interrupt mode
  interrupts();                // enable all interrupts
}
//--------------------------------------------- AVR ---------------------------------------------------------
#elif __AVR_ATmega328P__
void init_timer2(void) {
  noInterrupts();              // disable all interrupts
  TCCR2A = 0;                  // should be zero for our purpose
  TCCR2B = 0;                  // 0 => timer is stopped
  TCNT2 = 102;                 // preload the timer
  TIMSK2 |= 1;                 // the timer is used in overflow interrupt mode
  interrupts();                // enable all interrupts
}
#endif
//----------------------------------------------------------------------------
void CutOut() {
  if (PolariteDcc == false) {        // Si DCC inversé,
    delayMicroseconds(38);           // retarder CutOut d'un demis-bit
    PORTx = PORTx | B00001000;
    PORTx = PORTx &= ~ B00010000;
    delayMicroseconds(20);
  }
  delayMicroseconds(8);
  PORTx = PORTx | B00010000;
  PORTx = PORTx | B00001000;
  delayMicroseconds(430);
  PORTx = PORTx &= ~ B00001000;
  PORTx = PORTx &= ~ B00010000;
}
//------------------------------------------ DCC Interrupt -------------------------------------------
void Dcc_Interrupt() {
#ifdef __AVR_ATmega328P__
  if ((bitRead(PIND, PinIn)) == 1) {                // bitRead en 3µs,    digitalRead en 7µs
    TCCR2B |= 2;                                    // Start Timer 2
#elif ARDUINO_AVR_ATTINYX5
  if ((bitRead(PINB, PinIn)) == 1) {
    TCCR1 |= 4;                                     // Start Timer 1
#endif
    if (Brake == false)
      PORTx = PORTx &= ~ B00010000;                 // Temps d'exécution de ces instructions:
    PORTx = PORTx | B00001000;                      // 0,125µs en ASM,    0,170µs en C,      6µs en C++
  }
  else {
    if (Brake == false)
      PORTx = PORTx | B00010000;
    PORTx = PORTx &= ~ B00001000;
  }
  if (dccrecState == WAIT_START_BIT)  {           // L'intervalle de temps après le préambule est évalué,
    Temps = micros();
    previousTime = Temps - currentTime;
    currentTime = Temps;                          // si l'écart entre le dernier et le premier zéro est de 116 µs,
    if (previousTime > 90)                        // alors le signal est reconnu dans la bonne phase.
      PolariteDcc = true;                         // Polarité correcte
    else
      PolariteDcc = false;                        // Polarité inversée
  }
}
//------------------------------------------- ISR Timers ----------------------------------------------------
#ifdef __AVR_ATmega328P__
ISR(TIMER2_OVF_vect) {
  TCCR2B = 0;                                    // 0 => timer is stopped
  TCNT2 = 102;                                   // preload the timer. Fr. 16Mhz
#elif ARDUINO_AVR_ATTINYX5
ISR(TIMER1_OVF_vect) {
  TCCR1 = 0;                                     // 0 => timer is stopped
  TCNT1 = 112;                                   // preload the timer.  Fr. 16,5Mhz
#endif
  uint8_t DccBitVal;
  DccBitVal = !(*dccIn.portRegister & dccIn.bit);
  dccrec.bitCount++;
  switch (dccrecState) {
    case WAIT_PREAMBLE:
      if (DccBitVal) {                              // a "1" bit is received
        if (dccrec.bitCount >= 10)
          dccrecState = WAIT_START_BIT;
      }
      else
        dccrec.bitCount = 0;                        // not a valid preamble.
      break;
    case  WAIT_START_BIT:
      if ( !DccBitVal ) {                           // a "0" bit is received
        dccrecState = WAIT_DATA;
        dccrec.tempMessageSize = 0;
        uint8_t i;
        for (i = 0; i < MaxDccSize; i++ )
          dccrec.tempMessage[i] = 0;
        dccrec.bitCount = 0;
      }
      break;
    case WAIT_DATA:
      if ( dccrec.bitCount == 8 ) {                  // byte is complete
        if (dccrec.tempMessageSize == MaxDccSize ) { // Packet is too long - abort
          dccrecState = WAIT_PREAMBLE;
          dccrec.bitCount = 0;
        }
        else
          dccrecState = WAIT_END_BIT;                // Wait for next byte or end of packet
      }
      break;
    case WAIT_END_BIT:
      if ( DccBitVal ) {                             // End of packet?
        CutOut();
        dccrecState = WAIT_PREAMBLE;
      }
      else                                           // Get next Byte
        dccrecState = WAIT_DATA;
      dccrec.bitCount = 0;                           // prepare for the next byte
  }
}

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 943
  • HO avec DCC++
    • Voir le profil
Re : RailCom: Générateur de CutOut
« Réponse #37 le: avril 27, 2024, 10:35:23 pm »
Bonsoir à tous,

@lebelge : Bravo, je viens de tester la version 1.1 sur un MEGA avec DCC-EX et un L298 La détection Railcom fonctionne nickel !

Dans mon cas il a cependant fallu que je mette IN1 du L298 sur la pin 6 du Uno.

Je n'ai pas eu besoin de modifier le nombre de bits du préambule qui est donc resté à 16 (réglage par défaut de DCC-Ex)

Les réglages pour la carte L298 dans DCC-Ex sont les suivants :

#define MY_MOTOR_SHIELD F("L298"),\
  new MotorDriver(7, 6, 5, UNUSED_PIN, A0, 2.99, 2000, UNUSED_PIN), \
  new MotorDriver(2, 4, 3, UNUSED_PIN, A1, 2.99, 2000, UNUSED_PIN)

Le câblage dans mon cas est donc celui-ci.

MEGA 6 -------> NANO 2
MEGA 7 -------> L298 EN1
NANO 3 -------> L298 IN2
NANO 4 -------> L298 IN1

Demain je vais tester le même montage mais en remplaçant le MEGA par un ESP32 pour me mettre dans les conditions les plus proches de laBox.

Je crois que j’ai des ATTiny85 dans mon bazar, je ferai aussi alors le test.

Et enfin, comme j’ai aussi des L6203 et si j’ai le temps je remplacerai le L298.

Voilà un chantier important qui a sans doute trouvé sa solution.

Restera cependant la question des centrales sur lesquelles on ne peut pas s’intercaler entre le µC et le booster !!!

Christophe




« Modifié: avril 28, 2024, 07:31:12 am par bobyAndCo »

rNe

  • Newbie
  • *
  • Messages: 31
    • Voir le profil
    • Le blog à René
Re : RailCom: Générateur de CutOut
« Réponse #38 le: avril 27, 2024, 10:40:49 pm »
Bonsoir à tous.

Formidable votre travail !
Sachez que je suis à votre disposition pour redessiner un PCB compatible avec toutes ces évolutions. Si ma proposition vous convient, n'hésitez pas à me fournir les informations nécessaires pour réaliser, dans un premier temps, le schéma de principe.
Et après validation de votre part, dans un deuxième temps, traçage du PCB et GERBER au final.
Je ferai l'impossible pour que l'ensemble tienne dans un format inférieure à 10 x 10 cm...

Cordialement
Cordialement

lebelge2

  • Newbie
  • *
  • Messages: 29
    • Voir le profil
Re : RailCom: Générateur de CutOut
« Réponse #39 le: avril 28, 2024, 12:18:35 am »
BobyAndCo

Avec exactement le même matériel que toi, ça marche chez moi.
Mega2560 ==> Uno ==>  L298N

J’ai mis ta configuration pin :
 new MotorDriver(7, 6, 5, UNUSED_PIN, A0, 2.99, 2000, UNUSED_PIN), \

Pin 5 et 6 fonctionnent.

Attention que dans cette version (V.1.1)
Entrée Dcc      Pin 2  (Sur Uno)
Out1              Pin 3
Out2              Pin 4

Le cablage:
MEGA 5 ou 6 -------> UNO 2
MEGA 7 ------------> L298 EN1
UNO 3 -------------> L298 IN2
UNO 4 -------------> L298 IN1

Décodeur Loco: ESU standard
Il faudra certainement ajuster les tempos dans: void CutOut()

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 943
  • HO avec DCC++
    • Voir le profil
Re : Re : RailCom: Générateur de CutOut
« Réponse #40 le: avril 28, 2024, 07:30:30 am »
Attention que dans cette version (V.1.1)
Entrée Dcc      Pin 2  (Sur Uno)
Out1              Pin 3
Out2              Pin 4

Le cablage:
MEGA 5 ou 6 -------> UNO 2
MEGA 7 ------------> L298 EN1
UNO 3 -------------> L298 IN2
UNO 4 -------------> L298 IN1

Oups, je m'ai gouré en effet. J'avais pris une photo et avec l'erreur de parallaxe j'ai décallé les broches. Du coup, j'ai modifié dans mon post au dessus

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 943
  • HO avec DCC++
    • Voir le profil
Re : Re : RailCom: Générateur de CutOut
« Réponse #41 le: avril 28, 2024, 07:49:35 am »
J'arrive un peu après la bataille... désolé

Toutefois je vous présente le "petit dernier".

Bonjour Laurent, bonjour à tous.

Tout d’abord bravo à toi aussi Laurent pour cette réalisation. Je trouve que Locoduino est un sacré incubateur de propositions très sympatiques.

Il est important de préciser que ta proposition et celle du belge, bien qu’ayant toutes les deux le même objectif, ont des applications différentes.

Pour le belge, le montage se place entre la partie logicielle, par exemple un MEGA avec DCC-Ex et un booster

Dans ton cas, ton montage se place à la sortie d’une centrale avec booster (cas d’une centrale du commerce par exemple), génère un nouveau signal DCC avec cutout et l’envoie dans un nouveau booster, ici un L6203.

Ce qui fait que dans le premier cas nous n'avons besoin que d'un Nano/Uno voire même un ATTiny85 alors que dans le second, on reconstruit une centrale au moins pour la partie HardWare.

L'un et l'autre montages répondent à des contraintes différentes.

Il est probable pour éviter toute confusion que je séparerai les deux sujets dont les domaines d’application ne sont pas les mêmes.

Christophe
« Modifié: avril 28, 2024, 08:05:47 am par bobyAndCo »

phenixpopol

  • Newbie
  • *
  • Messages: 17
    • Voir le profil
Re : RailCom: Générateur de CutOut
« Réponse #42 le: avril 28, 2024, 12:51:42 pm »
Bonjour à tous,
Je suis attentivement ce forum «  Générateur de CutOut «  mais hélas 90 % des post me passent au dessus de la tête. Pourquoi certains contributeurs ne répondraient à la proposition de BobyAnd Co du 25 avril à 01,12,42 : « 
C’est effectivement un sujet qui en intéresse plus d’un à Locoduino à l’heure actuelle et principalement parace que la Box qui est une super centrale par ailleurs ne dispose pas de Railcom.

Cette proposition est une réponse intéressante à ce problème. Personnellement je suggère de « redessiner » le PCB de la Box pour y inclure un µc entre les sorties de l’ESP32 et le L6203. Cela me semble la solution la plus « propre »,la moins compliquée et la moins couteuse aussi. « 

Je sais que dans un post sur la box, cette évolution n’était pas prévue, mais je pense qu’elle permettrait à beaucoup d’évoluer vers la détection rail com.

Merci encore pour toutes les contributions même si eles sont souvent trop savantes pour moi

lebelge2

  • Newbie
  • *
  • Messages: 29
    • Voir le profil
Re : RailCom: Générateur de CutOut
« Réponse #43 le: avril 28, 2024, 01:33:36 pm »
Pour les possesseurs de La Box qui souhaitent la fonction RailCom.
Une légère modification est possible :
Enlever Q1, R1, R2 et couper une piste.
Placer en « volant » un Attiny85 avec le soft.

N’ayant pas La Box, je ne sais pas aider plus.

Aliexpress Attiny85

https://fr.aliexpress.com/item/2043055746.html


« Modifié: avril 28, 2024, 01:43:27 pm par lebelge2 »

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 943
  • HO avec DCC++
    • Voir le profil
Re : RailCom: Générateur de CutOut
« Réponse #44 le: avril 28, 2024, 02:48:19 pm »
@lebelge : J'ai moins de succès avec l'ATTiny !!!

Toutes les commandes DCC fonctionnent mais je n'ai aucune réponse du décodeur.

Configuration : MEGA avec DCC-Ex / L298 / ATTiny45

Peut-être un problème de câblage ?

MEGA 6 -------> ATTiny PB2
MEGA 7 -------> L298 EN
ATTiny PB3 ---> L298 IN1
ATTiny PB4 ---> L298 IN2

Une idée de solution ???

Christophe