Compteur d'essieux

 Les systèmes de détection des trains donnent toujours matière à faire des progrès dans la réalité du monde ferroviaire comme en modélisme ferroviaire. Depuis quelques années, les capteurs à effet hall sont de plus en plus performants et cela nous a donné matière à faire de nouveaux tests et même un prototype à base d'Arduino.

Nous allons voir comment mettre en œuvre un capteur simple en s'appuyant sur le prototype sur table, puis la mise en pratique sur une voie en G (train de jardin) et même à plus grande échelle.

Le compteur d'essieux:

Le compteur d'essieux est beaucoup utilisé sur les réseaux ferrés internationaux mais aussi sur le réseau ferré national français.

Le principe est basé sur deux détecteurs. Le premier est positionné à l'entrée d'une zone à protéger et le second à la sortie de cette zone. Lorsque le train entre dans cette zone, celle-ci est dite occupée. Pour qu'elle soit considérée comme libre, il faut que le nombre d'essieux comptés en sortie soit égal au nombre d'essieux comptés en entrée. Dans le cas contraire elle est considérée comme toujours occupée.



Vue des détecteurs sur la voie                                      Vue du boitier contenant l'électronique 

(photos E.ZANDER)

Le capteur à effet Hall:

Le capteur OH 137 est un circuit intégré à effet Hall commuté qui est fait pour des applications de commutation sans contact. Le capteur comprend une puce à effet Hall génératrice de tension pour la détection magnétique, un amplificateur qui amplifie la tension, un déclencheur de Schmitt pour fournir une hystérésis de commutation pour le rejet du bruit, et une sortie à collecteur ouvert.

Il reste à le mettre en œuvre et cela demande réflexion car il faut que ce capteur soit suffisamment proche des essieux à détecter et en même temps qu'il soit protégé. La solution, pour le train de jardin, a été trouvé par un ami modéliste Erek Opitz qui m'en a parlé et qui a même publié un article dans la revue allemande Gartenbahnen n°03 2022 (Août, Septembre, Octobre). L'article est en allemand (j'en ai quelques restes suffisants pour comprendre) mais il y a aussi la vidéo explicative disponible :

La solution consiste à mettre le capteur dans une coque de plastique qui peut se glisser sur le rail. Cette coque est adaptée au profil du rail et permet la libre circulation des essieux. Pour renforcer l'effet du champ magnétique, une petite série d'aimants puissants est positionnée en face du capteur (dans un logement de la coque). L'idée est simple et le résultat efficace.
La coque a été dessinée et imprimée en 3D (PLA).


Vue du prototype de détecteur


Sur la photo ci-après, on peut voir la coque grise en bas avec son logement pour les aimants. A gauche le capteur que l'on distingue, car il est particulièrement fin. A droite, les aimants. Les 3 fils (+Vcc, GND, signal) sont reliés à un Arduino Méga pour faire un traitement de la détection. 

Premiers essais:

Le détecteur peut d'abord être testé simplement avec une petite batterie 12V pour l'alimenter et une LED avec une résistance de 2 kOhms reliée entre la sortie et le +Vcc.

Vues du détecteur avec la LED et la batterie (à gauche)

Vue d'un prototype du détecteur (aimants non protégés)

Vue d'ensemble du dispositif (batterie en haut)

Voici une petite vidéo qui illustre le fonctionnement:


Le résultat est excellent avec une détection à coup sûr quel que soit la vitesse du train. Dans le cas où il n'y a pas d'essieu métallique comment fait-on ?
Nous avons pensé à cela en ajoutant des disques métalliques fins qui se montent sur roues des wagons. Cela est fonctionne aussi très très bien!

Développement de la solution:

La détection fonctionne bien mais il faut poursuivre le développement afin d'avoir un véritable compteur d'essieux. 

Nous avons donc ressorti notre Arduino pour écrire un petit programme réalisant cette fonction de comptage. Pour le vérifier, nous avons utilisé 3 LED. La première s'éclaire si le premier détecteur a détecté un essieu. Idem pour la seconde. La dernière s'éclaire seulement si le nombre d'essieux en sortie et égale au nombre d'essieux en entrée. Bien évidement, le comptage doit fonctionner dans les deux sens de passage.

