Dans un réseau de modélisme ferroviaire numérique, le Tableau de Contrôle Optique (TCO) reste un élément central pour commander les aiguillages, accessoires du réseau.
Même dans un réseau numérique, beaucoup de modélistes souhaitent conserver le plaisir de la manipulation physique. Avec un TCO équipé de boutons poussoirs, on retrouve le toucher des commandes, le geste naturel consistant à appuyer sur un bouton, basculer un aiguillage ou préparer un itinéraire.
Cette approche rapproche l’exploitation du réseau d’un véritable poste d’aiguillage miniature. Le numérique ne signifie pas nécessairement automatisation complète. Il permet simplement de transmettre les commandes de manière fiable et normalisée entre les différents équipements du réseau.
Le projet présenté ici consiste à réaliser un TCO connecté directement à une centrale DCC utilisant le protocole XpressNet (Roco, Lenz, Digikeijs, Viessmann ,…). Il permet de commander les appareils de voie avec des boutons poussoirs tout en restant parfaitement intégré à l’écosystème numérique du réseau.
Ce système s’appuie sur une carte Arduino MEGA et communique avec la centrale DCC via le bus XpressNet, pour créer une « souris » ne permettant de commander que des accessoires.
Sommaire
- Le principe du TCO
- Mise en œuvre avec une carte Arduino MEGA
- Simulateur en ligne avec Wokwi
- Particularité avec les centrales LENZ
- Commande d’accessoires avec une matrice de boutons
- Commande d’itinéraires
- Commande via la bibliothèque
- Paramètrage
- Fichiers Source
Le principe du TCO
Le système repose sur trois éléments principaux :
- La centrale DCC
Elle gère la circulation des trains et les accessoires numériques. - Le bus XpressNet
Ce bus permet la communication entre la centrale et les souris (périphériques). - Le TCO basé sur une carte Arduino
Il agit comme un pupitre de commande capable d’envoyer des ordres.
Lorsqu’un bouton est actionné sur le TCO :
- une commande est envoyée via le bus XpressNet ;
- la centrale DCC transmet l’ordre au décodeur d’accessoire ;
- l’aiguillage, l’accessoire est activé ou désactivé.
Exemple de TCO avec gestion d’itinéraires
Avantages du TCO avec des boutons physiques
La mise en œuvre de boutons poussoirs présente plusieurs avantages :
- une interface physique intuitive et le plaisir de toucher des boutons ;
- un système évolutif et une personnalisation complète du pupitre ;
- un coût réduit grâce à la carte Arduino ;
- une indépendance vis-à-vis d’un logiciel PC.
Le TCO peut être utilisé seul ou en complément de souris XpressNet ou autre TCO ou d’un logiciel de gestion de réseau. Le projet présenté n’intègre pas de LED : il pourra être inséré sur le TCO une rétrosignalisation en fonction de la position des aiguillages.
Mise en œuvre avec une carte Arduino MEGA
Pour recevoir et émettre des consignes sur le bus XpressNet, il faut mettre en œuvre le composant MAX485 et utiliser les bornes 3, TX1 et RX1 de la carte Arduino.

