Après avoir présenté le fonctionnement général de GTRC, je vais vous présenter la fabrication de la télécommande.

La télécommande GTRC reprend le matériel développé pour la deuxième version de TT2J. L’objectif lors du développement de GTRC était justement de pouvoir faire évoluer profondément le logiciel sans avoir à reconstruire la télécommande.

Elle est construite autour d’un Arduino Uno, d’un module radio NRF24L01, d’un écran OLED 1,3″, d’un potentiomètre de commande et d’un sélecteur rotatif à 12 positions.

Dans cet article, je vais détailler le câblage de chacun de ces éléments. Je présenterais aussi le boitier fabriqué qui est celui de la version TT2J déjà détaillé dans un autre article. Je n’aborderais pas ici la partie logiciel, configuration et utilisation de la télécommande qui feront l’objet d’autres articles.


Voici une liste des pièces nécessaires pour la réalisation de la télécommande avec des images pour illustrer et des liens vers les pièces que j’ai achetées. Si vous prenez exactement les mêmes pièces alors le boitier imprimé en 3D sera adapté sans modification.

1 Arduino Uno
1 module NRF24L01
1 écran OLED
1 sélecteur rotatif 12 positions
1 potentiomètre 10k
4 boutons poussoirs colorés à contact momentané
1 interrupteur ON/OFF
1 support double pour batterie 18650
2 batteries 18650 (récupérées dans des vieux appareils ou trouvées d’occasion sur internet)
1 lot de résistances diverses (voir les valeurs nécessaires dans la suite de l’article)
1 lot de condensateurs divers
divers fils de couleurs

Il faut aussi avoir les outils de base pour faire un peu d’électronique simple : pince coupante, pince à dénuder ou cutter, fer à souder, gaine thermo ou scotch d’électricien, pistolet à colle chaude.

Pour le boitier je possède une imprimante 3D donc je l’ai dessiné et imprimé en PLA.


La télécommande comporte :

  • un potentiomètre pour la vitesse et le sens de marche ;
  • un sélecteur rotatif 12 positions pour choisir directement une locomotive ;
  • un bouton d’arrêt d’urgence ARU ;
  • un bouton LIGHT pour l’éclairage et certaines fonctions complémentaires ;
  • deux boutons supplémentaires réservés aux futures évolutions ;
  • un écran OLED affichant l’état du système ;
  • un interrupteur général ON/OFF.

Le tableau suivant résume les principales connexions avec l’Arduino Uno :

ÉlémentConnexion Arduino
Sélecteur 12 positionsA0
Potentiomètre de conduiteA1
Mesure batterie télécommandeA2
Bouton ARUD2
Bouton LIGHTD3
OLED SDAA4
OLED SCLA5
NRF24L01 CED9
NRF24L01 CSND10
NRF24L01 MOSID11
NRF24L01 MISOD12
NRF24L01 SCKD13

Le potentiomètre constitue la commande principale de la locomotive.

Son curseur est connecté à l’entrée analogique : A1

Les trois bornes sont raccordées de la manière suivante :

+5 V Arduino ───── borne extérieure
                         │
                    potentiomètre
                         │
A1 Arduino ───────── curseur
                         │
                    potentiomètre
                         │
GND Arduino ────── borne extérieure

L’Arduino mesure ainsi la position du potentiomètre.

La position centrale correspond à l’arrêt de la locomotive. En tournant le potentiomètre d’un côté, la locomotive avance ; en le tournant de l’autre côté, elle recule.

Une petite zone morte autour du point central est prévue dans le logiciel afin d’éviter qu’une légère imprécision mécanique du potentiomètre ne fasse démarrer la locomotive alors que la commande est placée au neutre.

Dans la configuration actuelle, cette zone morte est définie par :

const int DEAD_ZONE = 40;

Il n’est normalement pas nécessaire de modifier cette valeur lors de la construction.

Si le sens de rotation du potentiomètre ne correspond pas au sens souhaité, il suffit d’intervertir les connexions +5 V et GND de ses deux bornes extérieures.


Le bouton d’arrêt d’urgence est un bouton à contact momentané, il est connecté à la broche : D2

Le câblage est simplement :

D2 ───── bouton ARU ───── GND

Le programme utilise la résistance de rappel interne de l’Arduino. Il n’est donc pas nécessaire d’ajouter de résistance externe.

Lorsque le bouton n’est pas appuyé, l’entrée est maintenue à l’état HIGH. Lorsqu’il est appuyé, la broche D2 est reliée à la masse et passe à LOW.

Dans GTRC, cette commande est prioritaire : l’activation de l’ARU provoque l’envoi d’une commande d’arrêt général à toutes les locomotives du réseau.

