Messages récents

Pages: [1] 2 3 ... 10
1
Vos projets / Re : Projet partagé d'un gestionnaire de réseau
« Dernier message par Brunotoutsimple le Aujourd'hui à 03:47:31 pm »
Bonjour à tous
je suis nouveau. je suis ni informaticien, ni électronicien, mais je suis tous les forums. Je vous avoue que je suis perdu. Mais pour votre problème, le comptage des roues en entrée et en sortie ne serait-il pas la solution.

Bruno
2
Vos projets / Re : Projet partagé d'un gestionnaire de réseau
« Dernier message par DDEFF le Aujourd'hui à 02:48:12 pm »
Bonjour Pierre,

Le problème que tu poses n'est pas lié au PRS, il est, en effet beaucoup plus général.

Comme tu le sais déjà, il s'appelle à la SNCF la "limite de zone de garage franc", symbolisée, à la SNCF, par une marque blanche qui indique l'endroit à partir duquel un véhicule (loco ou wagon, voiture, ...) engage le gabarit d'une voie voisine.
C'est même en vente chez Décapod, pour info (voir fichier joint).

Concernant le matériel en miniature, comme la détection se fait par détection de courant, c'est donc au niveau des roues que l'on détecte une présence.
Et, particulièrement pour les voitures (ou tout matériel à bogies), il y a un bon écart entre le tampon et la roue... ce qui n'arrange rien.

Ce qui m'embête aussi, c'est que je n'ai aucune idée de la façon dont la SNCF gère le problème que tu soulèves.
Parce que mettre un repère blanc, c'est bien, mais ça ne résout pas le problème.

A mon avis, en gérant les longueurs de train (en comptant les "points" dans l'image à l'écran, par exemple), on devrait pouvoir s'en sortir.
Mais un train virtuel ne perd jamais ses wagons...
Je pense que le vrai problème se pose quand les wagons se décrochent.

Denis
3
Le logiciel DCC++ / Logiciel DCC BaseStation avec fonction RailCom
« Dernier message par lebelge2 le Aujourd'hui à 02:08:47 pm »
Bonjour.

J’ai modifié légèrement ce logiciel pour qu’il insère un CutOut  à la fin des trames.
Donc maintenant compatible RailCom.

Fonctionne sur Mega et Uno.

Trois nouvelles sorties pour les signaux (Out1, Out2, CutOut/Brake) sur PC0, PC1, PC2
 (sur Mega 35 36 37, Uno A0 A1 A2)
Les sorties d’origines fonctionnent toujours mais sans CutOut.

La modification logiciel :

Dans DCCpp_Uno, chercher l’interruption :  ISR(TIMER1_COMPB_vect)  (Ligne 457)
Il faut la modifier très légèrement.
Au-dessus,  il faut placer les #defines et une variable.
En dessous, il faut écrire une nouvelle interruption (ISR(TIMER1_COMPA_vect))
Ce qui donne une modification comme ci-dessous.

///////////////////////////////////////////////////////////////////////////////

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)  // MEGA
#define PINx   PINB             
#define PinIn  6                // Pin numéro 12 sur Mega (PB6)     
#define PORTx  PORTC            // Pin de sorties des signaux Out1, Out2, Brake/CutOut sur port C
#define Etat1  B00000100        // -_-_-_   Direct   Pin 35  (In1 pour type L298N, L6203, Dir pour type LMD18200)
#define Etat2  B00000010        // _-_-_-   Inversé  Pin 36  (In2 pour type L298N, L6203, Dir pour type LMD18200)
#define CutOut_ON  B00000111    // __----__          Pin 37  (BraKe Pour Type LMD08200)
#define CutOut_OFF B00000000    // ________
#else                                                           // UNO
#define PINx  PINB             
#define PinIn  2                 // Pin numéro 10 sur Uno (PB2)
#define PORTx  PORTC             // Pin de sorties des signaux Out1, Out2, Brake/CutOut sur port C
#define Etat1  B00000100         // -_-_-_   Direct   Pin A2  (In1 pour type L298N, L6203, Dir pour type LMD18200)
#define Etat2  B00000010         // _-_-_-   Inversé  Pin A1  (In2 pour type L298N, L6203, Dir pour type LMD18200)
#define CutOut_ON  B00000111     // __----__          Pin A0  (BraKe Pour Type LMD08200)
#define CutOut_OFF B00000000     // ________
#endif
bool CutOut = false;

// NOW USE THE ABOVE MACRO TO CREATE THE CODE FOR EACH INTERRUPT

ISR(TIMER1_COMPB_vect) {      // set interrupt service for OCR1B of TIMER-1 which flips direction bit of Motor Shield Channel A controlling Main Track
  PORTx = Etat1;
  DCC_SIGNAL(mainRegs, 1);
  if (mainRegs.currentBit == 2)
    CutOut = true;
  }
 
  ISR(TIMER1_COMPA_vect) {
    PORTx = Etat2;
    if ( CutOut == true) {
      CutOut = false;
      delayMicroseconds(29);
      PORTx = CutOut_ON;
      delayMicroseconds(420);
      PORTx = CutOut_OFF;
    }
  }

