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 :
Premiers essais:
Développement de la solution:
Vue du montage avec 2 détecteurs, les LED et l'Arduino
Le code:
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:
Liens utiles:
Le capteur à effet hall avec Arduino ici
La simulation sous TinkerCad ici
Le site d'Erek Optiz ici