Page 1 sur 2

Un décodeur DCC, mais c'est très simple !

Posté : 09 févr. 2026, 15:08
par herwat
Bonjour à tous .

Dans ce sujet, mon but n’est pas de faire un tuto , mais de monter mon cheminement dans la découverte du monde DCC .

Tout d’abord, comme beaucoup, j’utilise depuis plus d’une décennie une centrale DCC pour alimenter mon réseau en digital et je suis tout content de pouvoir faire manœuvrer mes loco sans très bien savoir ce que cache ce sigle DCC , Je sais simplement que si je veux que mes loco ou aiguillages répondent à mes ordres, ils doivent être munis d’un décodeur ,

ça y est, le mot est lâché !

Bon, j’ai longtemps renâclé à étudier le DCC et ses décodeurs, mais pour les besoins de l’APT de Patrice et surtout quand je me suis rendu compte que l’on pouvait faire un décodeur simplement avec un arduino, j’ai changé d’avis . . .
Mais tout d'abord, c'est-ce que le DCC ?
J'ai trouvais pas mal de réponse sur ce site par ailleurs très intéressant .
J'avoue ne pas avoir encore tout lu , mais je commence à comprendre l'essentiel même s'il me reste pas mal de zones d'ombre . :siffle:
Par ailleurs, j'ai compris que lorsqu'on donne un ordre à la centrale, celle-ci envoie un paquet de trames pendant un court instant, histoire d'être sûre que le décodeur visé ait bien compris ce qu'on lui demande , puis passe à autre chose ! et le décodeur garde l'ordre en mémoire jusqu'il en reçoive un autre .
Ainsi, si un décodeur d'aiguillage reçoit l'ordre "dévié" un court instant, il restera dévié jusqu'à ce qu'il reçoive l'ordre "droit" .
Si une loco reçoit l'ordre d'allumer ses phares, les phares resteront allumés jusqu'à reçoive l'ordre de les éteindre . Etc Etc . . .

Bon, on va pouvoir attaquer la construction d'un décodeur .
Mais pour le moment, on va en rester là !
Donc, :a_suivre:

Re: Un décodeur DCC, mais c'est très simple !

Posté : 09 févr. 2026, 16:32
par ramasoft
Un nouveau sujet qui s'annonce passionnant. :cooooool:
C'est vrai que je regarde aussi ça un peu de loin et l'idée de faire mes propres décodeurs ne m'a jamais effleuré ...
L'Arduino, ça va pour contrôler un ascenseur, et jusqu'à présent je faisais tous mes automatismes en logique câblée avec quelques composants à 2 balles et ça me suffisait largement.
Mais avec tous ces sujets ça pourrait changer.
Donc j'attends la suite avec impatience.

Re: Un décodeur DCC, mais c'est très simple !

Posté : 09 févr. 2026, 16:40
par Georges de Villette
.
Merci Hervé de partager ce que tu as appris !!!!!
Je vais essayer de suivre tes cours !!!
.
:bienv: :bienv: :bienv: :bienv: :bienv:

Re: Un décodeur DCC, mais c'est très simple !

Posté : 09 févr. 2026, 16:50
par Bud_fr
Ah !!! Intéressant, je m'abonne. Image

A+

Re: Un décodeur DCC, mais c'est très simple !

Posté : 09 févr. 2026, 18:02
par bunny94
Alors moi je lirai toutes tes parutions Hervé, même si je n'y comprendrai sûrement pas grand chose. :gratte:

Re: Un décodeur DCC, mais c'est très simple !

Posté : 09 févr. 2026, 18:12
par likiki
Moi je m'assois juste devant (pour bien entendre les paroles d'Hervé).

Re: Un décodeur DCC, mais c'est très simple !

Posté : 09 févr. 2026, 18:25
par Amigorl
:bienv:
Bon sujet.

J'essaierai d'alimenter, plutôt au moment où je passerai de la bibliothèque Minabay à la Dccnmra pour mieux gérer les CV.

Pour l'instant je suis sur autre chose mais je partagerai mes travaux dès que possible.

:a_suivre:

Re: Un décodeur DCC, mais c'est très simple !

Posté : 09 févr. 2026, 19:41
par patrice_b
Merci Hervé, merci Remy. :merciiii:

voila qui nous promet de saines lectures

:yess: :yess:

