Messages récents

Pages: [1] 2 3 ... 10
1
Vos projets / RailCom: Générateur de CutOut
« Dernier message par lebelge2 le Aujourd'hui à 02:26:08 pm »
Bonjour.
Certaines centrales DCC notamment les DIY ne sont pas compatibles RailCom car ne génèrent pas le CutOut.
Ce petit montage à base, seulement d’un Arduino Uno, Nano ou Micro s’insère entre la centrale et le Booster.
Il génère le CutOut  afin de la rendre compatible RailCom.
Testé sur un Booster L298N et L6203.
Si dessous, le code et le schéma.
Bien à vous.

// RailCom: Programme pour insérer un CutOut dans les trames DCC.  Arduino Uno, Nano, Micro.
// Testé avec Bridge Driver L6203 et L298N
// V.1.0.   24-04-24
// lebelge2@yahoo.fr

volatile uint8_t dccrecState;
volatile uint8_t tempByte;
#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 valu
#define PinIn1 3                             // Entrée signalDcc sans CutOut
#define PinOut1 4                            // Sortie signal DCC avec CutOut
#define PinOut2 5                            // Sortie signal DCC inversé avec CutOut

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;

void setup() {
  Serial.begin(9600);
  pinMode(PinIn1, INPUT);
  pinMode(PinOut1, OUTPUT);
  pinMode(PinOut2, OUTPUT);
  init_timer2();
  attachInterrupt(digitalPinToInterrupt(PinIn1), Dcc_Interrupt, CHANGE );
  dccIn.port = digitalPinToPort(PinIn1);
  dccIn.bit = digitalPinToBitMask(PinIn1);
  dccIn.portRegister = portInputRegister(dccIn.port);
  Serial.println ("SetUp OK");
}

void loop() {

}

void CutOut(void) {
  delayMicroseconds(8);
  asm("sbi 0x0B, 4");
  asm("sbi 0x0B, 5");
  delayMicroseconds(425);
  asm("cbi 0x0B, 4");
  asm("cbi 0x0B, 5");
}
//----------------------------------------------------------------------------------------------------------
void init_timer2(void) {
#define T2_PRESCALER   8
#define T2_PRESCALER_BITS   ((0<<CS02)|(1<<CS01)|(0<<CS00))
#define T77US (F_CPU * 77L / T2_PRESCALER / 1000000L)
#if (T77US > 254)
#warning T77US too big, use either larger prescaler or slower processor
#endif
#if (T77US < 32)
#warning T77US too small, use either smaller prescaler or faster processor
#endif
  noInterrupts();              // disable all interrupts
  TCCR2A = 0;                  // should be zero for our purpose
  TCCR2B = 0;                  // 0 => timer is stopped
  TCNT2 = 256L - T77US;        // preload the timer
  TIMSK2 |= (1 << TOIE2);      // the timer is used in overflow interrupt mode
  interrupts();                // enable all interrupts
}
//----------------------------------------------------------------------------------------
void Dcc_Interrupt() {
  if (digitalRead(PinIn1) == true) {
    asm("cbi 0x0B, 5");
    asm("sbi 0x0B, 4");
    TCCR2B |= (T2_PRESCALER_BITS);  // Start Timer 2
  }
  else {
    asm("cbi 0x0B, 4");
    asm("sbi 0x0B, 5");
  }
}
//-----------------------------------------------------------------------------------
ISR(TIMER2_OVF_vect) {
  uint8_t DccBitVal;
  DccBitVal = !(*dccIn.portRegister & dccIn.bit);
  TCCR2B = 0;                                    // 0 => timer is stopped
  TCNT2 = 256L - T77US;                          // preload the timer
  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
  }
}

2
Présentez vous ! / Re : Nouveau venu
« Dernier message par Dominique le avril 23, 2024, 09:10:39 pm »
Bonjour Alain,

Voilà un bon départ avec LaBox !

Bon courage et à vous lire bientôt.
3
Présentez vous ! / Nouveau venu
« Dernier message par MsX34 le avril 23, 2024, 08:07:47 pm »
Bonjour à tous,

A la retraite depuis quelques semaines, je vais avoir le temps de me remettre à ma passion d'ado, le modélisme ferroviaire pour l'automatisme.
Elektor avait sorti, il y a 35/40 ans, leur système "Edits", et c'est en recherchant ce que j'avais pu rater depuis ces années que je suis tombé sur Locoduino !.
Merci a tous pour le contenu et l'entraide proposé !.

J'attaque directement avec Labox et la souris Wifi, ESP32...
Je suis sur la région de Montpellier.

Alain  ;)

4
Présentez vous ! / Re : se présenter ? ok
« Dernier message par junon le avril 21, 2024, 02:16:48 am »
Désolé pour la "qualité" des images
5
Présentez vous ! / Re : se présenter ? ok
« Dernier message par junon le avril 21, 2024, 02:15:28 am »
suite "ça tourne !"
6
Présentez vous ! / Re : se présenter ? ok
« Dernier message par junon le avril 21, 2024, 02:14:32 am »
ça tourne !
démarrage progressif par Arduino
7
Présentez vous ! / Re : se présenter ? ok
« Dernier message par junon le avril 21, 2024, 02:12:44 am »
ça éclaire !
8
Présentez vous ! / Re : se présenter ? ok
« Dernier message par junon le avril 21, 2024, 02:11:21 am »
vue générale de ma planche d'essai (2m50x1m25)
9
Présentez vous ! / Re : se présenter ? ok
« Dernier message par junon le avril 21, 2024, 02:00:36 am »
Bonjour !
oui c'est un projet très important, surtout en temps
en sachant que je ne m'y consacre essentiellement que l'hiver
et je tiens à y aller progressivement, pour l'instant j'apprends, les compétences, les contraintes de ce que j'imagine vouloir réaliser
et il faut que la maquette m'occupe jusqu'à mes ... vieux jours (20 ans , + , ?...) tout en n'ayant pas qu'un truc qui ne ressemble à rien donc pour l'instant apprentissage puis ce sera réalisation par tranches

 des images ?
ci joint mon magnifique réseau [/img]
je ne parviens pas à mettre d'autres photos ?!!!!! Désolé

les composants utilisés ?
je viens de recevoir tout ce qu'il faut pour construire le projet "annonce en gare" : uno, RFID , lecteur µSD ..., il n'y a plus qu'à faire
j'ai déjà mis en œuvre le PWM avec transistor pour les variations de vitesse : marche très bien
il faut que je regarde les barrières à infra rouge , pour l'instant j'en ai + grillé que réussi à faire fonctionner !
par ailleurs j'ai réalisé et installé des roulnet (2 condo+2 diodes en tête bèche ) pour l'encrassement des rails
et le remplacement de l'éclairage d'origine de motrices par des diodes alimentées par des régulateurs de tension 3,3V
après l'annonce en gare je me lancerai dans un projet de cantonnement "réaliste" qui fonctionne quelque soit le nbre de cantons, quelque soit la longueur des trains, le projet est clair, l'algorithme est pratiquement écrit, je pense avoir toutes les compétences , restent les limites du matériel
d'ailleurs j'ai une question : peut on déverser dans une Méga un programme écrit et vérifié sur une Uno (aux adresses de pin près , bien sûr ) ?
10
Aide / Re : Dépannage CDM-Rail pour Ma première centrale DCC (1)
« Dernier message par Dominique le avril 19, 2024, 09:10:00 am »
Les questions sont à poser plus sûrement sur le site de CDMRAIL
http://cdmrail.free.fr/SiteCDR/
Pages: [1] 2 3 ... 10