LOCODUINO

Forum de discussion
Dépôt GIT Locoduino

jeudi 19 janvier 2017

32 visiteurs en ce moment

Une barrière infrarouge

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

. Par : Dominique

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.
JPEG - 48.5 ko

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.

JPEG - 669.4 ko

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 !).

JPEG - 287.2 ko

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.

PNG - 338.3 ko

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 :

  1. const int IRDetectorPin = 2;
  2. const int ledPin = 13;
  3.  
  4. void setup() {
  5. pinMode(ledPin, OUTPUT);
  6. pinMode(IRDetectorPin, INPUT);
  7. }
  8.  
  9. void loop(){
  10. digitalWrite(ledPin, digitalRead(IRDetectorPin));
  11. }

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 :

  1. // constantes (car elles ne changent pas)
  2. const int IRDetectorPin = 2; // pin du detecteur IR
  3. const int ledPin = 13; // pin de la LED
  4.  
  5. // Variables (car elle changent)
  6. int ledState = LOW; // led eteinte
  7. int IRState; // etat courant du detecteur IR
  8. int lastIRState = LOW; // etat precedant du detecteur IR (pour detecter un changement)
  9.  
  10. // variable de temps en millisecondes
  11. long lastDebounceTime = 0; // derniere fois que le detecteur a change
  12. long debounceDelay = 1000; // delai d'une seconde pour valider un changement
  13.  
  14. //------------------- SETUP ----------------
  15. void setup() {
  16. pinMode(IRDetectorPin, INPUT);
  17. pinMode(ledPin, OUTPUT);
  18.  
  19. // initialisation de la led
  20. digitalWrite(ledPin, ledState);
  21. }
  22.  
  23. //-------------------- LOOP ----------------
  24. void loop() {
  25. // lecture du detecteur IR dans une variable locale
  26. int reading = digitalRead(IRDetectorPin);
  27.  
  28. // si le faisceau est coupe (reading == HIGH ou 1)
  29. // on attend assez longtemps pour ignorer les detections parasites
  30. // et en particulier les intervalles entre wagons
  31.  
  32. // le detecteur a-t-il change
  33. if (reading != lastIRState) {
  34. // armement du timer
  35. lastDebounceTime = millis();
  36. }
  37.  
  38. if ((millis() - lastDebounceTime) > debounceDelay) {
  39. // si le delai est atteint, le changement est valide
  40. // sinon le changement est ignore (parasite ou inter-wagon)
  41.  
  42. // changement valide
  43. if (reading != IRState) {
  44. IRState = reading;
  45. // on repercute le changement sur le led
  46. ledState = IRState;
  47. digitalWrite(ledPin, ledState);
  48.  
  49. // si IRState est HIGH, il s'agit de la tete du train
  50. // *** appeller ici le traitement de tete de train
  51. // par exemple : l'entree du train dans un canton
  52.  
  53. // si IRSate est LOW, il s'agit de la queue du train
  54. // *** appeller ici le traitement de queue de train
  55. // par exemple : la sortie effective du canton
  56. }
  57. }
  58. // on sauve l'etat du detecteur pour le tour de loop suivant
  59. lastIRState = reading;
  60. // ainsi, le moindre changement avant la fin du delai debounceDelay
  61. // va reinitialiser ce delai
  62.  
  63. }

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.

30 Messages

Réagissez à « Une barrière infrarouge »

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

Rubrique « Projets »

Un chenillard de DEL

Enseigne de magasin

Feux tricolores

Multi-animations lumineuses

L’Arduino et le système de commande numérique DCC

Un décodeur d’accessoire DCC versatile basé sur Arduino

Un moniteur de signaux DCC

Une barrière infrarouge

Un capteur RFID

Un TCO xpressnet

Une animation sonore

L’Arduino au coeur des systèmes de pilotage analogiques ou numériques

Calcul de la vitesse d’un train miniature avec l’Arduino

La génèse d’un réseau 100% Arduino

Une horloge à échelle H0

Simulateur de soudure à arc

Un automatisme de Passage à Niveau

La rétro-signalisation sur Arduino

Décodeur pour aiguillage à solénoïdes sur Arduino

Un décodeur DCC pour les signaux à deux ou trois feux sur Arduino NANO/UNO

Etude d’un passage à niveau universel

Réalisation pratique d’un système de mesure de vitesse à l’échelle N

Une Passerelle entre le bus S88 et le bus CAN pour la rétro signalisation

Un décodeur DCC pour 16 feux tricolores

Comment piloter trains et accessoires en DCC avec un Arduino (1)

Comment piloter trains et accessoires en DCC avec un Arduino (2)

Comment piloter trains et accessoires en DCC avec un Arduino (3)

Comment piloter trains et accessoires en DCC avec un Arduino (4)

SGDD : Système de Gestion DD (1)

SGDD : Système de Gestion DD (2)

SGDD : Système de Gestion DD (3)

La PWM : qu’est-ce ? (1)

La PWM : qu’est-ce ? (2)

Mise en oeuvre du Bus CAN entre modules Arduino (1)

Mise en oeuvre du Bus CAN entre modules Arduino (2)

Un gestionnaire en C++ pour votre réseau (1)

Un gestionnaire en C++ pour votre réseau (2)

Un gestionnaire en C++ pour votre réseau (3)

Un gestionnaire en C++ pour votre réseau (4)

Réalisation de centrales DCC avec le logiciel libre DCC++ (1)

Réalisation de centrales DCC avec le logiciel libre DCC++ (2)

Gestion d’une gare cachée (1)

Gestion d’une gare cachée (2)

Gestion d’une gare cachée (3)

Les derniers articles

Un gestionnaire en C++ pour votre réseau (4)


Pierre59

Un décodeur DCC pour 16 feux tricolores


Dominique, JPClaude, Thierry

Réalisation de centrales DCC avec le logiciel libre DCC++ (2)


bobyAndCo

Réalisation de centrales DCC avec le logiciel libre DCC++ (1)


Dominique

Une Passerelle entre le bus S88 et le bus CAN pour la rétro signalisation


JPClaude

Un gestionnaire en C++ pour votre réseau (3)


Pierre59

Réalisation pratique d’un système de mesure de vitesse à l’échelle N


Dominique

Etude d’un passage à niveau universel


Dominique, JPClaude

Un gestionnaire en C++ pour votre réseau (2)


Pierre59

Gestion d’une gare cachée (3)


Jean-Luc

Les articles les plus lus

La PWM : qu’est-ce ? (1)

Mise en oeuvre du Bus CAN entre modules Arduino (2)

Comment piloter trains et accessoires en DCC avec un Arduino (3)

Une barrière infrarouge

L’Arduino au coeur des systèmes de pilotage analogiques ou numériques

Réalisation de centrales DCC avec le logiciel libre DCC++ (2)

Calcul de la vitesse d’un train miniature avec l’Arduino

L’Arduino et le système de commande numérique DCC

La rétro-signalisation sur Arduino

Comment piloter trains et accessoires en DCC avec un Arduino (1)