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 - bobyAndCo

Pages: [1] 2 3 ... 60
1
Trucs & astuces / Re : Comptage des essieux
« le: Aujourd'hui à 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


2
Trucs & astuces / Re : Comptage des essieux
« 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

3
Trucs & astuces / Re : Comptage des essieux
« le: mai 13, 2024, 11:17:16 am »
Oui je suis d’accord avec toi Dominique et c’est en cela que je trouve que c’est une technique lourde d’enregistrer le nombre d’essieux pour chaque convoi. Peu souple en cas de modification de compositions de convois. Cela nécessite aussi de maintenir une petite base de données, bref, je crois pas très souple.

Pour détecter si un ou des wagons se sont décrochés, la détection par consommation de courant du wagon de queue et cette technique apportent les mêmes réponses satisfaisantes.

Christophe

4
Trucs & astuces / Re : Comptage des essieux
« le: mai 13, 2024, 11:02:37 am »
@Jeje_12_34

Oui c’est une réponse intéressante. Néanmoins, il faut équiper chaque canton avec cette technique, ce qui est aussi assez lourd.

J’ai un article en cours qui va bientôt faire un petit tour d’horizon sur la pose de résistance sur des essieux. Ce n’est pas très fastidieux, même en N. Il n’est pas nécessaire d’équiper tous les wagons, seulement ceux qui peuvent se situer en fin de convoi.

Christophe

5
Trucs & astuces / Re : Comptage des essieux
« le: mai 13, 2024, 10:41:34 am »
Effectivement, c’est déjà minuscule pour le HO donc en N cela sera très difficile voire impossible.

J’ai un peu cherché mais je n’ai pas vu d’autres sources donc pas de version texte.

Il faut aussi regarder ses autres vidéos, il y a d’autres solutions proposées qui elles sont peut-être adaptables pour d’autres échelles.

J’ai noté qu’il détectait le sens de roulage selon que l’un ou l’autre des capteurs des activé en premier et qu’il décrémente le comptage si roulage en sens inverse.

Je profite pour reposer la question de savoir quels avantages particuliers y a-t-il à compter les essieux que les autres techniques de détection ne permettraient pas ?

Christophe

6
Trucs & astuces / Comptage des essieux
« le: mai 12, 2024, 06:25:15 pm »
J'ouvre ce nouveau fil sur ce sujet qui a été lancé ailleurs par Brunotoutsimple mais qui mérite à mon avis d'être plus mis en avant et en lumière.

Je rappelle ici le lien sur la vidéo :



Il faut également regarder les autres vidéos de ce youtubeur elles aussi intéressantes et parfois complémentaires à la première.

La technique qui est proposée est certainement délicate mais réalisable par un modéliste aguerrit. De ce que j’en vois, c’est que la détection est parfaite et rapide.

Personnellement je ne vois pas pourquoi la technique du comptage des essieux, plus complexe, serait plus satisfaisante que la technique par détection de consommation de courant avec des wagons équipés de résistances ! Mais il ne s’agit pas d’une critique, juste de l’ignorance de ma part.

Au-delà de faire connaitre cette technique, ce fil aura le mérite de discuter de ce point et je l’espère, d’apporter des éclairages.

N’hésitez donc pas à faire par de vos expériences et commentaires.

Et merci à Bruno (Brunotoutsimple) pour cette très belle trouvaille.

Christophe

7
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

8
Vos projets / Re : Re : centrale DCC / analogique modulaire
« le: mai 03, 2024, 08:24:51 am »
Bonjour.

Assemblage PCB:

Juste pour vous informer que je  viens de faire une simulation pour un double face et les prix ont fortement augmenté chez JLCPCB.
Pour ma part, je ne ferai plus que des simples faces....
Alors pour un quatre couches……

Bonjour,

Ce n'est pas exactement le cout de transport qui a augmenté mais les taxes incluses dans ce cout "apparent". C'est vrai comme le dit Laurent que le format 100 x 100 (ou moins) reste canon chez JLCPCB.

Il faut profiter de l'offre qui est faite pour la première commande (qui se renouvelle au moins tous les jours) pour le pack 5 exemplaires. Résultat, si j'ai besoin de 20 cartes, je commande 4 fois 5 cartes !!! C'est stupide, je sais, mais beaucoup moins cher (pas pour la planète). De l'ordre de 0,88 cts € la carte.

@lebelge : je ne comprends pas, un double face n'est pas plus cher qu'un simple face ! Ce n'est jamais qu'un PCB avec des piste recto-verso. Sauf peut-être si tu fais monter les composants.

Christophe