Il est donc préférable d’utiliser un bouton facilement identifiable et rapidement accessible. J’ai dans mon cas pris un bouton avec un capuchon rouge


Le bouton LIGHT est un bouton à contact momentané et est connecté à la broche : D3

Son câblage est identique à celui de l’ARU :

D3 ───── bouton LIGHT ───── GND

Là encore, aucune résistance externe n’est nécessaire.

Ce bouton possède plusieurs fonctions selon le mode utilisé.

En conduite normale :

  • un appui court commande l’éclairage de la locomotive sélectionnée ;
  • un appui long permet d’activer la fonction MEM.

La durée définissant un appui long est actuellement réglée à :

const uint16_t MEM_LONG_PRESS_TIME = 1500;

soit 1,5 seconde.

Le même bouton est également utilisé dans le mode diagnostic.

Cette organisation permet de conserver une télécommande simple, avec peu de boutons, tout en donnant accès à plusieurs fonctions. J’ai utilisé un bouton jaune.


Deux emplacements supplémentaires ont été prévus sur la télécommande pour de futures fonctions.

Dans la version GTRC actuelle, ils ne sont volontairement pas encore affectés dans le logiciel :

// const uint8_t PIN_F1 = ?;
// const uint8_t PIN_F2 = ?;

Il n’est donc pas nécessaire de les câbler pour utiliser toutes les fonctions actuellement disponibles dans GTRC.

Ils pourront servir ultérieurement, par exemple pour des commandes d’accessoires, de sonorisation ou d’autres fonctions propres aux locomotives.

Prévoir leur emplacement lors de la fabrication du boîtier peut néanmoins être intéressant afin d’éviter d’avoir à le modifier plus tard.

Ils seront relié à l’arduino sur le même principe que les 2 précédents boutons momentanés.


Le sélecteur rotatif constitue l’une des particularités de la télécommande.

Je souhaitais pouvoir passer immédiatement d’une locomotive à une autre sans naviguer dans des menus comme cela était je cas de la première version de la télécommande TT2J.

Un sélecteur à 12 positions permet donc de commander jusqu’à 12 locomotives.

Il aurait cependant fallu utiliser 12 entrées numériques de l’Arduino pour connaître directement sa position. Cela aurait utilisé beaucoup trop de broches.

La solution retenue consiste à utiliser une seule entrée analogique : A0.

Chaque position du commutateur est associée à une résistance différente. Le réseau de résistances produit donc une tension différente pour chacune des 12 positions en utilisant le principe du pont diviseur de tension.

Le logiciel mesure cette tension sur A0 et détermine automatiquement la locomotive sélectionnée.

Câblage du sélecteur

Le point commun du commutateur est connecté au +5 V.

Chacune des 12 sorties traverse ensuite une résistance différente.

Toutes les résistances se rejoignent sur un point commun connecté :

  • à l’entrée A0 de l’Arduino ;
  • à une résistance commune Rc de 10 kΩ reliée à la masse.

Le principe est donc :

                         +5 V
                           │
                  commun sélecteur
                           │
            ┌──────────────┼──────────────┐
            │              │              │
        Position 1     Position 2      ...
            │              │
          470 kΩ          82 kΩ
            │              │
            └──────────────┴─────── A0
                                   │
                                  10 kΩ
                                   │
                                  GND

Les valeurs des résistances utilisées sont calculées grâce à la formule ci dessous et résumées dans le tableau :

  • Vin = 5v
  • Rc = 10k
  • Ri = résistance choisie à la position donnée, par exemple 470k

PositionRésistanceTension de référenceLOCO_ID par défaut
1470 kΩ0,10 V10
282 kΩ0,54 V11
339 kΩ1,02 V12
422 kΩ1,47 V13
515 kΩ1,92 V14
612 kΩ2,27 V15
78,2 kΩ2,75 V16
85,6 kΩ3,21 V17
93,9 kΩ3,60 V18
102,2 kΩ4,03 V19
111,2 kΩ4,46 V20
12220 Ω4,89 V21

Il est important de respecter l’ordre des résistances lors du câblage.

Le logiciel ne recherche pas une tension parfaitement exacte : il recherche la tension de référence la plus proche. Les petites différences dues aux tolérances des résistances ou à la tension réelle de l’Arduino ne posent donc normalement pas de problème.

Si vous changez les valeurs des résistances il faudra refaire le calcul des tensions adaptées et modifier le programme en conséquence.


La télécommande utilise un écran OLED SH1106 128 × 64 pixels communiquant avec l’Arduino par le bus I2C.

L’utilisation de l’I2C est intéressante car seulement deux lignes de communication sont nécessaires.

Sur l’Arduino Uno :

OLED SDA ───── A4 Arduino
OLED SCL ───── A5 Arduino
OLED GND ───── GND Arduino
OLED VCC ───── alimentation

