LOCODUINO

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

mercredi 21 octobre 2020

87 visiteurs en ce moment

Un automatisme de Passage à Niveau

Avec un simple Pro Mini

. Par : Dominique, JPClaude

Le cahier des charges Le passage à niveau doit protéger une double voie, dont l’une des branches est en "Y". Il y a donc 5 sections de voies de part et d’autre du passage à niveau. Sur chaque branche, sont disposés 2 détecteurs de type interrupteur à lame souple, "ILS". Il y en a donc 10 au total. Le plus proche du passage à niveau doit (...)

Retourner à l'article

Vous répondez à :

Un automatisme de Passage à Niveau 13 mai 2019 17:37, par JPClaude

J’avais fait un programme dans ce genre pour une traversée de PN en un seul sens, cela peut peut être vous donnez des idées pour votre cas.
Voici le programme, ATTENTION les deux servos sont tête bêche ce qui veut dire qu’ils tournent en sens inverse cela est dû à la limite de leur emprise en les couchant sur le coté.

/*****************************************************************************
* Gestion d'une barriere dans un seul sens de direction par
* 2 capteurs un pour l'entree du train et l'autre pour la sortie, ILS, detecteur de consommation ou autre
* 2 servos de type SG90 mis tete beche sur leur cote afin de limiter leur emprise
* ce qui fait que quand un servo tourne dans un sens l'autre tourne dans l'autre sens
* et 2 feux routiers qui clignotent
***************************************************************************/


#include <Servo.h>
#include <Bounce2.h>

#define PIN_CAPTEUR_OUVRE 2  
#define PIN_CAPTEUR_FERME 3  
#define INTERVAL 50

#define PIN_FEU_DROIT 4
#define PIN_FEU_GAUCHE 5
#define ALLUME 0
#define ETEINT 255
#define VITESSE_CLIGNOTEMENT 250

#define PIN_SERVO_DROIT A2  
#define PIN_SERVO_GAUCHE A3

// a regler en fonction des servos

#define VITESSE_SERVO 80
#define ANGLE_FERMETURE 1300
#define ANGLE_OUVERTURE 1900
#define PAS_ANGULAIRE 20

/***********************************************************************
* les feux routiers
**************************************************************************/

int cycle = 0;                                        // cycles de clignotement
int changement = VITESSE_CLIGNOTEMENT;                // vitesse de clignotement
unsigned long timerLed = millis();                    // timer pour le clignotement

/******************************************************************************
* les capteurs
********************************************************************************/

Bounce capteurOuverture;                              // anti rebond
Bounce capteurFermeture;                              // anti rebond

/************************************************************************************
* les servos
**************************************************************************************/

int angleFerme = ANGLE_FERMETURE;                     // angle de fermeture
int angleOuvre = ANGLE_OUVERTURE;                     // angle pour l'ouverture
int angleDroit;                                       // angle actuel du servo 1
int angleGauche;                                      // angle actuel du servo 2
int pasServo = PAS_ANGULAIRE;                         // pas angulaire
enum mode {montee,descente,arret};
mode sens = arret;                                    // sens du mouvement de la barriere
enum etat {ouvert, ferme, encours};
etat situation = ouvert;                              // situation de la barriere
bool actif = false;                                   // etat de la manoeuvre                                      
unsigned long timerServo;                             // timer pour le servo
int duree = VITESSE_SERVO;                            // vitesse des servos            
Servo servoDroit;                                     // servo de la premiere barriere
Servo servoGauche;                                    // servo de la seconde barriere

/*****************************************************************************
* clignotement des feux routiers
***************************************************************************/

void clignote() {
if (timerLed + changement < millis())     // vitesse de clignotement
   {
   timerLed = millis();                  // reinit le timer
   switch (cycle) {
           case 0 : {analogWrite(PIN_FEU_DROIT,ALLUME); analogWrite(PIN_FEU_GAUCHE,ALLUME);cycle = 1;break;}      // on allume
           case 1 : {analogWrite(PIN_FEU_DROIT,ETEINT); analogWrite(PIN_FEU_GAUCHE,ETEINT);cycle = 0;break;}      // on eteint
       }
   }
}

/*****************************************************************************
* initialisation de l'ouverture des barrieres
*****************************************************************************/

void ouverture() {
if (situation != ouvert) {                      // si pas deja ouvert
   servoDroit.attach(PIN_SERVO_DROIT);           // on attache les servos
   servoGauche.attach(PIN_SERVO_GAUCHE);  
   actif = true;                               // on devient actif          
   angleDroit = angleFerme;                    // une des barrieres va vers le bas (inversion des servos)
   angleGauche = angleOuvre;                   // l'autre en symetrie va vers le haut
   timerServo = millis();                      // MAJ du timer
   sens = montee;                              // on monte          
   situation = encours;                        // manoeuvre en cours
   }
}

