Il est difficile d’animer un réseau digital (en DCC) dans lequel peuvent évoluer plusieurs trains, avec des automatismes de conduite, sans que ceux-ci connaissent les numéros des trains.
La plupart des logiciels de pilotage demandent à l’opérateur de positionner les trains dans un état initial prédéterminé avant de démarrer. Mais la moindre désynchronisation peut aboutir à des catastrophes.
Certains systèmes adoptent la lecture d’un code-barre collé sous les locos.
Je vais présenter ici la solution basée sur la technologie RFID (radio identification).
RFID qu’est-ce que c’est ?
Selon Wikipedia, la radio-identification, le plus souvent désignée par le sigle RFID (de l’anglais radio frequency identification), est une méthode pour mémoriser et récupérer des données à distance en utilisant des marqueurs appelés « radio-étiquettes » (« RFID tag » ou « RFID transponder » en anglais).
Un système de radio-identification activé par un transfert d’énergie par onde électromagnétique se compose de marqueurs, nommés radio-étiquettes ou transpondeurs (de l’anglais transponder, en contraction des mots transmitter et responder) et d’un lecteur. Un marqueur est composé d’une puce et d’une antenne.
Voilà le détecteur-lecteur ID12 que j’ai choisi d’utiliser. Il n’y a pas beaucoup de choix d’ailleurs.
Ce détecteur est distribué par Sparkfun : choisir la version ID-12LA actuellement.
Il peut détecter la proximité de petites capsules de ce type :
J’en ai d’abord collé une sous une loco avec une goutte de colle epoxy, puis je me suis contenté de la placer dans un wagon du convoi. L’emplacement n’est pas critique et peut ainsi changer.
Tests d’un capteur RFID ID-12 de ID Innovations
Le schéma de montage est le suivant :
Avec un Arduino UNO, on connecte les pins suivantes de l’ID12 :
- Pin 1 : Gnd au Gnd Arduino
- Pin 2 : RST d’abord au +5V pour le programme de capture de tags, puis à la pin 13 Arduino pour le programme de reconnaissance
- Pin 11 : +5V au +5V Arduino
- Pin 7 : FS au Gnd
- Pin 9 : D0 à la pin 0 (RX) de l’Arduino (débrancher ce fil lors des chargements de programme pour éviter un conflit avec l’IDE)
On trouvera des sketches de test sur le site Sparkfun :
J’utilise en fait 2 procédures :
// -----------------------------------------------------
// RFID
// -----------------------------------------------------
void checkRFID1(void)
{
int readByte;
while(Serial1.available()) {
digitalWrite(13, HIGH); // led indicatrice de détection
readByte = Serial1.read(); //lecture de l'octet suivant
if(readByte == 2) RFIDreading1 = true; //debut de tag
if(readByte == 3) RFIDreading1 = false; //fin de tag
if(RFIDreading1 && (readByte != 2) && (readByte != 10) && (readByte != 13)) {
tagString1[RFIDindex1] = readByte; //enregistrement du tag
if (RFIDindex1 < 12) RFIDindex1 ++;
}
delay(10); // pour garantir l'arrivée du caractere suivant s'il existe
}
}
///////////////////////////////////
//comparaison de 2 tags
///////////////////////////////////
boolean compareTag(char one[], char two[]){
if(strlen(one) == 0) return false; //vide
for(int i = 7; i < 12; i++){
if(one[i] != two[i]) return false;
}
return true; //valide
}
Dans la routine checkRFID1(), je capture le tag envoyé par le détecteur et avec la routine compareTag(), je recherche si ce tag est bien parmi ceux attendus.
Premières conclusions
Ca marche ! Mais...
L’expérience à révélé 2 problèmes que j’ai contournés. Voici les résultats :
- Si le détecteur ID12 est placé sous le support de voie, à environ 1 bon centimètre de la capsule, soit la moitié de la distance minimum de détection. La présence des rails métalliques et du moteur de la loco n’ont pas l’air d’affecter la détection (c’est une onde radio à 125 kHz, qui pourrait interférer avec le décodeur, mais en fait ça passe). Mais le gros SOUCI est la vitesse maxi de la loco : j’ai testé différentes vitesses et ça marche jusqu’à la valeur 36 sur un maximum de 128 (pour une commande DCC en 128 pas), soit 1/3 de la vitesse maxi.
- Finalement, j’ai testé un autre emplacement pour le détecteur : sur le coté de la voie, avec le transpondeur à l’intérieur d’un wagon (scotché sur la paroi latérale située du coté du détecteur). Et là les résultats sont plus qu’encourageants : la vitesse de détection est nettement meilleure et il semble qu’il n’y ait plus de vitesse limite.
Pour l’esthétique, le meilleur moyen est de cacher le détecteur dans une petite maison en bord de voie :
On verra plus loin qu’un autre emplacement bien pratique est "au-dessus" de la voie, ce qui n’est possible que dans un tunnel bien entendu.
Et si on voulait 2 détecteurs ?
Autre problème éventuel : Il est quasiment impossible de placer 2 détecteurs sur le circuit lorsque chaque détecteur est activé en permanence !
En effet, il se trouve que le détecteur émet des ondes à 125 kHz et le rayonnement est suffisant pour apporter l’énergie nécessaire à la capsule qui doit répondre aux interrogations du détecteur. Le détecteur est aussi très sensible pour recevoir le faible signal de réponse de la capsule. Tant qu’il n’y a qu’un seul détecteur, tout va bien car ce dernier émet et reçoit alternativement, jamais en même temps. Mais si deux détecteurs sont présents sur le circuit, il est impossible d’éviter qu’un détecteur ne reçoive pas le signal émis par un autre détecteur et alors les 2 détecteurs s’aveuglent mutuellement. Dans ce cas ils s’auto-inhibent et ne reçoivent plus rien.
Pour éviter cela, il faut faire fonctionner un seul détecteur à la fois ou blinder les zones de détection, ce qui est difficile !
J’ai donc décidé de limiter ma réalisation à un seul détecteur, ce qui est suffisant.
Et je trouve cela très encourageant, d’autant qu’il est facile de régler la position de l’ID12 et la capsule transpondeur se loge facilement dans quasiment tous les wagons et ne craint plus les perturbations éventuelles du moteur et du décodeur. Et tout est bien protégé de la poussière.
Tentative d’utilisation de 2 détecteurs
Si, comme c’est le cas pour moi dans mon nouveau réseau, celui-ci comporte deux sens de circulation indépendants, l’utilisation d’un seul détecteur RFID serait limitative.
En effet, pour détecter tous les trains, il faut qu’ils passent devant l’unique détecteur et cela impose des itinéraires non naturels, en tout cas peu commodes.
Le mieux serait donc d’utiliser deux détecteurs, l’un sur une des voies à une extrémité du réseau et l’autre sur la voie en sens inverse, à l’autre extrémité du réseau.
Pour qu’il puissent fonctionner tous les deux, le seul moyen est de les faire fonctionner à des instants différents, de préférence quand c’est nécessaire seulement.
J’ai donc imaginé le montage suivant que je réalise 2 fois :
Deux capteurs IR réflectifs (capteurs de distance) sont placés de part et d’autre du capteur RFID. Ils ont pour but de prévenir l’Arduino de l’approche d’un train. Dès qu’un train est détecté, le capteur RFID est mis en marche en libérant sa broche RESET. Dès qu’un train est bien détecté par le capteur RFID, celui-ci est placé de nouveau en hibernation en commandant sa broche RESET.
Le fait d’avoir un capteur de chaque coté du détecteur RFID permet d’en déduire aussi le sens de circulation du train.
Un petit montage de test donne ceci :
Les branchements sont les suivants :
- La broche 4 de l’Arduino, programmée en sortie, est reliée à la broche 2 (Reset) de l’ID12.
- La broche 5 de l’ID12 est reliée à l’entrée RX de l’Arduino.
- Les broches 2 et 3 de l’Arduino, programmées en entrées, sont reliées aux sorties de 2 capteurs de distance réflectifs à infrarouge, du type TCR5000.
Le principe est simple : L’Arduino maintient sa broche 4 à LOW tant qu’aucun capteur IR n’a pas détecté de train d’un coté ou de l’autre.
Dès qu’un détecteur IR fait "monter" une des broches 2 ou 4, la broche 4 passe à HIGH et le capteur RFID fonctionne : il peut détecter la présence d’une capsule dans le train et transmettre son numéro au programme de gestion.
Le sens du train est déduit du fait qu’un des capteurs IR s’est manifesté avant l’autre. Le train "vient" du coté de ce capteur.
La probabilité que les 2 capteurs RFID, chacun associés à un Nano ou un Mini, par exemple et placés aussi loin l’un de l’autre que possible, soient activés en même temps, est très faible. Mais cela peut arriver. Dans ce cas la détection sera perdue, mais la détection suivante aura de bonne chance d’être valide. Petit à petit tous les trains seront bien détectés.
Conclusion
Le choix du RFID est interessant parce que c’est facile à intégrer à un projet Arduino et qu’il n’y a pas de carte électronique à développer.
A ce propos, Sparkfun distribue le nouveau module ID12LA qui semble plus intéressant (plus grande plage de tension d’alimentation), mais toujours à 29$.
Je suis totalement satisfait de la solution RFID. J’ai réalisé un suivi de mes trains en plaçant le lecteur en sortie de gare, point de passage obligatoire du trafic.
La connaissance de la position des trains est ainsi totalement dynamique. Le système découvre les trains les uns après les autres, n’empêchant aucune manœuvre manuelle.
Le TCO affiche les numéros de trains dans chaque canton à l’aide d’un afficheur à 7 segments.
A partir de cette connaissance des positions, j’ai réalisé un block-système simple.