Auteur Sujet: CIRCULATION ALTERNÉE  (Lu 17380 fois)

Fabien51

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
CIRCULATION ALTERNÉE
« le: mars 09, 2017, 07:48:59 pm »
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);
}

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3039
  • 100% Arduino et N
    • Voir le profil
Re : CIRCULATION ALTERNÉE
« Réponse #1 le: mars 10, 2017, 11:43:49 am »
Bravo Fabien,

Un petit conseil (pour tous également) : Pour partager un programme, le mieux est de compresser le dossier du programme qui contient le .ino (et éventuellement d'autres fichiers) et de joindre le fichier compressé (.zip) à la discussion, comme ci-dessous  :D

Mais là tu permets de le lire directement ce qui est utile aussi  ;)


« Modifié: mars 10, 2017, 11:45:34 am par Dominique »
Cordialement,
Dominique

DDEFF

  • Hero Member
  • *****
  • Messages: 760
    • Voir le profil
Re : CIRCULATION ALTERNÉE
« Réponse #2 le: mars 10, 2017, 12:33:50 pm »
Bonjour Fabien51,

Deux remarques :
1°) 51, c'est pour la Marne ? (j'ai habité Reims 60 ans...)  ;D
2°) Pour compléter ce que dit Dominique, et applicable à tous : quand on donne un extrait de son programme, autant le donner comme du code (bouton # dans la réponse)
Entre autres, l'indentation y est nettement plus visible.  ;)

Bienvenue parmi nous

Denis
« Modifié: mars 13, 2017, 07:26:26 pm par DDEFF »
"Ce n'est pas le puits qui est trop profond, c'est ta corde qui est trop courte" (proverbe chinois)