Il faut activer cette nouvelle interruption.
A la ligne 309, écrivez :   bitSet(TIMSK1,OCIE1A);   

A la ligne 390 dans le setup() écrivez la configuration des sorties.

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)  // MEGA
  pinMode(35, OUTPUT);         // OUT 1  PC0
  pinMode(36, OUTPUT);         // OUT 2  PC1
  pinMode(37, OUTPUT);         // BRAKE  PC2
#else                                                           // UNO
  pinMode(A2, OUTPUT);         // OUT 1  PC0
  pinMode(A1, OUTPUT);         // OUT 2  PC1
  pinMode(A0, OUTPUT);         // BRAKE  PC2
#endif

Testé avec Mega, Uno et L298N, doit fonctionner avec L6203
Je viens de recevoir un LMD18200 mais il est défectueux, pas testé

Câblage:
Mega  =======> Bridge  Driver                 
    35  =======> In1  (Dir pour type LMD18200)
    36  =======> In2
    37  =======> Brake, seulement pour type LMD18200

  Uno  =======> Bridge  Driver                 
    A2  =======> In1  (Dir pour type LMD18200)
    A1  =======> In2
    A0  =======> Brake, seulement pour type LMD18200

Bien à vous.


4
Vos projets / Re : RailCom: Générateur de CutOut avec booster
« Dernier message par Brunotoutsimple le Aujourd'hui à 09:50:44 am »
bonjour Laurent
je suis avec intérêt tous tes travaux, ainsi que ceux de Christophe, je découvre beaucoup de chose. J'essais de comprendre le fonctionnement.
d' après ce que j'ai compris, il faut:
1) Labox de Christophe mais qui est en évolution afin qu'elle puisse contenir le Cutout pour RailCom.
2) la carte main
3) X satellites, un pour chaque canton.
4) la carte watchdog.

Maintenant je n'ai pas tout compris sur le fonctionnement des boosters sur le réseau.

Cordialement
Bruno
5
Le logiciel DCC++ / Re : Logiciel DCC CommandStation –EX-master avec fonction RailCom
« Dernier message par bobyAndCo le mai 08, 2024, 08:29:20 am »
Merci lebelge pour ce partage.

Je ne vais pas pouvoir tester avant la semaine prochaine mais je vais m'y coller et faire un retour.

Il faudra bien penser à "reporter" les modifications en cas de mise à jour de DCC CommandStation car celles ci-seront écrasées.

Comme tu es si bien lancé, n'envisages tu pas de t'attaquer à la version pour ESP32 de DCC CommandStation ?

Bien à toi.

Christophe
6
Vos projets / Re : Projet partagé d'un gestionnaire de réseau
« Dernier message par Dominique le mai 07, 2024, 05:00:16 pm »
Merci Pierre, mon optimisme se confirme donc.

Je vais pouvoir refaire complètement mon gestionnaire sur cette nouvelle mouture, même si la configuration est déjà faite sans le json car la version actuelle a été tellement modifiée qu’il vaut mieux repartir sur un bon pied.
7
Le logiciel DCC++ / Logiciel DCC CommandStation –EX-master avec fonction RailCom
« Dernier message par lebelge2 le mai 07, 2024, 02:23:55 pm »
Bonjour.

J’ai modifié légèrement ce logiciel pour qu’il insère un CutOut  à la fin des trames.
Donc maintenant compatible RailCom.

Fonctionne sur Mega et Uno.

Restrictions :

Pour le Mega; Dans MotorDriver.h  la Pin 9 est imposée.
    ex: new MotorDriver(7, 9, UNUSED_PIN, UNUSED_PIN, A0, 2.99, 2000, UNUSED_PIN),
Pour l'Uno; Dans MotorDriver.h  la Pin 12 est imposée.
    ex: new MotorDriver(7, 12, UNUSED_PIN, UNUSED_PIN, A0, 2.99, 2000, UNUSED_PIN),

Trois nouvelles sorties pour les signaux (Out1, Out2, CutOut/Brake) sur PC0, PC1, PC2
 (sur Mega 35 36 37, Uno A0 A1 A2)
Bien entendu que toutes les sorties d’origines fonctionnent toujours mais sans CutOut.
Le code est extrêmement simple, les bidouilleurs pourront modifier toutes les sorties.

La modification logiciel :

