Une barrière infrarouge

Simple mais avec de multiples possibilités grâce à l’Arduino

. Par : Dominique. URL : https://www.locoduino.org/spip.php?article40

Pour détecter le passage des trains, plusieurs solutions sont possibles. La plus populaire est la détection de courant car elle est invisible mais elle nécessite de couper un rail.

Mais la barrière infrarouge a tout de même ses avantages :

  • Pas de coupure de rail,
  • Pas de chute de tension d’alimentation des rails (c’est indépendant)
  • On détecte la tête et la queue du train à un point précis du circuit !

Commençons par un exemple. Le schéma est simple.

Les ingrédients :

  • Un diode émettrice SFH415, émettant une lumière infrarouge de longueur d’onde 950 nano-mètre (nm pour les intimes). Il est important de noter cette longueur d’onde car le récepteur doit être accordé sur cette même valeur. Il est aussi préférable de choisir un diode dont l’angle d’ouverture est assez faible pour éviter d’influencer d’autres récepteurs. Cette diode est alimentée exactement comme une diode LED à lumière visible, avec une résistance série de 470Ω soit un courant de 10 mA sous 5V. Voir à ce propos « Fonctionnement et pilotage d’une DEL ».
  • Une diode réceptrice SFH205 dont la plage de réception est centrée sur 950 nm. Cette diode est montée en inverse et en série avec un résistance de forte valeur (220 KΩ). En présence de lumière infrarouge, un effet d’avalanche permet le passage d’un faible courant (25 micro-ampères) qui ne peut être détecté que par l’intermédiaire d’un amplificateur, ici un simple transistor.
  • N’importe quel transistor NPN devrait faire l’affaire. J’en ai profité pour utiliser mes fonds de tiroirs.
  • Une résistance de 2,2KΩ alimente le collecteur du transistor. C’est là qu’on récupère le signal de détection.
  • Une capacité de 10 microFarad stabilise le 5V au plus près du montage. N’oublions pas que nous sommes dans un milieu fortement parasité.
  • Un bornier à 3 points : +5V, Gnd et signal. On aurait pu aussi souder un de ces câbles à 3 conducteurs avec une prise femelle 3 points à un extrémité, qui servent beaucoup en radiocommande.

Voici un exemple de réalisation de 2 détecteurs dont j’ai monté les composants discrets sur une plaque pastillée. Les diodes sont soudées sur les connecteurs 2 points et raccordées au montage avec des fils assez longs pour pouvoir les placer facilement dans le décor en passant par des trous aménagés à cet effet.

On place les diodes IR émettrice et réceptrice de chaque coté des rails, de sorte que l’émettrice arrose la réceptrice. Ici le faisceau de l’émettrice est émis dans l’axe de la diode (son bout bombé sert de lentille convergente). La surface sensible de la réceptrice est la face bombée.

Il faut lire attentivement les fiches caractéristiques pour trouver ces détails primordiaux (sinon ça ne marche pas !).

Bien entendu, il faudra cacher ce détecteur dans le décor. Pour la diode réceptrice, j’ai confectionné une petite cabine technique de bord de voie avec une ouverture coté voie pour la réception de la lumière infrarouge. La diode émettrice est intégrée dans les buissons et les arbres du décor.

Astuce : Pour savoir si la diode émettrice fonctionne bien, on utilise un smartphone en mode appareil photo. La lumière infrarouge est visible par la caméra du smartphone et on la voit allumée.

La gestion du capteur par l’Arduino

Raccordons le signal sur une entrée digitale (il faut une entrée par capteur).

Un programme simple permet de tester le bon fonctionnement du capteur :

const int IRDetectorPin = 2;
const int ledPin =  13;

void setup() {
  pinMode(ledPin, OUTPUT);      
  pinMode(IRDetectorPin, INPUT);     
}

void loop(){
    digitalWrite(ledPin, digitalRead(IRDetectorPin));  
}

