Contrôleur automatique passage à niveau ferroviaire : circuit Arduino et code source
Contrôleur automatique passage à niveau grande vitesse avec Arduino et capteurs ultrasons
Dans ce tutoriel, nous apprenons à concevoir un système simple et efficace de contrôle automatique de passage à niveau ferroviaire grande vitesse. C'est une approche relativement simple mais qui peut servir de base pour développements ultérieurs : suivi de la vitesse du train, etc. Mais avant de commencer, comprenons l'automatisation et ce qu'on peut en attendre.
L'automatisation signifie concevoir une méthode pour réduire ou éliminer l'intervention humaine. Ici, nous automatisons un passage à niveau avec Arduino, servomoteur et logiciel Proteus.
La complexité varie du simple contrôle « marche/arrêt » aux algorithmes multivariable complexes. Les systèmes de contrôle peuvent être boucle ouverte ou fermée (réponse à la sortie réinjectée en entrée). L'automatisation ferroviaire est cruciale à l'ère avancée pour réduire accidents dus aux erreurs humaines.
- Article connexe : Circuit détecteur vitesse voiture – Fonctionnement et code source
Comme toute technologie, l'automatisation a avantages et inconvénients :
Avantages
- Augmentation productivité
- Qualité prévisible (amélioration qualité)
- Robustesse accrue
- Grande cohérence des résultats
- Réduction coûts main-d'œuvre
- Précision élevée
- Réduction efforts humains tâches monotones
Inconvénients
- Vulnérable aux menaces sécurité
- Coût développement peut dépasser prévisions
- Coût mise en place élevé
- Cause chômage dans nombreux secteurs
Les avantages l'emportent largement, d'où le passage mondial à l'automatisation.
Nous automatisons un passage à niveau pour l'ouvrir/fermer à la détection d'un train, avec alarme si vitesse dépasse un seuil, utilisant Arduino et servomoteur.
Le capteur utilisé est ultrasons (HC-SR04), mais un capteur IR est possible selon choix et disponibilité.
- Article connexe : Système domotique intelligent – Circuit et code source
Composants requis pour contrôleur passage à niveau
- Arduino UNO
- Buzzer (alarme)
- Capteur ultrasons (HC-SR04)
- Servomoteur
Logiciels requis :
- Arduino IDE
- Proteus
Schéma de circuit du contrôleur passage à niveau

