LOCODUINO

Aide
Forum de discussion
Dépôt GIT Locoduino
Flux RSS

mardi 19 mars 2024

Visiteurs connectés : 96

Passage à niveau géré par Arduino (2)

Les feux lumineux clignotants

.
Par : Christian

DIFFICULTÉ :

Dans le précédent article (Passage à niveau géré par Arduino (1)), nous avons vu comment on peut détecter qu’un train approche d’un passage à niveau. Il est temps maintenant d’agir pour protéger la circulation routière et la première chose à faire est de faire clignoter les feux rouges qui accompagnent le PN.

<

Le montage des feux

La figure 1 montre un exemple de feu rouge clignotant de passage à niveau en France. On remarque une cible ronde de couleur gris foncé, entourée d’un cercle blanc avec en son centre, une ampoule rouge. Une visière permet de protéger l’ampoule de l’éclairage ambiant afin de renforcer sa visibilité. Lorsque le feu clignote, l’arrêt est obligatoire tout comme le rouge d’un feu tricolore.

Figure 1
Figure 1
Un feu de passage à niveau en France

Les feux de PN étaient initialement positionnés sur le côté droit de la route comme le montre la figure 2, mais actuellement, les normes de sécurité imposent d’avoir aussi des feux de PN sur le côté gauche de la route afin de renforcer leur visibilité, ce qui est très utile si le PN est situé dans un virage ou une chicane.

Figure 2
Figure 2
Positionnement des barrières et des feux de PN

Dans le dernier article, nous verrons comment ajouter deux feux de PN supplémentaires pour reproduire un PN contemporain. Cependant, la plupart des réseaux peuvent se contenter de deux feux, soit parce que l’époque reproduite le permet, soit parce que le réseau n’est pas visible de tous les côtés ; on peut alors se contenter de mettre deux feux fonctionnels côté visible et deux feux factices de l’autre côté comme le montre la figure 3.

Figure 3
Figure 3
Feux fonctionnels et feux factices

L’ampoule peut être reproduite avec une micro-LED rouge. La tension aux bornes de la LED étant de 1,8 V à peu près, et une sortie numérique d’Arduino à l’état HIGH étant à 5 V, on voit qu’on peut mettre deux LED en série avec une résistance de 470 Ω limitant le courant à quelques milliampères.

Afin de reproduire l’inertie thermique des filaments des ampoules, nous utiliserons la bibliothèque LightDimmer créée par un membre du groupe Locoduino. Les LED doivent être sur une sortie numérique délivrant de la PWM. Réservons l’entrée-sortie 3 au cas où nous aurions besoin d’une entrée générant une interruption, nous avons alors la possibilité d’utiliser les sorties 5, 6, 9, 10 et 11. La figure 4 montre le schéma de montage de nos deux LED sur la sortie 6.

Figure 4
Figure 4
Montage d’un ensemble de deux LED sur la carte Arduino Uno

La bibliothèque LightDimmer

Cette bibliothèque est décrite dans le fichier README à cette adresse : https://github.com/Locoduino/LightDimmer. L’installer est très simple : il suffit d’aller dans le menu Croquis de l’IDE, puis Inclure une bibliothèque > Gérer les bibliothèques. On arrive alors dans une fenêtre "Gestionnaire de bibliothèque" et il suffit alors de taper LightDimmer dans la case "Filtrez votre recherche" puis d’installer.

Il faut bien évidemment inclure cette bibliothèque au programme avec un ordre #include, puis il faut instancier un objet de type LightDimmer en lui donnant un nom (par exemple feuPN).

La fonction principale de LightDimmer est LightDimmer::update() appelée dans la loop du programme. La méthode begin(pin, level) permet de définir dans le setup à quelles sorties les LED sont reliées.

Les méthodes utilisées dans la loop parlent d’elles-mêmes :

  • startBlink() permet de démarrer le clignotement.
  • stopBlink() permet d’arrêter le clignotement.
  • off() permet d’éteindre les LED de façon progressive (afin de ne pas les laisser allumées quand on arrête le clignotement).

Le programme