Re: Un décodeur DCC, mais c'est très simple !

Posté : 09 févr. 2026, 19:52
par ramasoft
:PetitPoucejpg:

Re: Un décodeur DCC, mais c'est très simple !

Posté : 12 févr. 2026, 16:00
par herwat
:merciiii: :merciiii: :merciiii: Mais vous me mettez la pression, là
Et ça va va pas du tout, ça ! :hhhaaaa: :hhhaaaa: :hhhaaaa:
Mais comme je l'ai déjà dit, je découvre et je me borne donc à un décodeur simple . Pour le compliqué, je passe la main . . . :siffle:
D'ailleurs, je reprend ici ce que j'avais fait de façon un peu décousue pour l'automatisation de l'APT de Patrice .
Fermons la parenthèse .
Dans ce qui suit, je me suis fortement inspiré d'un tuto du club de modélisme de Rouen : ici

Nous avons donc, d'un côté une alimentation DCC qui est en fait un courant alternatif à fréquence plus ou moins variable et de l'autre, un Arduino qui ne demande qu'à analyser tout ça ! Problème : les deux sont électriquement totalement incompatibles .
Le remède, faire une liaison optique au moyen d'un opto-coupleur . Le choix le plus couramment retenu est le 6 N 137 .

Et le montage que l'on retrouve partout est le suivant :
.
decodeur-dcc-cablage_opto-coupleur.png
.
Et pour faire mes premiers essais j'ai fait un montage dont voici le schéma :
.
Décodeur DCC.png
.
Ce qui donne ça :
.
20260212_141555.jpg
.
Bon ! ben voilà, y a pu qu'à charger le programme . Facile . . . :siffle:

:a_suivre:

Re: Un décodeur DCC, mais c'est très simple !

Posté : 12 févr. 2026, 16:51
par ramasoft
Très intéressant tout ça. :cooooool:

Re: Un décodeur DCC, mais c'est très simple !

Posté : 12 févr. 2026, 16:54
par likiki
Le fil bleu sur la borne bleu, le fil vert sur la borne verte. :gratte: :gratte: :gratte: :gratte: :gratte:

Re: Un décodeur DCC, mais c'est très simple !

Posté : 12 févr. 2026, 17:14
par herwat
Bon, la promenade avec Chienchien étant faite, je reprends . . . :siffle:

Facile, facile, pas si facile que ça d'analyser les trames !
Heureusement, apparemment je ne suis pas le premier à m'intéresser à la chose et d'autres se sont penchés sur la question et il existe plusieurs bibliothèques qui font ça très bien .
Comme je vais utiliser le programme du club de Rouen , la bibliothèque retenue est " DCC_Decoder " . Cette bibliothèque n'est pas dans l'IDE arduino . Il faut donc la télécharger ou, pour les flemmards, la voici :
.
DCC_Decoder-master.zip

.
Cette bibliothèque utilise les interruptions .
INTERRUPT 0 impose de relier le montage à la pinoche D2 de l'arduino
INTERRUPT 1 imposerait D3 .

Ceci dit, voici le programme que j'ai utilisé, c'est quasiment un copier-coller de celui du club de Rouen auquel j'ai apporté quelques modifs .

Code : Tout sélectionner

             /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
              * * * * *                                                 * * * * *
              * * * * *             Décodeur d'accessoires              * * * * *
              * * * * *                                                 * * * * *
              * * * * *                 Vu sur le site :                * * * * *
              * * * * *       Seine Modèle Club Ferroviaire - SMCF      * * * * *
              * * * * *   https://www.modelisme-ferroviaire-rouen.fr/   * * * * *
              * * * * *                                                 * * * * *
              * * * * *                    version ROCO                 * * * * *
              * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

// Utilisation de la librairie DCC Decoder pour lire les trames DCC
#include "DCC_Decoder.h"
#define DCC_INTERRUPT  0
// Adresse de base du Arduino-Decodeur
#define baseAdresse 100  

// Déclaration des éléments par rapport aux broches de l'Arduino
// La LED1  est connectée à la broche 6
// La LED2  est connectée à la broche 7
// La LED3  est connectée à la broche 8
// La LED4  est connectée à la broche 9
const int Led_1 = 6;
const int Led_2 = 7;
const int Led_3 = 8;
const int Led_4 = 9;