L’écran n’est pas indispensable pour conduire la locomotive : les principales commandes restent physiques.

Il apporte cependant de nombreuses informations utiles, notamment :

  • le nom de la locomotive sélectionnée ;
  • la vitesse demandée ;
  • le sens de marche ;
  • l’état de l’éclairage ;
  • l’état de l’arrêt d’urgence ;
  • l’état du mode MEM ;
  • les informations du mode diagnostic ;
  • l’état de la batterie de la télécommande.

Cette organisation permet de continuer à piloter le train sans avoir à naviguer dans des menus sur l’écran.


La communication avec les locomotives est assurée par un module NRF24L01.

Les deux broches spécifiques utilisées par GTRC sont définies dans Config.h :

const uint8_t PIN_NRF_CE  = 9;
const uint8_t PIN_NRF_CSN = 10;

Le câblage complet sur Arduino Uno est donc :

NRF24L01Arduino Uno
VCC3,3 V
GNDGND
CED9
CSND10
MOSID11
MISOD12
SCKD13
IRQnon utilisé

Le NRF24L01 doit impérativement être alimenté en 3,3 V et non en 5 V.

Le logiciel GTRC utilise actuellement le canal radio :

const uint8_t RADIO_CHANNEL = 100;

Ce réglage n’a aucune conséquence sur le câblage, mais il doit être identique dans la télécommande et dans tous les récepteurs.

L’adresse physique commune du réseau est également définie dans le logiciel. L’utilisateur n’a normalement pas besoin de la modifier.

Un condensateur de découplage de 10µF est connecté entre les bornes VCC et GND du NRF24L01 afin d’améliorer la stabilité de son alimentation. Il faut connecter la ligne de sortie courte du condensateur (cathode) sur la borne GND.


La télécommande est alimentée par deux accumulateurs 18650.

Un interrupteur général permet de couper complètement son alimentation lorsqu’elle n’est pas utilisée. Les 2 batteries 18650 délivrent une tension de 7,2v il faut donc les connecter au Vin et non au 5v au risque d’endommager l’Arduino.

La tension de la batterie est mesurée par l’entrée : A2

Les valeurs du pont diviseur utilisées par le programme sont :

const float BATTERY_R1 = 4700.0;
const float BATTERY_R2 = 6800.0;

soit :

  • R1 = 4,7 kΩ ;
  • R2 = 6,8 kΩ.

Le câblage doit respecter l’ordre suivant :

Batterie + ───── R1 4,7 kΩ ─────┬───── A2
                                │
                              R2 6,8 kΩ
                                │
                               GND

La masse de la batterie et celle de l’Arduino doivent naturellement être communes.

Le logiciel peut alors recalculer la tension réelle de la batterie à partir de la tension mesurée sur A2.

Les batteries étant dans la partie inférieure de la télécommande avec le bouton ON/OFF, j’ai utilisé des petits connecteurs pour relier cette partie à la partie comprenant tout le reste de l’électronique. Les connecteurs femelles sont coté batterie afin de réduire les risques de court-circuit quand on ouvre la télécommande.

Il faut bien sûr relier toutes les masses GND ensemble, et tous les 5V ensemble.


Avant la première mise sous tension, il est utile de contrôler une dernière fois toutes les connexions.

FonctionArduino Uno
Sélection locomotiveA0
Potentiomètre vitesse/directionA1
Mesure batterieA2
OLED SDAA4
OLED SCLA5
ARUD2
LIGHTD3
NRF24L01 CED9
NRF24L01 CSND10
NRF24L01 MOSID11
NRF24L01 MISOD12
NRF24L01 SCKD13
NRF24L01 alimentation3,3 V
Boutons F1/F2réservés, non définis actuellement
Masse communeGND
  1. l’absence de court-circuit entre les alimentations et la masse ;
  2. la présence du 3,3 V destiné au NRF24L01 ;
  3. le câblage des boutons ARU et LIGHT vers la masse ;
  4. les valeurs des résistances du sélecteur ;
  5. le câblage du potentiomètre ;
  6. la polarité de l’écran OLED ;
  7. le pont diviseur de mesure de batterie.

Une fois ces vérifications effectuées, la partie électronique de la télécommande est terminée.


Comme indiqué au début de l’article la télécommande étant la même que physiquement que ma télécommande TT2J je remets ici le lien vers les fichiers pour pouvoir imprimer un boitier adapté au matériel que j’ai utilisé et qui est listé plus haut. Libre à vous d’adapter le boitier.

https://www.thingiverse.com/thing:7146003


Il restera alors à installer le logiciel GTRC dans l’Arduino et à personnaliser les noms et identifiants des locomotives. Ces opérations feront l’objet d’autres articles consacrés à la configuration et au téléversement du logiciel.