Le programme ci-dessous gère deux feux de PN branchés sur la sortie 6 de la carte Arduino Uno. Il complète le programme donné dans l’article précédent Passage à niveau géré par Arduino (1). Voici ce que nous avons ajouté :

  • inclusion de la bibliothèque LightDimmer (ligne 11)
  • déclaration de la sortie pour les LED (ligne 14)
  • instanciation d’un objet appelé feuPN (ligne 17)
  • dans le setup : feuPN.begin (LED, HIGH); permet d’initialiser LightDimmer (ligne 41)
  • dans loop : arrêt du clignotement et extinction des feux (lignes 48-49) si etatZonePN est égal à false, ou bien commencement du clignotement (ligne 53) si etatZonePN est égal à true. Enfin, mise à jour de l’état des feux du PN par LightDimmer::update(); (ligne 55)
/* PN_TIB_blinkFeuPN.ino
   -----------------------------------------------------------------
   Fait clignoter un ensemble de deux feux de PN branches sur une
   meme sortie avec la bibliothèque LightDimmer lorsque la zone PN
   est occupee
   -----------------------------------------------------------------
   C BEZANGER - 2018 - 2020 Domaine public
   Derniere mise a jour : 28 mai 2020
*/

#include <LightDimmer.h>

const byte ILS=2; // entree commune a tous les ILS
const byte LED=6; // sortie pour deux feux de PN
unsigned int compteur = 1;  // compteur d evenements (survol ILS)

LightDimmer feuPN;

volatile static boolean etatZonePN = true; // Initialiser avec train en gare sur TIB
volatile static unsigned long old_top_debutISR;  // Date anterieure d appel ISR
unsigned long old_top = 0;  // variable pour afficher donnees utiles

void changeEtat() { // routine d'interruption (ISR)
  unsigned long top_debutISR = millis();  // date appel ISR
  if((top_debutISR - old_top_debutISR) > 2000) {
    // 2 secondes au moins entre execution ISR
    etatZonePN = !etatZonePN; // etat passe a etat oppose
    old_top_debutISR = top_debutISR;  // initialisation date anterieure d appel ISR
  }
} // fin de ISR

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200); // Communication avec le moniteur  
  pinMode (ILS, INPUT_PULLUP);
  pinMode (LED_BUILTIN, OUTPUT);
  // changeEtat est la routine d'interruption sur l'entree ILS
  // elle est declenchee par un front descendant
  attachInterrupt (digitalPinToInterrupt(ILS), changeEtat, FALLING);
  digitalWrite (LED_BUILTIN, LOW);
  feuPN.begin(LED, HIGH); // LED s allume avec etat haut
} // fin de setup

void loop() {
  // put your main code here, to run repeatedly:
  if(etatZonePN == false) {
    digitalWrite (LED_BUILTIN, LOW); // eteint LED de controle de la section
    feuPN.stopBlink();  // arrete le clignotement des feux de PN
    feuPN.off();        // eteint les feux de PN
  }
  if(etatZonePN == true) {
    digitalWrite (LED_BUILTIN, HIGH); // allume LED de controle de la section
    feuPN.startBlink(); // commence le clignotement des feux de PN
  }
  LightDimmer::update();
  if(old_top_debutISR != old_top) { // Affichage pour chaque nouveau survol ILS
    Serial.print(compteur);
    Serial.print("     ");
    Serial.print(old_top_debutISR);
    Serial.print("     ");
    Serial.println(old_top_debutISR - old_top);
    old_top = old_top_debutISR; 
    compteur = compteur + 1;   
  }
} // fin de loop

Arrivé à ce stade, vous disposez déjà d’une animation sympathique pour un passage à niveau de type SAL 0 (Signalisation Automatique Lumineuse sans barrière, type interdit en France depuis 1973). Dans le prochain article, nous verrons comment motoriser les barrières de notre PN afin d’en faire un PN gardé automatique de type SAL 2 (Signalisation Automatique Lumineuse à 2 demi-barrières). Comme vous le voyez, nous concevons notre projet par étapes et tout doit fonctionner parfaitement avant de passer à l’étape suivante. La mise au point est ainsi plus facile.