// Cette fonction est appelée par la librairie pour 
// chaque activer / désactiver au niveau des adresses
void BasicAccDecoderPacket_Handler(int address, boolean activate, byte data) {
  address -= 1;
  address *= 4;
  address += 1;
  address += (data & 0x06) >> 1;
  address = address + 4; // cette ligne devra être décommentée
                           //  si centrale RocoMouse et/ou z21

  boolean enable = (data & 0x01) ? 1 : 0;
  Serial.print(F(" Adresse DCC Claire : "));
  Serial.print(address);
  Serial.print(" Enable : ");
  Serial.print(enable);
  Serial.print(" Activate : ");
  Serial.println(activate);

  // Ex: si l'adresse de base est 100 
  // alors l'arduino réagit aux adresse 100, 101, 102,...
  // Si l'adresse accessoire envoyée par la centrale
  // correspond à l'une de notre programme
  // Alors on récupère son état (activé/désactivé)
  // et on exécute en conséquence les actions 
  // Ici la gestion de l'alimentation de 4 LEDs.
  switch (address) {
  
    case (baseAdresse): 
      if (enable) {
        digitalWrite(Led_1, LOW);
        digitalWrite(Led_2, HIGH);
      } else {
        digitalWrite(Led_1, HIGH);
        digitalWrite(Led_2, LOW);
      } 
      break;

    case (baseAdresse + 1):

if (enable) {
        digitalWrite(Led_3, LOW);
        digitalWrite(Led_4, HIGH);
      } else {
        digitalWrite(Led_3, HIGH);
        digitalWrite(Led_4, LOW);
      } 
      break;
/* Et ainsi de suite
    case (baseAdresse + 2):
     
      break;
*/
  }

}


void setup() {
  Serial.begin(9600);
  // Broche des LEDs en mode "Sortie"
  pinMode(Led_1, OUTPUT);
  pinMode(Led_2, OUTPUT);
  pinMode(Led_3, OUTPUT);
  pinMode(Led_4, OUTPUT);
  
  // Init les Voyants, par défaut Rouge actif
  digitalWrite(Led_1, HIGH);
  digitalWrite(Led_2, LOW);
  digitalWrite(Led_3, LOW);
  digitalWrite(Led_4, LOW);

  // Les 2 lignes suivantes permettent d'initialiser la librairie DCC Decoder
  DCC.SetBasicAccessoryDecoderPacketHandler(BasicAccDecoderPacket_Handler, true);
  DCC.SetupDecoder( 0x00, 0x00, DCC_INTERRUPT );  //  DCC_INTERRUPT
}


void loop() {

  // Appel de la librairie DCC pour lire les valeurs
  DCC.loop();
}
La ligne : address = address + 4; à été décommentée car j'utilise une z21 pour mes essais .
ATTENTION, il y a une erreur sur l'originale : ils ont mis -4 au lieu de +4 .

Autre modif, sur les conseils de Rémy , j'ai ajouté ces lignes

Serial.print(F(" Adresse DCC Claire : "));
Serial.print(address);
Serial.print(" Enable : ");
Serial.print(enable);
Serial.print(" Activate : ");
Serial.println(activate);

Ce qui va permettre de visualiser sur l'écran série de l'IDE si tout se passe bien .

Le programme ètant chargé et la platine raccordée à la centale DCC, voilà ce que ça donne :



Et sur le moniteur série :
.
20260212_150801.jpg
.
Voilà, premiers essais concluents
:a_suivre:

Re: Un décodeur DCC, mais c'est très simple !

Posté : 12 févr. 2026, 17:28
par patrice_b
:bienv: :bienv:

Re: Un décodeur DCC, mais c'est très simple !

Posté : 12 févr. 2026, 17:35
par Bud_fr
herwat a écrit : 12 févr. 2026, 16:00 :merciiii: :merciiii: :merciiii: Mais vous me mettez la pression, là
M'sieur, M'sieur, j'ai fini M'sieur .... :yess: :yess: :yess:

Espion trame.jpg
:mdr:

PS: Je viens de le monter comme Espion de Trame DCC, je ne savais pas à quoi ça allait me servir, maintenant je sais .....

:a_suivre:

Re: Un décodeur DCC, mais c'est très simple !