Ce programme se contente de recopier l’état du détecteur sur la led : celle-ci s’allume quand la barrière est interrompue.

La détection sophistiquée de la tête et la queue du train

Avec une dose plus importante de logiciel, on peut faire des miracles : Ce morceau de programme va :

  • valider la détection de début et de fin de convoi après une petite temporisation pour éliminer les détections parasites (moustique passant pas hazard)
  • éliminer les "trous" entre voitures ou wagons, par une autre temporisation

Ce croquis est tiré de l’exemple « Debounce » de l’IDE :

// constantes (car elles ne changent pas)
const int IRDetectorPin = 2; // pin du detecteur IR
const int ledPin = 13;       // pin de la LED

// Variables (car elle changent)
int ledState = LOW;      // led eteinte
int IRState;             // etat courant du detecteur IR
int lastIRState = LOW;   // etat precedant du detecteur IR (pour detecter un changement)

// variable de temps en millisecondes
long lastDebounceTime = 0;   // derniere fois que le detecteur a change
long debounceDelay = 1000;   // delai d'une seconde pour valider un changement

//------------------- SETUP ----------------
void setup() {
  pinMode(IRDetectorPin, INPUT);
  pinMode(ledPin, OUTPUT);

  // initialisation de la led
  digitalWrite(ledPin, ledState);
}

//-------------------- LOOP ----------------
void loop() {
  // lecture du detecteur IR dans une variable locale
  int reading = digitalRead(IRDetectorPin);

  // si le faisceau est coupe (reading == HIGH ou 1)
  // on attend assez longtemps pour ignorer les detections parasites
  // et en particulier les intervalles entre wagons 

  // le detecteur a-t-il change
  if (reading != lastIRState) {
    // armement du timer
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // si le delai est atteint, le changement est valide
    // sinon le changement est ignore (parasite ou inter-wagon)

    // changement valide
    if (reading != IRState) {
      IRState = reading;
      // on repercute le changement sur le led
      ledState = IRState;
      digitalWrite(ledPin, ledState);
      
      // si IRState est HIGH, il s'agit de la tete du train
      // *** appeller ici le traitement de tete de train
      // par exemple : l'entree du train dans un canton
      
      // si IRSate est LOW, il s'agit de la queue du train
      // *** appeller ici le traitement de queue de train
      // par exemple : la sortie effective du canton 
      }
    }
   // on sauve l'etat du detecteur pour le tour de loop suivant
  lastIRState = reading;
  // ainsi, le moindre changement avant la fin du delai debounceDelay
  // va reinitialiser ce delai

}

Autre astuce, pour la maintenance des détecteurs

J’utilise une entrée analogique de l’Arduino. Ainsi, je peux faire, par logiciel, soit une mesure analogique (0..1023), soit une mesure digitale (0 ou 1) de la sortie du détecteur.

En effet, comme les diodes émettrices sont équipées d’une lentille convergente qui donne un faisceau très étroit, et comme on ne voit rien à l’oeil nu, il peut être difficile de réaliser un bon alignement de la led IR et du capteur. En faisant une lecture analogique, on obtient une valeur qui dépend de l’alignement. Cette valeur doit être la plus faible possible quand les 2 diodes se voient. Cela doit correspondre au niveau 0 logique.

Quand la lumière ne passe pas, la valeur est maximum, ou alors une lumière parasite vient perturber le capteur !

Dans ma réalisation, j’ai divisé la valeur analogique (0..1023) par 100 et je l’affiche sur un afficheur à 7 segments ou un LCD dans un mode calibrage. Je bouge alors la diode émettrice pour trouver une valeur inférieure ou égale à 2. Ainsi, je suis certain que la lecture digitale ensuite sera correcte.

Cette astuce va s’avérer très utile car les diodes sont parfois chahutées pendant la construction du décor et il faut permettre une maintenance facile des capteurs.