Tout ce passe dans l’interruption du Timer1 :ISR(TIMER1_OVF_vect)   dans DCCTimerAVR.cpp
Il faut la remplacer par le code que je propose ci-dessous avec les défines et variables.

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)  // MEGA
#define PINx   PINH             // Pin numéro 9 sur Mega (PH6)     
#define PinIn  6                // new MotorDriver(7, 9, UNUSED_PIN, UNUSED_PIN, A0, 2.99, 2000, UNUSED_PIN),
#define PORTx  PORTC            // Pin de sorties des signaux Out1, Out2, Brake/CutOut sur port C
#define Etat1  B00000100        // -_-_-_   Direct   Pin 35  (In1 pour type L298N, L6203, Dir pour type LMD18200)
#define Etat2  B00000010        // _-_-_-   Inversé  Pin 36  (In2 pour type L298N, L6203, Dir pour type LMD18200)
#define CutOut_ON  B00000111    // __----__          Pin 37  (BraKe Pour Type LMD08200)
#define CutOut_OFF B00000000    // ________
#else                                                           // UNO
#define PINx  PINB              // Pin numéro 12 sur Uno (PB4)
#define PinIn  4                // new MotorDriver(7, 12, UNUSED_PIN, UNUSED_PIN, A0, 2.99, 2000, UNUSED_PIN),
#define PORTx  PORTC
#define Etat1  B00000100
#define Etat2  B00000010
#define CutOut_ON  B00000111
#define CutOut_OFF B00000000
#endif

int i;
int temps;
int oldtemps;
int bitt;
uint8_t bitCount;
uint8_t DccBitVal;
volatile uint8_t dccrecState;
ISR(TIMER1_OVF_vect) {     // ISR called by timer interrupt every 58uS
  temps = (bitRead(PINx, PinIn));
  if (temps == 1)
    PORTx = Etat1;
  else
    PORTx = Etat2;
  interruptHandler();
 temps = (bitRead(PINx, PinIn));
  i++;
  if ((i % 2) == 0) {
    if (temps != oldtemps) {
      bitt += 1;
      DccBitVal = 0;
    }
    else {
      bitt += 2;
      DccBitVal = 1;
    }
    oldtemps = temps;
    if (bitt > 1) {
      bitt = 0;
      bitCount++;
      switch (dccrecState) {
        case 0:
          if (DccBitVal) {
            if (bitCount >= 10)
              dccrecState = 1;
          }
          else {
            bitCount = 0;
          }
          break;
        case  1:
          if (!DccBitVal ) {
            dccrecState = 2;
            bitCount = 0;
          }
          break;
        case 2:
          if (bitCount == 8 ) {
            dccrecState = 3;
          }
          break;
        case 3:
          if ( DccBitVal ) {
            dccrecState = 4;
          }
          else
            dccrecState = 2;
          bitCount = 0;
          break;
        case 4:
          dccrecState = 0;
          PORTx = CutOut_ON;
          delayMicroseconds(420);
          PORTx = CutOut_OFF;
      }
    }
  }
}


Dans le void setup()   (CommandStation-EX), placer le code ci-dessous.

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)  // MEGA
  pinMode(35, OUTPUT);         // OUT 1  PC0
  pinMode(36, OUTPUT);         // OUT 2  PC1
  pinMode(37, OUTPUT);         // BRAKE  PC2
#else                                                           // UNO
  pinMode(A2, OUTPUT);         // OUT 1  PC0
  pinMode(A1, OUTPUT);         // OUT 2  PC1
  pinMode(A0, OUTPUT);         // BRAKE  PC2
#endif

Testé avec Mega, Uno et L298N, doit fonctionner avec L6203
Je viens de recevoir un LMD18200 mais il est défectueux, donc rien testé

Cablage :
Mega  =======> Bridge  Driver                 
    35  =======> In1  (Dir pour type LMD18200)
    36  =======> In2
    37  =======> Brake, seulement pour type LMD18200

  Uno  =======> Bridge  Driver                 
    A2  =======> In1  (Dir pour type LMD18200)
    A1  =======> In2
    A0  =======> Brake, seulement pour type LMD18200

Bien à vous.
8
Vos projets / Re : Projet partagé d'un gestionnaire de réseau
« Dernier message par Pierre59 le mai 07, 2024, 11:29:32 am »
@ Dominique

Pas d'inquiétude, la bibliothèque "Arduinojson" a tout ce qu'il faut. C'est un peu déconcertant car l'opérateur [] du C++ est redéfini pour accéder aux éléments du fichier json, mais en définitive l'écriture est plus compacte et plus lisible. J'ai déjà fait des essais.

Pierre
9
Vos projets / Re : Projet partagé d'un gestionnaire de réseau
« Dernier message par Dominique le mai 06, 2024, 06:58:18 pm »
@pierre,

J’ai cherché l’équivalent des initializations des objets zone, aiguille, signaux, trains, etc à partir du fichier JSON (Z1.osé) en C++ pour Arduino.
Mais je n’ai rien trouvé de simple et compréhensible même dans les projets Arduinojson de Blachon et d’Arduino.
En Java, l'objet "doc" peut être décomposé simplement en objets "zone", "aigullle", etc.. directement utilisables ensuite par le programme.

En C++ ça semble bien plus compliqué.

J’ai peur que la version C++ du gestionnaire représente un gros boulot !
10
Vos projets / Re : Booster dans un circuit DCC
« Dernier message par Dominique le mai 06, 2024, 06:15:46 pm »
Il existe des circuits booster qui se connectent directement sur la sortie DCC (les 2 rails).

Je n'ai pas de référence en tête ni le temps de chercher...
Pages: [1] 2 3 ... 10