Auteur Sujet: arduino gare cachee  (Lu 38377 fois)

marc

  • Newbie
  • *
  • Messages: 23
    • Voir le profil
arduino gare cachee
« le: février 15, 2016, 10:53:05 am »
bonjour à tous
J'ai une gare cachée avec 6 voies (3 dans un sens, 3 dans l'autre).
Mon projet consiste à faire entrer 3 trains sur chacune des 3 voies, détecter par ILS quelle voie est occupée, si une voie est libre le train arrivant se positionne dessus et si les trois voies sont occupées, l'une d'entre elles se libère pour permettre au nouveau train d'entrer. J'ai commencé à écrire le programme mais je bute sur le fait de libérer une des voies.
Comme c'est mon premier programme, c'est sans doute normal.
Je vous copie mon programme et soyez indulgents sur l'écriture peut-être pas très rationnelle.


/*
Le but du jeu est que lorsque les 3 entrées en 0, 1 et 2 sont validées, la sortie 11 soit activée. de façon à permettre à un des trains de démarrer, libérer une pl
 */

// constants won't change. They're used here to
// set pin numbers:
 int compteur = 0;// initialisation du compteur

const int buttonPin0 = 0;     // the number of the pushbutton pin
const int buttonPin1 = 1;     // the number of the pushbutton pin
const int buttonPin2 = 2;     // the number of the pushbutton pin

const int ledPin0 =  8;      // the number of the LED pin
const int ledPin1 =  9;      // the number of the LED pin
const int ledPin2 =  10;      // the number of the LED pin
const int ledPin3 = 11;     //sortie activée si les 3 boutons sont à 1

// variables will change:
int buttonState0 = 0;         // variable for reading the pushbutton status
int buttonState1 = 0;         // variable for reading the pushbutton status
int buttonState2 = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin0, OUTPUT);
  pinMode(ledPin1,OUTPUT);
  pinMode(ledPin2,OUTPUT);// initialize the pushbutton pin as an input:
  pinMode(ledPin3,OUTPUT);
  pinMode(buttonPin0, INPUT);
}

void loop() {
  // read the state of the pushbutton value:
  buttonState0 = digitalRead(buttonPin0);
  buttonState1 = digitalRead(buttonPin1);
    buttonState2 = digitalRead(buttonPin2);
  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState0 == HIGH) {
    // turn LED on:
    compteur = compteur + 1;
    digitalWrite(ledPin0, HIGH);
  } else {
    // turn LED off:
    digitalWrite(ledPin0, LOW);
  }

    if (buttonState1 == HIGH) {
    // turn LED on:
  compteur = compteur + 1;
 digitalWrite(ledPin1, HIGH);
  } else {
    // turn LED off:
     digitalWrite(ledPin1, LOW);
  }
 
    if (buttonState2 == HIGH) {
    // turn LED on:
compteur = compteur + 1;
digitalWrite(ledPin2, HIGH);
  } else {
    // turn LED off:
    digitalWrite(ledPin2, LOW);
  }
 if (compteur == 3) {
digitalWrite(ledPin3,HIGH);
}
else{
  digitalWrite(ledPin3,LOW);
  }
}

bricoleau

  • Jr. Member
  • **
  • Messages: 51
    • Voir le profil
Re : arduino gare cachee
« Réponse #1 le: février 15, 2016, 07:24:37 pm »
Bonjour

La fonction loop() est exécutée en boucle en permanence.
Par conséquent il manque la remise à zéro de la variable compteur en début de loop()
Là, elle croit indéfiniment.

Et accessoirement il manque aussi le pinMode pour les boutons 1 et 2 dans la fonction setup()
« Modifié: février 15, 2016, 07:28:19 pm par bricoleau »

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : arduino gare cachee
« Réponse #2 le: février 16, 2016, 08:45:02 am »
Outre les remarques de bricoleau, il faut également tenir compte du fait que les ILS ne sont pas constamment on quand le train est présent, si l'aimant a dépassé l'ILS, il décolle.

Il faut donc mémoriser qu'il a été on dans le passé pour savoir si un train est présent sur la voie ou non.
Cordialement

marc

  • Newbie
  • *
  • Messages: 23
    • Voir le profil