9
Vos projets / Re : Re : RailCom: Générateur de CutOut
« le: avril 30, 2024, 04:32:55 pm »
@Christophe, l'adaptation pour le 328P ne devrait elle pas plutôt avoir PD2 comme entrée (INT0) pour le signal DCC ? et passer les broches de pilotage sur le PORTB ? ( PB2 ne gère pas des interruptions externes me semble t il?)

Eheuuuu, excuse moi Laurent mais je ne vois pas du tout de quoi tu parles ! Je ne crois pas que l'on ait parler de 328 ici. Ce qui est amusant c'est l'ATTiny. Je trouve ce petit montage simple et ludique, c'est tout

10
Vos projets / Re : RailCom: Générateur de CutOut
« le: avril 30, 2024, 04:25:54 pm »
Super ce petit montage. Oui ce serait sympa d'avoir les Gerber !

Est-ce que tu ne peux pas en profiter pour exposer les pins nécessaires à sa programmation ?

Merci par avance

Christophe

11
Vos projets / Re : RailCom: Générateur de CutOut
« le: avril 30, 2024, 08:27:17 am »
@lebelge : Effectivement, avec cette modification ça fonctionne avec un ATTiny45 à 8Mhz.

Sur 3 locos testées, j'en ai juste une qui, à l'arret, ne se laisse pas lire 1/3 du temps environ. Bon ça veut dire que les 2/3 du temps, ça fonctionne. En roulage, la lecture est bonne. C'est un décodeur LENZ.

Les deux autres locos, ESU et Zimo envoient sans problème leur adresse en roulage et à l'arrêt.

Du coup, je publie le code ci-dessous dans lequel j'ai ajouté les modifications et le brochage sur l'ATTiny45.

J'ai ajouté un #define pour que le code soit compatible avec les autres versions d'µC. #define ATTiny45
   Cablage :

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

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

/*
   Modifié 30/04/24 par christophe bobille

   Adapté pour ATTiny45 à 8Mhz (#define ATTiny45 ligne 27)
   DCC-Ex sur Arduino MEGA / booster LN298

   Cablage :

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

*/

#define ATTiny45

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 PB2                               // Entrée trames Dcc sans CutOut
#define PinOut1 PB3                             // Sortie trames DCC avec CutOut           (LMD18200: Dir (sans CutOut))
#define PinOut2 PB4                             // 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
#ifdef ATTiny45
  TCNT1 = 102;                 // preload the timer for ATTiny45 (8 Mhz)
#else
  TCNT1 = 112;                 // preload the timer
#endif
  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) {
#ifdef ATTiny45
    TCCR1 |= 3;                                     // Start Timer 1
#else
    TCCR1 |= 4;                                     // Start Timer 1
#endif
#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
  #ifdef ATTiny45
  TCNT1 = 102;                 // preload the timer for ATTiny45 (8 Mhz)
#else
  TCNT1 = 112;                                   // preload the timer.  Fr. 16,5Mhz
#endif
#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
  }
}


12
Vos projets / Re : Re : RailCom: Générateur de CutOut
« le: avril 29, 2024, 08:59:32 am »
Bonjour à tous,

Retour d’expérience :

Avec l’Arduino Nano comme dit dans mes précédents messages, lecture parfaite des adresses de locomotives.

Configuration : Centrale DCC-Ex sur MEGA – Montage « leBelge » sur Nano – L298N

Malgré tout, de nombreuses trames sont hors des normes NMRA, 1/3 environ mais ça fonctionne. Voir copie d'écran en PJ.

Avec l’ATTiny45, je n’ai aucun résultat ! Les décodeurs refusent d’envoyer leur adresse. J’ai modifié les délais comme suggéré par lebelge mais les locos ne se laissent plus piloter ou refusent de bouger !!!

j’ai ajusté les tempos.
Dans la void CutOut()
Remplacer le delayMicroseconds(38) par 36 et le delayMicroseconds(20)  par 24

J’ai essayé d’autres valeurs mais cela ne change rien.

Je ne pense pas avoir de problème de câblage (lebelge ne m’a pas répondu sur ce point)

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

J’ai réglé l’horloge à 8Mhz (internal), c'est normalement cela non ?

Quelqu’un a une idée du problème, ou mieux, de la solution ?

Christophe

13
Discussions ouvertes / Re : La Cockerill au travail
« le: avril 29, 2024, 08:43:23 am »
Oui c'est vraiment du beau travail. Est-ce que tu partageras le moyen de réaliser cette grue ?

14
Vos projets / Re : RailCom: Générateur de CutOut
« 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

15
Vos projets / Re : Re : RailCom: Générateur de CutOut
« 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

Pages: [1] 2 3 ... 60