Bonjour à tous.
Voici pour vos réseaux une petite animation automatique qui vous permettra de faire circuler des trains sur une ou plusieurs boucles pendant que vous ferez manuellement quelques accrochages décrochages de wagon en gare que vous ferez circuler sur une ligne secondaire.
Réalisé sur réseau numérique avec un nano et des modules relais.
Débutant sur Arduino, je remercie l'aide précieuse de Dominique dans cette réalisation.
À votre disposition pour questions éventuelles.
Fabien.
/*
Ce petit programme est une circulation alternée de
trains sur une voie à sens unique ici dans le sens des aiguilles d'une montre.
voie A ILS A
_ _ _ _ _ " _ _ _ _ _ _ _ # _ _ _ _ _ _ _
_ _ _ # _ _ _ < _ _ _ _ _ " _ _ _ _ _ _ _ # _ _ _ _ _ _ _ > _ _ _ _ _ _
ILS C tortoise 1 voie B ILS B tortoise 2
" # " symbole de l'ILS
" < " et " > " sont les aiguillages équipés d'éclisses isolantes sur un rail coté voies A et B.
La distance entre l'aiguillage "<" et les ILS A et B doit pouvoir recevoir votre train le plus long
Les modules relais A4 et A5 commande l'alimentation des voies A et B avec redémarrage temporisé
des trains par l'intermédiaire de delay().Montage reproductible sur une boucle dans l'autre sens de
circulation des trains ou reproductible également sur une même boucle et faire tourner 3 trains en alternance
et même 4 mais attention aux règlages de temporisation !!
*/
#include <Bounce2.h>
// Pins utilisées pour les connexions aux detecteurs Reed
#define ReedA 2 // ILS A voie A
#define ReedB 3 // ILS B voie B
#define ReedC 4 // ILS C acces voies A et B
// Pins utilisées pour les relais R1 R2 qui commandent TORTOISE1 et R3 R4 qui commandent TORTOISE2 (inverseurs de polarité)
#define R1 A0 //digital OUT IN relai 1 TORTOISE1
#define R2 A1 //digital OUT IN relai 2 TORTOISE1
#define R3 A2 //digital OUT IN relai 3 TORTOISE2
#define R4 A3 //digital OUT IN relai 4 TORTOISE2
#define R5 A4 //digital OUT IN relai 5 tempo alim voie A
#define R6 A5 //digital OUT IN relai 6 tempo alim voie B
#include <Bounce2.h> // librairie de gestion des contacts Reed
// 3 Reed A B C bounce avec une durée de 50 MS de debounce
Bounce bounceA = Bounce();
Bounce bounceB = Bounce();
Bounce bounceC = Bounce();
// Variables
boolean etatA = false; // Etat libre (false) ou occupé (true) de la voie A
boolean etatB = false; // Etat libre (false) ou occupé (true) de la voie B
boolean etat_TORT1 = false; // false = directe = LOW
boolean etat_TORT2 = true; // true = déviée = HIGH
// utilitaire : commandes des tortoises en fonction de etat_TORTx
void TORT1() {
digitalWrite(R1, etat_TORT1); // R1 = LOW, R2 = HIGH --> TORTOISE 1 directe
digitalWrite(R2, !etat_TORT1); // R1 = HIGH, R2 = LOW --> TORTOISE 1 deviee
}
void TORT2() {
digitalWrite(R3, etat_TORT2); // R3 = LOW, R4 = HIGH --> TORTOISE 2 directe
digitalWrite(R4, !etat_TORT2); // R3 = HIGH, R4 = LOW --> TORTOISE 2 déviée
}
// SETUP
void setup() {
// entrées
pinMode(ReedA, INPUT_PULLUP);
pinMode(ReedB, INPUT_PULLUP);
pinMode(ReedC, INPUT_PULLUP);
// sorties
pinMode(R1, OUTPUT); // relais TORTOISE1
pinMode(R2, OUTPUT); // relais TORTOISE1
pinMode(R3, OUTPUT); // relais TORTOISE2
pinMode(R4, OUTPUT); // relais TORTOISE2
pinMode(R5, OUTPUT); // relais tempo alim voie A
pinMode(R6, OUTPUT); // relais tempo alim voie B
bounceA.attach(ReedA); //définition des objets bounce
bounceB.attach(ReedB);
bounceC.attach(ReedC);
bounceA.interval(50);
bounceB.interval(50);
bounceC.interval(50);
Serial.begin(115200); // console de debugging
Serial.println("c'est parti !");
//Initialisation de états
etatA = false; // voie A libre
etatB = true; // voie B occupée
etat_TORT1 = false; // directe
TORT1();
etat_TORT2 = false; // directe
TORT2();
//initialisation des relais d'alimentation des voie A et B (alimentation sur contact repos)
digitalWrite(A4, HIGH);
digitalWrite(A5, HIGH);
} // (SETUP)
// LOOP
void loop() {
// Update the debouncer
bounceA.update ( );
bounceB.update ( );
bounceC.update ( );
if ( bounceC.fell() ) {
Serial.println(); Serial.print("ILS C->");
action1(); // ILS C acces voies A et B
}
if ( bounceA.fell() ) {
Serial.println(); Serial.print("ILS A->");
action2(); // ILS A voie A
}
if ( bounceB.fell() ) {
Serial.println(); Serial.print("ILS B->");
action3(); // ILS B voie B
}
} // (LOOP)
void action1() // ILS C acces voies A et B
{
if (!etatA && !etat_TORT1) // voie A libre et TORTOISE1 direct
{
etat_TORT2 = true; //TORTOISE2 déviée sur voie B
TORT2();
}
if (!etatB && etat_TORT1) // voie B libre et TORTOISE1 déviée
{
etat_TORT2 = false; // TORTOISE2 directe sur voie A
TORT2();
}
}
void action2() // ILS A voie A
{
etatA = true; // voie A occupée
etatB = false; // voie B se libère
etat_TORT1 = true; // TORTOISE1 déviée --> voie B en entrée
TORT1();
digitalWrite(A4,LOW);
delay(8000);
digitalWrite(A5,HIGH);
}
void action3() // ILS B voie B
{
etatA = false; // voie A se libère
etatB = true; // voie B occupée
etat_TORT1 = false; // TORTOISE1 directe --> voie A en entrée
TORT1();
digitalWrite(A5,LOW);
delay(10000);
digitalWrite(A4,HIGH);
}