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 ... 15 16 [17] 18 19 ... 76
241
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

242
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

243
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

244
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

245
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

246
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

247
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

248
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
  }
}


249
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

250
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 ?

251
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

252
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

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

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





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

Pages: 1 ... 15 16 [17] 18 19 ... 76