Il est prévu un switch sur la borne « A5 » pour indiquer si la souris est connectée à une centrale LENZ ou autre.
Le simulateur en ligne Wokwi permet de se rendre compte du principe de fonctionnement.
Un écran LCD connecté sur le port I2C est optionnel mais fortement recommandé pour l’utilisation de la fonction itinéraire ou la fonction par sélection d’un accessoire dans la bibliothèque.
Une carte mémoire SD est optionnelle : elle permet de mettre à jour la bibliothèque des accessoires sans avoir besoin de téléverser ou reprogrammer la carte Méga. Si elle n’est pas présente, la bibliothèque configurée par défaut dans le programme, sera utilisée.
Il est prévu un bouton « Arrêt d’Urgence ».
Il est proposé 2 boutons pour commander un accessoire par défaut : il sert surtout à vérifier le bon fonctionnement de la « souris » et est très utile en cas de recherche de dysfonctionnement. Par défaut, dans le programme Arduino, les 2 boutons sont connectées sur les bornes « A6 » et « A7 » pour commander l’accessoire N°12.
Le programme comprend 3 grandes fonctionnalités pour la commande des accessoires :
- Boutons poussoir pour commander les accessoires : une adresse DCC avec un état = 1 bouton.
Par exemple, il faut 2 boutons pour commander l’état « 0 » ou « 1 » de l’accessoire ayant l’adresse « 12 ». - Boutons poussoir pour sélectionner l’itinéraire souhaité. En appuyant sur le bouton « Validation », les commandes de un ou plusieurs accessoires sont envoyées en fonction d’un tableau de vérité configuré dans la carte Arduino.
- Boutons poussoir pour faire défiler les noms des accessoires et un bouton « Ok » pour envoyer l’ordre de commande.
Lors de la configuration, on peut activer une ou plusieurs fonctionnalités en fonction du type de TCO que l’on souhaite concevoir.
Dans le fichier « SourisXpressNet_TCO_v2.ino », on commentera ou pas les lignes en fonction de la configuration souhaitée.
Fonctionnalités activées :
#define ModeBoutons // Pour l’utilisation de la fonction de commande par boutons
#define ModeItineraire // Pour l’utilisation de la fonction de commande par itinéraire
#define ModeCarteSD // Pour l’utilisation de la fonction de commande à l’aide la bibliothèque
Fonctionnalités désactivées :
//#define ModeBoutons // Pour l’utilisation de la fonction de commande par boutons
//#define ModeItineraire // Pour l’utilisation de la fonction de commande par itinéraire
//#define ModeCarteSD // Pour l’utilisation de la fonction de commande à l’aide la bibliothèque
Le programme Arduino utilise la bibliothèque XpressNet.h, développée par Philipp Gahtow, spécifiquement pour le modélisme ferroviaire. Pour commander un accessoire, la consigne est :
XpressNet.setTrntPos ( AdresseDCC_H, AdresseDCC_L, Position ) ;
Le paramètre « Position » indique l’état : « 1 » ou « 0 ».
Les paramètres « AdresseDCC_H » et « AdresseDCC_L » concernent l’adresse de l’accessoire.
Dans le protocole DCC, les accessoires peuvent utiliser des adresses supérieures à 128. Pour gérer cette plage d’adresses plus large, le protocole découpe l’adresse en deux parties : une partie basse et une partie haute.
L’adresse basse (AdresseDCC_L) correspond aux 8 premiers bits, ce qui permet de couvrir les adresses de 1 à 128. Lorsque l’on dépasse 128, il faut utiliser un bit supplémentaire pour indiquer que l’on se trouve dans une plage d’adresses supérieure. C’est le rôle de l’adresse haute (AdresseDCC_H).
Par exemple, pour l’adresse de l’aiguillage « 45 » :
AdresseDCC_H = 0AdresseDCC_L = 45
Pour l’aiguillage « 150 » (adresse supérieure à 128)
AdresseDCC_H = 1AdresseDCC_L = 22
(150 = 128 + 22)
Simulateur en ligne avec Wokwi
Wokwi est une plateforme en ligne qui permet de simuler des circuits électroniques, notamment avec des microcontrôleurs comme Arduino, ESP32 ou Raspberry Pi Pico, directement dans le navigateur.
Pour simuler le fonctionnement du programme, la configuration retenue est de 2 boutons de test, 16 boutons poussoirs pour commander des accessoires, 8 boutons poussoirs pour gérer un itinéraire et 2 boutons poussoirs pour faire défiler la bibliothèque des accessoires.
Il ne sera pas possible de piloter les accessoires avec le simulateur en ligne !
Particularité avec les centrales LENZ
Avec les centrales Lenz (LZV100), il a été rencontré une subtilité du protocole XpressNet lors de la commande des accessoires ou des aiguillages. Contrairement à certaines centrales Roco ou Digikeijs qui acceptent une commande “simple” de position, la LZV100 considère la requête comme un ordre maintenu tant qu’elle ne reçoit pas explicitement une commande de relâchement.
Résultat : après l’envoi d’un ordre d’activation, la centrale continue de le répéter (même si la souris Arduino est débranchée), car elle n’a jamais reçu l’ordre d’arrêt.
Le programme Arduino proposé corrige ce comportement en envoyant automatiquement une séquence ON puis OFF (impulsion) : l’accessoire est actionné puis immédiatement désactivé, ce qui empêche toute répétition indésirable et rend le fonctionnement fiable avec les centrales Lenz.
Pour cela un switch est connecté sur la borne « A5 » pour indiquer si on utilise une centrale Lenz ou une autre référence mettant en œuvre le protocole XpressNet.
Commande d’accessoires avec des boutons poussoir
Le fichier « config_boutons.h » permet de configurer des boutons poussoirs.
Le projet met en œuvre un clavier ce qui permet de gérer les rebonds, la temporisation, la saisie d’un seul bouton en même temps et un gain de fils. Par exemple, 5 lignes et 4 colonnes, soit 5×4 = 20 boutons.
Le programme est limité à 100 boutons.
Cette partie permet de définir le nombre de lignes et colonnes du clavier. Le tableau permet de définir les valeurs : le dernier chiffre (0 ou 1) correspond à la position et les chiffres précédents à l’adresse de l’accessoire. Il est défini ensuite les bornes de l’Arduino où sont connectées le clavier.
const byte LIGNEBoutons = 8;
const byte COLONNEBoutons = 2;
uint16_t Valeurs[LIGNEBoutons][COLONNEBoutons];
uint16_t ValeursDefaut[LIGNEBoutons][COLONNEBoutons] =
{
{101, 111},
{210, 211},
{220, 221},
{230, 231},
{240, 241},
{310, 311},
{320, 321},
{131, 141},
};byte ligneBornesBT[LIGNEBoutons] = {23, 25, 27, 29, 31, 33, 35, 37};
byte colonneBornesBT[COLONNEBoutons] = {39, 41};
Ce code est à adapter en fonction de ses besoins et de la configuration souhaitée
Commande d’itinéraires
Le fichier « config_itineraires.h » permet de configurer la commande d’itinéraires avec des boutons poussoirs.
Cette partie permet de définir le nombre de lignes et colonnes du clavier. Il est défini ensuite les bornes de l’Arduino où sont connectées le clavier et les valeurs des boutons.
const byte ItineraireLIGNE = 4;
const byte ItineraireCOLONNE = 2;
byte ligneBornesItineraire[ItineraireLIGNE] = {26, 28, 30, 32};
byte colonneBornesItineraire[ItineraireCOLONNE] = {22, 24} ;
char BoutonsVoies[ItineraireLIGNE][ItineraireCOLONNE] =
{
{41, 21},
{42, 22},
{31, 23},
{11, 24},
};
Ce code est à adapter en fonction de ses besoins et de la configuration souhaitée
Ensuite on définit une table de vérité en saisissant toutes les possibilités pour un seul sens de parcours. Comme pour l’exemple avec le simulateur, on peut passer de la voie « V11 » à « V21 ou V22 ou V23 ou V24 ». Puis de « V24 » à « V31 ». On ne pourra pas circuler directement de la voie « V11 » à « V31 ».
int Itineraires[30][4] =
{
// Origine | Destination | Num Aiguillage | Sens (0 ou 1)
{11, 21, 101, 1},
{11, 21, 102, 1},
{11, 21, 103, 1},
…
{22, 31, 112, 0},
…
On renseigne la valeur du premier bouton, puis le second bouton saisi puis l’adresse DCC de l’accessoire et son état.
Pour l’exemple, pour passer de la voie « V11″ à V »21 », on commandera les accessoires « 101, 102 et 103 » en position « 1 ».
Pour passer de la voie « V22 » à la voie « V31 », on commandera l’accessoire « 112 » en position « 0 ».
Commande via la bibliothèque
Le fichier « config_carteSD.h » permet de configurer une bibliothèque par défaut d’accessoires que l’on va faire défiler sur l’écran LCD à l’aide de 2 boutons poussoir.
Cette partie permet de définir l’adresse de l’accessoire, son état (1 ou 0) et le libellé de l’accessoire (16 caractères au maximum).
Accessoire listeAccessoires[] =
{
{12, 1, « Accessoire test »},
{21, 1, « Annonce Gare »},
{22, 1, « Sifflet 1 ton »},
{23, 1, « Sifflet 2 tons »},
{33, 1, « Aig. Entree Gare »},
{34, 1, « Aig. Sortie Gare »},
{24, 0, « Arret des sons »}
};
La bibliothèque par défaut sera remplacée lors du lancement de la carte Arduino si une carte mémoire SD est présente et que le fichier « mesaccessoires.csv » a pu être lu.
Paramètrage
A l’aide du moniteur en ligne, on peut visualiser les paramètres enregistrés dans la carte Arduino.
$H pour afficher l’aide en ligne
$S pour afficher l’adresse I2C de l’écran LCD
$C pour afficher la configuration$R99 pour réinitialiser la carte Arduino
$U pour activer ou désactiver l’arrêt d’urgence
$Xyy pour définir l’adresse XpressNet de la souris : yy entre 1 et 29
$Axxy pour commander l’accessoire xx avec l’état y (0 ou 1)
*Bxx-yy-zz-w pour configurer un bouton du clavier avec xx pour la borne Ligne du clavier | xx pour borne colonne | zz pour l’adresse DCC | w pour l’état (0 ou 1)
Suite au scan des adresses I2C avec l’instruction « $S », la valeur obtenue est à noter dans le fichier « SourisXpressNet_TCO_v2.ino » à la ligne 23 :
#define I2C 0x27 // Adresse I2C de l’écran LCD s’il est utilisé
Ensuite, il faut compiler et téléverser de nouveau le programme modifié dans la carte Arduino.
Fichiers source
L’UAICF Nevers-Vauzelles a réalisé une carte PCB qui vient se connecter à la carte Arduino.
Le fichier ZIP comprend les plans au format PDF, les fichiers source avec le logiciel Eagle, tous les fichiers GERBER pour réaliser la platine du circuit imprimé pour réaliser une souris ou un TCO compatible avec le protocole XpressNet avec une carte Arduino MEGA.
Le programme ARDUINO proposé est à adapter en fonction de sa configuration.