Posté : 12 févr. 2026, 17:39
par Georges de Villette
.
:gratte: :gratte: :gratte: :gratte: :siffle: :siffle: :siffle: :siffle: :siffle:
.

Re: Un décodeur DCC, mais c'est très simple !

Posté : 12 févr. 2026, 17:47
par Lherve54
Bonjour


Je vais suivre tout cela , juste pour m'informer !!

Tu vas pouvoir en produire en série , après l'ascenseur ,le décodeur accessoires ,.....

Re: Un décodeur DCC, mais c'est très simple !

Posté : 12 févr. 2026, 17:58
par C2Vues-BricoTrain
:bienv: :bienv: :bienv: :bienv:

Hervé,

Si tu veux commander l'ouverture ou la fermeture en un éclair, et sans pression, mets autre chose que des boutons (pression) !
(Dicton de couturière :mdr3: )

:hhhaaaa: :hhhaaaa: :hhhaaaa: :hhhaaaa: :hhhaaaa: :hhhaaaa:

Re: Un décodeur DCC, mais c'est très simple !

Posté : 12 févr. 2026, 18:51
par Bud_fr
:gratte: :gratte: :gratte: :gratte:

Oups !!!! J'ai un doute ...... Dans le schéma ci dessus ...
Décodeur DCC.png
Les résistances des Leds rouge ont un marquage de 3 bandes rouges, ce qui donne 2,2 Kohms, c'est pas beaucoup ça ????

Ce serait pas plutôt des 220 ohms qu'il faudrait ??? Rouge - rouge - marron

A suivre

Re: Un décodeur DCC, mais c'est très simple !

Posté : 12 févr. 2026, 18:58
par herwat
:hhhaaaa: :hhhaaaa: :hhhaaaa:

Non, j'ai bien mis des 2.2K , ça m'évite d'être ébloui ! ! ! :hhhaaaa: :hhhaaaa: :hhhaaaa:
Pour les essais, l'éclairement est suffisant . Mais tu peux mettre des 1.5k ou même moins si tu veux .

Re: Un décodeur DCC, mais c'est très simple !

Posté : 12 févr. 2026, 19:10
par herwat
Avec ce décodeur tout simple, on peut déjà faire des choses intéressantes .
Dans le programme, le club de Rouen a utilisé la fonction switch pour analyser les différentes adresses .
Pour essayer, je l'ai remplacé par une boucle "for" et ça marche très bien !
Dans le programme suivant, j'obtiens 4 interrupteurs indépendants ! :cooooool:

Code : Tout sélectionner

             /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
              * * * * *                                                 * * * * *
              * * * * *             Décodeur d'accessoires              * * * * *
              * * * * *                                                 * * * * *
              * * * * *                 Vu sur le site :                * * * * *
              * * * * *       Seine Modèle Club Ferroviaire - SMCF      * * * * *
              * * * * *   https://www.modelisme-ferroviaire-rouen.fr/   * * * * *
              * * * * *                                                 * * * * *
              * * * * *           Commande de 4 interrupteurs           * * * * *
              * * * * *                    version ROCO                 * * * * *
              * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

// Utilisation de la librairie DCC Decoder pour lire les trames DCC
#include "DCC_Decoder.h"
#define DCC_INTERRUPT  0
// Adresse de base du Arduino-Decodeur
#define baseAdresse 100  

// Déclaration des éléments par rapport aux broches de l'Arduino
// La LED0  est connectée à la broche 6 et correspond à l'adresse DCC  100
// La LED1  est connectée à la broche 7 et correspond à l'adresse DCC  101
// La LED2  est connectée à la broche 8 et correspond à l'adresse DCC  102
// La LED3  est connectée à la broche 9 et correspond à l'adresse DCC  103
const int PinLed [4] = {6,7,8,9} ;

int Transmis = 0 ;
int A_Transmettre ;
int Transmission ;
boolean Chx ;
int i ; int y ;    // Variables d'incrémentation


  void setup()
    {
    Serial.begin(9600);
    // Broches des LEDs en mode "Sortie"
    for (i=0 ; i <= 3 ; i++){pinMode(PinLed [i], OUTPUT);
                             digitalWrite(PinLed [i], LOW); }
    digitalWrite(PinLed [0], HIGH);
  
    // Les 2 lignes suivantes permettent d'initialiser la librairie DCC Decoder
    DCC.SetBasicAccessoryDecoderPacketHandler(BasicAccDecoderPacket_Handler, true);
    DCC.SetupDecoder( 0x00, 0x00, DCC_INTERRUPT );  //  DCC_INTERRUPT
    }


  void loop() 
    {
    // Appel de la librairie DCC pour lire les valeurs
    DCC.loop();
    }