Re : arduino gare cachee
« Réponse #3 le: février 17, 2016, 06:39:17 pm »
bonjour et merci pour le coup de main.
J'ai refait mon programme que je vous transmets,qui ne fonctionne toujours pas car quand les trois voies sont occupées, j'essaie de libérer la voie 1 mais celle-ci ne se libère qu'un certain temps en fonction du Delay, mais si quelqu'un pouvait me donner une astuce pour arriver à faire ce que je veux.
C'est-à-dire : Gérer 3 voies dans une gare cachée. Si les 3 voies sont occupées, un des trains présents démarre, fait le tour du circuit, revient en gare cachée, comme dans la gare cachée de Biscatrain qui elle est gérée par des relais.
Merci d'avance
Marc

bricoleau

  • Jr. Member
  • **
  • Messages: 51
    • Voir le profil
Re : Re : arduino gare cachee
« Réponse #4 le: février 17, 2016, 07:25:11 pm »
J'ai refait mon programme que je vous transmets

Ou çà??

STP quand tu postes du code ici sur le forum, mets-le entre une balise [code] et une balise [/code] pour qu'il s'affiche correctement.

Par ailleurs, est-ce que tu peux donner plus de précisions sur la localisation des ILS (nombre et emplacement par voie), ainsi que sur la localisation des aimants (loco uniquement ?)

marc

  • Newbie
  • *
  • Messages: 23
    • Voir le profil
Re : arduino gare cachee
« Réponse #5 le: février 18, 2016, 12:35:56 pm »
bonjour à tous

Je remets mon programme :

//VARIABLES CONSTANTES
const int ILS1 = 0;     // numéro pin branchement ILS1
const int ILS2 = 1;     // numéro pin branchement ILS2
const int ILS3 = 2;     // numéro pin branchement ILS3

const int V1=8;   //numéro pin branchement voie 1
const int V2=9;   //numéro pin branchement voie 2
const int V3=10;   //numéro pin branchement voie 3
const int ttes_voies_occupees=11; //numéro pin toutes voies occupées

//VARIABLES QUI CHANGENT
int etat_V1=0;    //sortie V1 0 libre 1 occupée
int etat_V2=0;    //sortie V2 0 libre 1 occupée
int etat_V3=0;    //sortie V3 0 libre 1 occupée
int etat_ttes_voies_occupees=0; //sortie ttes voies occupées 0 non 1 oui
int etat=0;
int unit=0;


void setup() {
  // INITIALISE LES SORTIES VERS LES VOIES
  pinMode(V1,OUTPUT);   //pin 8 en sortie
  pinMode(V2, OUTPUT);     //pin 9 en sortie
  pinMode(V3,OUTPUT);   //pin 10 en sortie
 
  //INITIALISE LES ENTREES ILS EN ENTREE
  pinMode(ILS1,INPUT);
  pinMode(ILS2,INPUT);
  pinMode(ILS3,INPUT);

  //INITIALISE SI TOUTES VOIES OCCUPEES
  pinMode(ttes_voies_occupees,OUTPUT);
}

void loop() {
  // lecture des entrées ILS
  unit=0;
etat_V1=digitalRead(ILS1);
etat_V2=digitalRead(ILS2);
etat_V3=digitalRead(ILS3);

//vérifier si ILS 1 est actionné
// si oui, la sortie 8 est haute
if (etat_V1==HIGH){
  //sortie V1 est on
  //incrément du compteur
  unit++;//on ajoute 1 à unit
  delay (200);
digitalWrite(V1,HIGH);  //sortie arret voie 2 activée
//digitalWrite(V3,LOW);  //sortie  voie 3 activée
}else{
 digitalWrite(V1,LOW);
}


 
//vérifier si ILS 2 est actionné
// si oui, la sortie 9 est haute
if (etat_V2==HIGH){
  //sortie V2 est on
  //incrément du compteur
  unit++;//on ajoute 1 à unit
  delay (200);
digitalWrite(V2,HIGH);  //sortie arret voie 2 activée
//digitalWrite(V3,LOW);  //sortie  voie 3 activée
}else{
 digitalWrite(V2,LOW);
}
//vérifier si ILS 3 est actionné
// si oui, la sortie 10 est haute
if (etat_V3==HIGH){
  //sortie V3 est on
  //incrément du compteur
  unit++;//on ajoute 1 à unit
  delay (200);
digitalWrite(V3,HIGH);  //sortie arret voie 2 activée
//digitalWrite(V3,LOW);  //sortie  voie 3 activée
}else{
  digitalWrite(V3,LOW);
}
if (unit==3)
{
  unit==0;
  digitalWrite(ttes_voies_occupees,HIGH);
//(etat_V1=LOW);
//digitalWrite(V1,LOW);
//delay(1000);
}else{
 digitalWrite(ttes_voies_occupees,LOW);

}
}