34 Messages

Réagissez à « Passage à niveau géré par Arduino (2) »

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 »

LaBox, Une Centrale DCC polyvalente et abordable (1)

LaBox, Une Centrale DCC polyvalente et abordable (2)

LaBox, Une Centrale DCC polyvalente et abordable (3)

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 que c’est ? (1)

La PWM : Qu’est-ce que c’est ? (2)

La PWM : Qu’est-ce que c’est ? (3)

La PWM : Qu’est-ce que c’est ? (4)

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)

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

Contrôleur à télécommande infrarouge pour centrale DCC++

Gestion d’une gare cachée (1)

Gestion d’une gare cachée (2)

Gestion d’une gare cachée (3)

La carte Satellite V1 (1)

La carte Satellite V1 (2)

La carte Satellite V1 (3)

La carte Satellite V1 (4)

La carte Satellite V1 (5)

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

Automatisation du pont FLEISCHMANN 6152 (HO) avec un ESP32 (1)

Identifier et localiser vos trains avec le RFID/NFC et un bus CAN.

Etude d’un passage à niveau multivoies

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

Block Automatique Lumineux avec la carte shield "Arduino 4 relays"

Réalisation d’un affichage de gare ARRIVEE DEPART

Ménage à trois (Ordinateur, Arduino, réseau)

Réalisation d’un va-et-vient automatique et réaliste

Souris et centrale sans fil

Communications entre JMRI et Arduino

Annonces en gare avec la RFID

Une croix de pharmacie animée avec Arduino UNO

Réalisation d’un wagon de mesure (distance et vitesse)

Une manette simple et autonome pour LaBox

Éclairer le réseau (1)

Éclairer le réseau (2)

Block Automatique Lumineux à 8 cantons analogiques

Un décodeur DCC pour les plaques tournantes Fleischmann et Roco

Éclairer le réseau (3)

Éclairer le réseau (4)

Éclairer le réseau (5)

JMRI pour Ma première centrale DCC

Rocrail pour Ma première centrale DCC

CDM-Rail pour Ma première centrale DCC (1)

CDM-Rail pour Ma première centrale DCC (2)

Banc de test pour les décodeurs DCC

Ma première manette pour les aiguillages DCC

Mon premier décodeur pour les aiguillages DCC

Boitier 3D pour la station DCC minimale

Va-et-vient pour deux trains

Un programme pour régler facilement les servos moteurs avec un ESP32

Affichage publicitaire avec Arduino (1)

Affichage publicitaire avec Arduino (2)

TCO Web interactif avec des ESP32 et des ESP8266 (1)

TCO Web interactif avec des ESP32 et des ESP8266 (2)

TCO Web interactif avec des ESP32 et des ESP8266 (3)

TCO Web interactif avec des ESP32 et des ESP8266 (4)

TCO Web interactif avec des ESP32 et des ESP8266 (5)

Les derniers articles

LaBox, Une Centrale DCC polyvalente et abordable (3)


Thierry

LaBox, Une Centrale DCC polyvalente et abordable (1)


Thierry

LaBox, Une Centrale DCC polyvalente et abordable (2)


Dominique, msport, Thierry

Un programme pour régler facilement les servos moteurs avec un ESP32


bobyAndCo

TCO Web interactif avec des ESP32 et des ESP8266 (5)


utpeca

TCO Web interactif avec des ESP32 et des ESP8266 (4)


utpeca

TCO Web interactif avec des ESP32 et des ESP8266 (3)


utpeca

TCO Web interactif avec des ESP32 et des ESP8266 (2)


utpeca

TCO Web interactif avec des ESP32 et des ESP8266 (1)


utpeca

Affichage publicitaire avec Arduino (2)


catplus, Christian

Les articles les plus lus

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

La PWM : Qu’est-ce que c’est ? (1)

Mon premier décodeur pour les aiguillages DCC

La rétro-signalisation sur Arduino

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

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

Chenillard de DEL

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

LaBox, Une Centrale DCC polyvalente et abordable (1)

Réalisation d’un va-et-vient automatique et réaliste