//******************************************************************
//                      Les Fonctions
//******************************************************************

  void BasicAccDecoderPacket_Handler(int address, boolean activate, byte data)
     // Cette fonction est appelée par la librairie pour 
     // activer / désactiver au niveau de chaque adresse
    {
    address -= 1;
    address *= 4;
    address += 1;
    address += (data & 0x06) >> 1;
    address = address + 4;   // cette ligne devra être décommentée
                             //  si centrale RocoMouse et/ou z21

    boolean enable = (data & 0x01) ? 1 : 0;
    Serial.print(F(" Adresse DCC Claire : "));
    Serial.print(address);
    Serial.print(" Enable : ");
    Serial.print(enable);
    Serial.print(" Activate : ");
    Serial.println(activate);

  /* Ex: si l'adresse de base est 100 
     alors l'arduino réagit aux adresse 100, 101, 102,...
     Si l'adresse accessoire envoyée par la centrale
     correspond à l'une de notre programme
     Alors on récupère son état (activé/désactivé)
     et on exécute en conséquence les actions 
     Ici la gestion de l'alimentation de 4 LEDs. */

    Chx = false ;
    for (i=0 ; i <= 3 ; i++)
      {
      if( address == baseAdresse + i )
         {  A_Transmettre = i ; Chx = true ;
           if (enable) { digitalWrite(PinLed [i], HIGH); }
           else { digitalWrite(PinLed [i], LOW); }
         }
      }
    }
Et voilà ce que ça donne



Prochainement, j'essaierai la commande d'un servo . . .
:a_suivre:

Re: Un décodeur DCC, mais c'est très simple !

Posté : 12 févr. 2026, 19:58
par likiki
:PetitPoucejpg:


:bienv: Hervé.

Re: Un décodeur DCC, mais c'est très simple !

Posté : 12 févr. 2026, 20:02
par C2Vues-BricoTrain
:bienv: Hervé :bienv:
:PetitPoucejpg: :PetitPoucejpg: :PetitPoucejpg: :PetitPoucejpg:

Re: Un décodeur DCC, mais c'est très simple !

Posté : 14 févr. 2026, 12:25
par Bud_fr
Hop !!!!!

Ça ne marche pas chez moi :3: :gratte: Image

Résumons:

J'ai l'interface d'espionnage de trames, qui fonctionne, Pin 2, qui reçoit des trame de ma z21 Start, avec "DCC_monitor".

J'ai rajouté 4 Leds qui sont branchés sur les Pin 6,7,8,9 de l'Arduino UNO. Les Leds fonctionnement, par exemple avec Blink.

J'ai téléversé tes 2 programmes que tu fournis, option Roco, l'un puis l'autre.

Je n'ai rien qui s'affiche dans "Monitor Serie" de l'IDE.

La z21 start est branché sur un banc d'essai, avec une' loco dessus, qui fonctionne, avec ma Multimaus.

Alors, normalement, si j'ai bien compris, si je passe en position "aiguille" sur la Multimaus, que je sélectionne l'adresse 100 comme aiguille, et j'actionne l'aiguille avec les boutons Droite/Gauche de la Multimaus, une Led (la Pin 6) devrait s'allumer/s'éteindre.

Il ne se passe rien ..... Qu'est que je fait mal ????

C'est quoi cette appli avec 4 boutons qu'on voit sur le téléphone ????

Est ce qu'il y a qql'un qui a réussi dans les suiveurs de ce sujet ????

:a_suivre:

Re: Un décodeur DCC, mais c'est très simple !

Posté : 14 févr. 2026, 14:04
par herwat
Bonjour Didier,
Je n'ai pas fait d'essai avec la multimaus .
L'application que tu vois sur la vidéo est l'application de la z21 (ancienne version) .
Si ton montage fonctionne en espion, il n'y a aucune raison pour que ça ne fonctionne pas avec mes programmes . . . .

Je vais essayer avec la multimauss . Il doit y avoir un truc quelque part . . . .