J'espère que cela va fonctionner.

Quant aux ILS, j"en ai mis un  sur chaque voie, parallèlement aux voies, dans l'axe de la voie. Sur les locos, c'est en fonction de la place disponible. Généralement sur le boogie avant quand c'est possible. Je vais essayer de trouver des aimants Néodyne pour qu'ils soient plus puissants.

Voilà, j'espère avoir répondu à vos question;
cordialement
Marc

bricoleau

  • Jr. Member
  • **
  • Messages: 51
    • Voir le profil
Re : arduino gare cachee
« Réponse #6 le: février 18, 2016, 07:37:58 pm »
Bonjour

Ton programme scrute en permanence l'état des ILS
Mais le signal en provenance d'un ILS est éphémère : il ne dure que le court instant où l'aimant lui passe au-dessus.

Là, le seul cas où je vois ton programme donner un résultat satisfaisant, c'est si tu as la certitude que le train s'arrêtera pile poil avec l'aimant au-dessus de l'ILS.
Ni un peu avant, ni un peu après.
Est-ce bien le cas ?

marc

  • Newbie
  • *
  • Messages: 23
    • Voir le profil
Re : arduino gare cachee
« Réponse #7 le: février 18, 2016, 08:23:24 pm »
bonjour bricoleau

Les ils sont une option, là où je veux les mettre, je peux mettre des détecteur IR puisque ce sera une gare cachée, mon problème vient surtout de la programmation, comme je l'ai expliqué.
Je fais les tests avec le logiciel Proteus, ce qui me permet de visualiser assez facilement ma programmation, ce qui dans mon cas n'est pas un luxe...
Arrivez-vous à lire mon code ?

Merci beaucoup
Marc

bricoleau

  • Jr. Member
  • **
  • Messages: 51
    • Voir le profil
Re : arduino gare cachee
« Réponse #8 le: février 18, 2016, 11:54:18 pm »
oui j'arrive à lire le code, même si son indentation un peu cahotique n'aide pas à la lisibilité.

Ce programme devrait fonctionner... mais pas forcément tel que voulu

En gros, là il a trois entrées numériques et trois sorties associées.
A chaque fois qu'une entrée est activée, le programme envoie une impulsion sur la sortie associée.
Et si les 3 entrées sont activées simultanément (très peu probable avec 3 ILS), il va activer une quatrième sortie.

Je suis désolé, mais ne vois pas bien le rapport avec l'énoncé initial du projet.

marc

  • Newbie
  • *
  • Messages: 23
    • Voir le profil
Re : arduino gare cachee
« Réponse #9 le: février 19, 2016, 12:15:35 am »
Bonsoir Bricoleau

Comme je l'explique dans mon projet, j'ai 3 voies dans une gare cachée, chaque ils controle si il y a un train sur sa voie de façon à aiguiller l'arrivée d'un nouveau train sur une voie libre.
Si l'ILS 1 est à 1, et les 2 autres ILS à 0, le train se dirige sur la voie libre. Il déclenche l'ILS 2, s'arrête et l'aiguillage voulu se commute sur la voie libre.
Un troisième train arrive, se dirige vers la voie 3 qui est libre et s'arrête à son tour.
Mon but est que dans le cas des 3 voies occupées et si un nouveau train arrive, l'Arduino et le programme voulu, libère une voie, de préférence de façon aléatoire mais je n'en suis pas là, laissant la place au train arrivant.
Si tu veux plus de détail, je peux te détailler vraiment tout le processus.
La quatrième sortie est justement activée quand les 3 ILS sont activés, c'est à dire quand les 3 voies sont occupées et pour l'instant me sert à faire des essais...
Je te précise que c'est mon tout premier programme avec Arduino et que je patauge quand même un peu.
Merci à toi

Cordialement
Marc

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : arduino gare cachee
« Réponse #10 le: février 19, 2016, 09:23:55 am »
Bonjour Marc.