Description des composants
Arduino UNO
Arduino est une carte de développement open source basée sur microcontrôleur Microchip ATmega328P, fabriquée par Arduino.cc. Elle dispose de 14 broches numériques et 6 analogiques programmables via IDE (Arduino IDE). Programmation via USB type B. Alimentation USB ou 9V DC (plage 7-20V). Similaire aux Arduino Nano et Leonardo.
Le protocole STK500 est utilisé pour communication. Différence majeure : pas de puce FTDI USB-série, mais ATmega16U2 (ATmega8U2 jusqu'à R2) programmé comme convertisseur USB-série.
- Article connexe : Alimentation variable avec Arduino UNO – Circuit et code

Capteur ultrasons (HC-SR04)
Capteur de base pour mesurer distance d'un objet. 4 broches :
- Trig (déclencheur)
- Echo (réception)
- GND
- VCC (+5V)
Fonctionnement : l'émetteur (Trig) envoie un signal ultrasonore haute fréquence réfléchi par l'objet, reçu au récepteur (Echo). Connaissant la vitesse du son dans l'air, on calcule la distance. Très populaire chez les makers Arduino. Nécessite impulsion haute 10 µs min sur Trig.
Caractéristiques :
- Alimentation : +5V DC
- Courant repos : <2mA
- Courant fonctionnement : 15mA
- Angle effectif : <15°
- Portée : 2cm – 400 cm / 1″ – 13ft
- Résolution : 0,3 cm
- Angle mesure : 30°
- Largeur impulsion déclencheur : 10 µs
- Dimensions : 45 x 20 x 15 mm
Article connexe : Arrosage automatique plantes & irrigation – Circuit, code & rapport projet

Servomoteur
Moteurs spéciaux pour mouvements précis à angle donné. Actionneur rotatif/linéaire permettant contrôle précis position angulaire/linéaire. Ce n'est pas une entité unique mais combinaison moteur + capteur donnant retour position.
Pour l'utiliser, modules avancés nécessaires car moins simple qu'un moteur CC. Utilisés en robotique et industrie lourde.
Similaires aux moteurs pas à pas (contrôle boucle ouverte) mais ceux-ci n'ont pas de retour, limitant leur usage. L'absence de retour distingue le servomoteur : dynamique, personnalisable selon tâche avec modification programmation. Module contrôleur dédié généralement fourni par fabricant.
Mécanisme – C'est un servomécanisme boucle fermée utilisant retour pour mise à jour mouvement et position rotor. Entrée contrôle analogique ou numérique.
- Article connexe : Mesure distance avec Arduino et capteur ultrasons
Un encodeur est couplé au moteur pour retour position/vitesse au contrôleur générant signal d'erreur jusqu'à sortie désirée. Pour réduire l'erreur, le moteur bouge dans un sens ou l'autre jusqu'à erreur nulle. Servomoteurs sophistiqués ont encodeur optique rotatif sur arbre sortie pour mesurer vitesse.

Buzzer (alarme)
Buzzer peut être mécanique, électronique, électromécanique, piézoélectrique. Généralement électronique dans fours, jeux TV, appareils. Circuit interne. Son produit par mouvement disque ferromagnétique. Dispositif piloté par courant avec source tension en entrée.

Fonctionnement contrôleur automatique passage à niveau
Dans ce circuit, deux capteurs ultrasons et servomoteurs reproduisent un passage à niveau. Les deux capteurs sont déclenchés via broches trigger sur Arduino et distance calculée. Le fonctionnement dépend entièrement de la distance mesurée.
Si voie libre, servomoteurs inactifs. Si train arrive d'un côté, distance mesurée par un capteur change. Arduino détecte l'arrivée et met broches numériques 7 et 8 à HIGH.
Ces broches commandent les deux servomoteurs qui pivotent de 90°, fermant la barrière. Quand le train s'éloigne de l'autre capteur, Arduino détecte le départ et les servomoteurs reviennent en position initiale, ouvrant la barrière.
Pour la sécurité, nous avons ajouté alerte train grande vitesse : calcul du temps entre transitions des deux capteurs en un cycle. Si temps inférieur à seuil, buzzer retentit pour alerter personnes près du passage.
- Article connexe : Système irrigation intelligent – Schéma et code
Code source du projet & Explication
Dans ce sketch, 5 variables entières et 4 longues sont définies. tr1, tr2, eh1, eh2 envoient impulsion et reçoivent temps en µs ; val1, val2, dis1, dis2 stockent temps (µs) et distance (cm). Baud rate 9600 bits/s pour communication série.
const int tr1 = 13, eh1 = 12, tr2 = 3, eh2 = 2;; int bz = 11; unsigned long val1, dis1, val2, dis2; #include <Servo.h> Servo myservo1; Servo myservo2; int pos=-1;
Fonctions dans void setup() s'exécutent une fois : définissent baud rate et mode broches entrée/sortie.
void setup() { pinMode(tr1, OUTPUT); pinMode(tr2, OUTPUT); pinMode(bz, OUTPUT); pinMode(eh1, INPUT); pinMode(eh2, INPUT); myservo1.attach(8); myservo2.attach(7); Serial.begin(9600); }
Selon le fonctionnement requis, on mesure continuellement la distance en déclenchant le capteur ultrasons. La distance calculée devient paramètre de condition. Si vraie, variable « pos » incrémente pour actionner servomoteurs ; si fausse, « pos » décrémente pour les ramener.
Une condition supplémentaire vérifie si les deux capteurs détectent l'objet rapidement : elle met broche 11 à HIGH pour alimenter buzzer et alerter. Tout est dans void loop() et se répète jusqu'à reset Arduino ou coupure alimentation.
void loop() { digitalWrite(tr1, LOW); delayMicroseconds(2); digitalWrite(tr1, HIGH); delayMicroseconds(10); digitalWrite(tr1, LOW); val1 = pulseIn(eh1, HIGH); dis1 = (val1 * 0.0343) / 2; digitalWrite(tr2, LOW); delayMicroseconds(2); digitalWrite(tr2, HIGH); delayMicroseconds(10); digitalWrite(tr2, LOW); val2 = pulseIn(eh2, HIGH); dis2 = (val2 * 0.0343) / 2; Serial.println("distance is "); Serial.println(dis1); Serial.println(dis2); if(dis1 < 100 || dis2 < 100) { if(pos==-1){ for (pos = 0; pos <= 90; pos += 1) { myservo1.write(pos); myservo2.write(pos); delay(15);} } delay(1000); digitalWrite(tr1, LOW); delayMicroseconds(2); digitalWrite(tr1, HIGH); delayMicroseconds(10); digitalWrite(tr1, LOW); val1 = pulseIn(eh1, HIGH); dis1 = (val1 * 0.0343) / 2; digitalWrite(tr2, LOW); delayMicroseconds(2); digitalWrite(tr2, HIGH); delayMicroseconds(10); digitalWrite(tr2, LOW); val2 = pulseIn(eh2, HIGH); dis2 = (val2 * 0.0343) / 2; if(dis1 < 100 || dis2 < 100) {digitalWrite(bz, HIGH); Serial.println("distance2 is "); Serial.println(dis1); Serial.println(dis2);} } else if(dis1 >= 100 && dis2 >= 100) { if(pos==91){ for (pos = 90; pos >= 0; pos -= 1) { myservo1.write(pos); myservo2.write(pos); delay(15); } } digitalWrite(bz, LOW); delay(200); } }
Interface fichier Hex avec Proteus pour simulation : Dans Arduino IDE, Fichier>Préférences, dans « Afficher sortie détaillée » cochez compilation et upload. À la compilation, copiez l'emplacement du fichier hex dans la fenêtre du bas, dans Proteus double-cliquez sur Arduino, collez l'emplacement dans « Program file » et OK. Circuit prêt pour simulation Proteus.
Projets connexes :
- Sonnette automatique détection objet par Arduino
- Lampe nuit automatique avec Arduino
- Programmation PWM Arduino et fonctions
- Arduino Serial : Communication série par Arduino
- Idées projets fin d'études électronique
- Idées projets ingénierie électronique étudiants
- Idées mini-projets électronique simples débutants
Technologie industrielle
- Bascule RS à portes NOR : construction et compréhension de la mémoire numérique
- Modes de défaillance courants dans les systèmes électriques éprouvés
- Comprendre les portes TTL NOR et ET : analyse de circuit et conversion
- Circuits de commande moteur avancés : verrouillage, arrêt et techniques à temporisation
- Système d'ouverture automatique de porte piloté par capteur PIR : circuit, fonctionnement et applications
- M-TECH : système de commande CNC avancé pour fraiseuses Apollo
- Contrôle Automatique de Train Miniature Arduino – Simple, Fiable et Personnalisable
- SERENA : Système d'Alarme Arduino Mega 2560 Personnalisé avec Écran Tactile TFT LCD
- Surveillance Cloud : système de contrôle à distance pour la gestion d'actifs en temps réel