/**************************************************************************
* initialisation de la fermeture des barrieres
***************************************************************************/

void fermeture() {
if (situation != ferme ) {                      // si pas deja ferme
   servoDroit.attach(PIN_SERVO_DROIT);                          // on attach les servos
   servoGauche.attach(PIN_SERVO_GAUCHE);
   actif = true;                               // on devient actif
   angleDroit = angleOuvre;                        // une des barrieres va vers le haut (inversion des servos)
   angleGauche = angleFerme;                        // l'uatre en symetrie vers le bas
   timerServo = millis();                      // MAJ des timers
   timerLed = millis();
   sens = descente;                            // on descend          
   situation = encours;                        // manoeuvre en cours  
   }
}

/*******************************************************************************
* manoeuvre de la bbariere
*********************************************************************************/

void manoeuvre() {
 if (actif){
   if ((timerServo + duree) < millis()){             // vitesse des servos
           if (sens == montee) {angleDroit += pasServo; angleGauche -= pasServo;          // on monte
                               if (angleDroit >= angleOuvre) {           // en bout de course
                                   actif = false;                    // on n'est plus actif
                                   sens = arret;                     // on est a l'arret
                                   situation = ouvert;               // la barriere est ouverte
                                   analogWrite(PIN_FEU_DROIT,ETEINT);           // on eteint les feux routiers
                                   analogWrite(PIN_FEU_GAUCHE,ETEINT);
                                   servoDroit.detach();                  // on detache les servos
                                   servoGauche.detach();
                                   return;}                          // termine
                               }
           if (sens == descente) {angleDroit -= pasServo; angleGauche += pasServo;      // on descend
                               if (angleDroit <= angleFerme) {         // en bout de course
                                 actif = false;                    // on n'est plus actif
                                 sens = arret;                     // on est a l'arret
                                 situation = ferme;                // la barriere est fermee
                                 servoDroit.detach();                  // on detache les servos
                                 servoGauche.detach();
                                 return;}                          // termine
                               }
           servoDroit.writeMicroseconds(angleDroit);                       // on avance de l'angle  
           servoGauche.writeMicroseconds(angleGauche);
           analogWrite(PIN_FEU_DROIT,ALLUME);                                   // on allume les feux routiers
           analogWrite(PIN_FEU_GAUCHE,ALLUME);
           timerServo = millis();
       }
   }
}

/*******************************************************************
* setup
******************************************************************/

void setup()
{
   servoDroit.attach(PIN_SERVO_DROIT);servoDroit.writeMicroseconds(angleOuvre);
   servoGauche.attach(PIN_SERVO_GAUCHE);servoGauche.writeMicroseconds(angleFerme);
   pinMode(PIN_CAPTEUR_OUVRE,INPUT_PULLUP);capteurOuverture.attach(PIN_CAPTEUR_OUVRE);capteurOuverture.interval(INTERVAL);
   pinMode(PIN_CAPTEUR_FERME, INPUT_PULLUP);capteurFermeture.attach(PIN_CAPTEUR_FERME);capteurFermeture.interval(INTERVAL);
   analogWrite(PIN_FEU_DROIT,ETEINT);
   analogWrite(PIN_FEU_GAUCHE,ETEINT);
}

/*******************************************************************
 * la boucle
 ********************************************************************/
 
void loop()
{    
    if (situation == ferme) { clignote();}
    if (capteurOuverture.fell()) {ouverture();}
    if (capteurFermeture.fell()) {fermeture();}
    if (situation == encours) {manoeuvre();}
    capteurOuverture.update();
    capteurFermeture.update();
   
}
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.)

20 Messages

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

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)

Realisation 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

La carte Satellite V1 - Un Configurateur-Testeur

Une croix de pharmacie animée avec Arduino UNO

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

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

La carte Satellite V1

La carte Satellite V1

La carte Satellite V1

Les derniers articles

La carte Satellite V1 - Un Configurateur-Testeur


Dominique

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


bobyAndCo

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


Dominique

Une croix de pharmacie animée avec Arduino UNO


Christian

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


Serge

Etude d’un passage à niveau multivoies


Dominique, JPClaude

Annonces en gare avec la RFID


bobyAndCo, Catplus, Christian

La carte Satellite V1


bobyAndCo, Dominique, Jean-Luc, Thierry

La carte Satellite V1


bobyAndCo, Dominique, Jean-Luc, Thierry

La carte Satellite V1


bobyAndCo, Dominique, Jean-Luc, Thierry

Les articles les plus lus

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

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

Feux tricolores

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

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

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

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

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

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

Un chenillard de DEL