LOCODUINO

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

vendredi 29 mars 2024

Visiteurs connectés : 48

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 à (...)

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.)

24 Messages

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)

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

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

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

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

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

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)

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

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

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

Chenillard de DEL

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

La rétro-signalisation sur Arduino

LaBox, Une Centrale DCC polyvalente et abordable (1)

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