Vue du montage avec 2 détecteurs, les LED et l'Arduino

Vue avec les LEDs en test au démarrage

Vue globale du montage

Voici une petite vidéo qui illustre le fonctionnement:



Nous nous sommes limité à une seule zone de comptage. Il est bien sûr nécessaire de dupliquer les zones autant que de besoin pour un réseau. Cela implique de gérer un grand nombre d'entrées et de détecteurs.
Dans certains cas il peut aussi y avoir des problèmes de détection et cela implique la mise en œuvre d'une logique de contrôle, voire une fonction de reset d'une zone.

Le code:

Nous avons opté pour une approche de partage en utilisant TinkerCad (voir liens utiles). Le montage est simulé et on peut tester le code réalisé dans l'environnement Arduino. Les détecteurs sont remplacés par des boutons poussoirs.


Vous pouvez copier le modèle et le modifier si vous le souhaitez : voir liens utiles.


Code (pour ceux qui vsont pressés):

int sensorPin_1 = 4;    // select the input pin for the sensors

int sensorPin_2 = 5;  

int ledPin_1 = 2;      // select the pin for the LED detection input

int ledPin_2 = 3;      // select the pin for the LED detection ouput

int ledPin_3 = 6;      // select the pin for the LED detection completed

int sensorValue_1 = 0;  // variable to store the value coming from the sensor

int sensorValue_2 = 0;

int compteur_1 = 0;

int compteur_2 = 0;

bool TRUE = 1;

bool FALSE = 0;

int already_cpt_in = FALSE;

int already_cpt_out = FALSE;


void setup() {

  // declare the ledPin as an OUTPUT:

  pinMode(ledPin_1, OUTPUT);

  pinMode(ledPin_2, OUTPUT);

  pinMode(ledPin_3, OUTPUT);

  Serial.begin(9600);

  compteur_1 = 0;

  compteur_2 = 0;

  digitalWrite(ledPin_1, HIGH);

  delay(1000);

  digitalWrite(ledPin_2, HIGH);

  delay(1000);

  digitalWrite(ledPin_3, HIGH);

  delay(1000);

  digitalWrite(ledPin_1, LOW);

  digitalWrite(ledPin_2, LOW);

  digitalWrite(ledPin_3, LOW);

}


void loop() {

  // read the value from the wheel sensor 1:

  sensorValue_1 = digitalRead (sensorPin_1);

  if (sensorValue_1 == TRUE){

    Serial.print("Sensor 1 : ");

    Serial.println(sensorValue_1);

    Serial.print("Comp 1 : ");

    Serial.println(compteur_1);

    

    compteur_1 = compteur_1 + 1;

    already_cpt_in = TRUE;

    digitalWrite(ledPin_1, HIGH);

  }

  //read the value from the wheel sensor 2:

  sensorValue_2 = digitalRead (sensorPin_2);

  if (sensorValue_2 == TRUE){

    Serial.print("Sensor 2 : ");

    Serial.println(sensorValue_2);

    Serial.print("Comp 2 : ");

    Serial.println(compteur_2);


    compteur_2 = compteur_2 + 1;

    already_cpt_out = TRUE;

    digitalWrite(ledPin_2, HIGH);

  }

  if ((compteur_2 - compteur_1 == 0)&(already_cpt_in == TRUE)&(already_cpt_out == TRUE)) {

     // turn the ledPin on

    digitalWrite(ledPin_3, HIGH);

    // stop the program for 2 seconds:

    delay(4000);

    // turn the ledPin off:

    digitalWrite(ledPin_2, LOW);

    already_cpt_in = FALSE;

    already_cpt_out = FALSE;

    digitalWrite(ledPin_1, FALSE);

    digitalWrite(ledPin_2, FALSE);

    digitalWrite(ledPin_3, FALSE);

  }

}

Prochaines étapes:

La prochaine étape consistera à faire cette détection sur le réseau avec une distance filaire importante pour déterminer les limites!
On peut aussi coupler un émetteur/récepteur sans fil.

A suivre!

Liens utiles:

Le capteur à effet hall avec Arduino ici

La simulation sous TinkerCad ici

Le site d'Erek Optiz ici