Ce qu'essaye d'expliquer bricoleau est que, en l'état le programme ne fonctionnera pas car il fait des suppositions sur le fonctionnement des ILS qui sont fausses. En effet, en utilisation réelle, le déclenchement de l'ILS sera fugace et par conséquent il faudrait que le programme mémorise ce déclenchement dans un variable booléenne par exemple. Cette variable sera remise à false quand le programme fera quitter la voie au train.

Ceci dit, comme tu simules, les conditions sont différentes et tu fais sans doute en sorte que les 3 ILS soient déclenchés en même temps.

Mais il faut également filtrer les ILS. En l'état unit est incrémenté à chaque fois qu'un des ILS est déclenché. Or si le même ILS reste déclenché d'une exécution de loop à la suivante, unit est incrémenté 2 fois pour ce même ILS et au moment où le programme le teste, il ne vaut jamais 3 et unit dépasse cette valeur. Supposons par exemple le scénario suivant : à la première exécution de loop un train déclenché l'ILS 1 unit est incrémenté. A la seconde exécution unit est incrémenté une seconde fois. A la 3e exécution de loop, un second train arrive et déclenché l'ILS 2, unit est incrémenté 2 fois, une fois pour l'ILS 1 et une fois pour l'ILS 2. Au moment du test il vaut 4 et n'a jamais valu 3.

Ce qui t'intéresse en fait c'est le passage de LOW à HIGH pour chaque ILS. Le mieux est d'utiliser une bibliothèque qui fait ça pour toi. Par exemple Button : http://playground.arduino.cc/Code/Button
La fonction uniquePress est celle qu'il te faut.
« Modifié: février 19, 2016, 10:36:50 am par Jean-Luc »
Cordialement

marc

  • Newbie
  • *
  • Messages: 23
    • Voir le profil
Re : arduino gare cachee
« Réponse #11 le: février 19, 2016, 11:17:47 am »
Merci à vous deux pour votre aide
Je vais essayer tout cela.

Je n'arrive pas à être très concis dans ce que je veux faire mais ce que je veux réaliser à déjà été fait de façon mécanique sur le site de BISCATRAIN; je ne sais pas si j'ai le droit de donner l'adresse de son site mais je vous la mets : http://www.biscatrain.fr/article-automatismes-en-gare-souterraine-37421540.html
j'avoue me passionner pour la programmation et je vais acheter sans tarder un livre sur l'Arduino. Etes-vous aussi des ferrovipathes?
Bonne journée à vous

cordialement
Marc

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : arduino gare cachee
« Réponse #12 le: février 19, 2016, 05:49:25 pm »
C'est un forum qui regroupe des individus ayant à la fois deux maladies :
- ferrovipathes
- arduinopathes

 :)
Cordialement

marc

  • Newbie
  • *
  • Messages: 23
    • Voir le profil
Re : arduino gare cachee
« Réponse #13 le: février 20, 2016, 02:02:12 pm »
Bonjour

Dans les ferrovipathes arduinopathes, y a-t-il eu, à votre connaissance quelqu'un qui a été confronté au même problème?

Pensez-vous que l'Arduino soit le meilleur moyen pour réaliser ma gare cachée ?

Merci à vous
cordialement
Marc

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : arduino gare cachee
« Réponse #14 le: février 21, 2016, 10:16:56 am »
Bonjour Marc,

Le problème est classique et n'est pas spécifique à l'automatisation en modélisme ferroviaire.

Les capteurs donnent un état, pour les ILS c'est collé ou décollé. Mais ce n'est pas l'état qui est intéressant, c'est le passage d'un état décollé à collé, c'est à dire un événement. En effet, si tu comptes les trains en te basant sur l'état, tu compteras autant de trains que le nombre de fois où tu lis l'état alors que le meme train continue de provoquer le collage de l'ILS.

Il faut donc se rappeler de l'état précédent de chaque ILS et si l'état précédent est décollé et que le nouvel état est collé alors on compte un train. Dans tous les autres cas, on ne compte pas.

Dans le câblage de biscatrain, les relais sont des relais bistables qui ont justement cet effet. Note que si le train passe trop vite, l'impulsion du relai sera trop courte et le système de biscatrain ne fonctionnera pas.

Ton problème est un problème de conception, ce n'est pas un problème de programmation ni un problème lié à l'Arduino. Il faut d'abord bien spécifier le problème, la programmation vient ensuite.

Et pour finir, oui je pense que l'Arduino est la meilleure solution pour ce genre d'automatisme.
Cordialement