Auteur Sujet: Passage à niveau 2 voies double sens  (Lu 12498 fois)

Pilou3837

  • Newbie
  • *
  • Messages: 21
    • Voir le profil
Passage à niveau 2 voies double sens
« le: octobre 15, 2021, 05:25:53 pm »
Bonjour,
Completement débutant en Arduino, j'ai tenté de modifier le projet PN TIB de Christian Bezanger pour tenter de l adapter à mon projet .
 * PN_2Feux_Barrieres_SortieSon_InitOuvert.ino
 * *****************************************************************************
 * Programme developpe pour le projet de PN Pierre.
 *2 voies a et b double sens pn delimité par 2 zones Zone a et Zone b
 *2 capteurs de detection de train  en debut et fin de chaque zone
 * Il prend en compte l arrivee du train, le clignotement des feux en simulant
 * une ampoule a filaments, un delai avant mouvement des barrieres,

 * le mouvements des deux barrieres sur 90° d amplitude (depend de
 * la transmission adoptee).
 * Le programme s'initialise barrieres ouvertes
 * La LED_SON est allumee tant que sonnerie doit jouer ; cette sortie commande
 * le module sonore.

Je vous poste mon sketch modifié pour contrôle et recommandation.
Je ne suis pas sur du tout confiant  pour le void loop et la gestion des changements d'état .

Merci de votre aide et de vos conseils

msport

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2218
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
Re : Passage à niveau 2 voies double sens
« Réponse #1 le: octobre 15, 2021, 09:49:20 pm »
Bonsoir,

Avant tout formalisez la logique du programme modifié.

ensuite, je vous suggère de vérifier le respect du langage Arduino et d'arriver à un sketch qui passe à la compilation.

Vérifiez les déclarations des variables que vous utilisez et l'usage qui en est fait ensuite.

Pour la mise au point de votre programme, placez des Serial.print sur les variables clés pour savoir où votre programme passe et quelles valeurs vos variables ont là.
« Modifié: octobre 15, 2021, 09:52:24 pm par msport »
Cordialement

Pilou3837

  • Newbie
  • *
  • Messages: 21
    • Voir le profil
Re : Passage à niveau 2 voies double sens
« Réponse #2 le: octobre 16, 2021, 09:11:42 am »
Merci,
Je vais retourner bosser
Mais cela ne m avance pas beaucoup…
Je suis un vrai débutant je maitrise un tout petit peu
La où je coince entre  autre  c est sur les changements d état des zones occupées ou libres
Et donc comment un capteur devient soit entrant soit sortant
Et pas très à l aise avec les Isr


chris_bzg

  • Global Moderator
  • Sr. Member
  • *****
  • Messages: 310
    • Voir le profil
Re : Passage à niveau 2 voies double sens
« Réponse #3 le: octobre 16, 2021, 10:35:03 am »
Bonjour,

En tant qu'auteur des articles, je vais essayer de vous donner un coup de main pour arriver au bout de votre projet.

Si j'ai bien compris, votre PN diffère du PN-TIB par le fait qu'il y a deux voies à protéger. C'est donc en comprenant bien le principe de détection décrit au chapitre 1 que vous arriverez à réaliser votre projet. Et déjà, j'aimerais savoir si vous y arrivez car le programme que vous donnez réalise l'ensemble de toutes les fonctions du PN y compris le son.

Or, je pense l'avoir dit, un projet doit se construire par étapes et pour vous, la première étape est déjà de détecter l'occupation des voies. Vous ajouterez le reste ensuite et vous verrez que si cette première étape est réussie, le reste coule de source.

J'ai un peu regardé votre programme ; vous voulez que le programme s'initialise barrières ouvertes. Dans ce cas, pourquoi initialisez-vous à true les variables etatZonePN ? (lignes 39 et 41)

Les capteurs n'ont pas besoin de passer de entrant à sortant : ils ne font que détecter un survol, donc le fait qu'un engin entre ou sort de la zone surveillée. Et ce sont justement les conditions d'initialisation qui font qu'on saura si l'engin entre ou sort. Ces conditions seront à respecter sur les deux voies.

Quant aux ISR, elles ne font que changer le statut de la zone. Et c'est le programme principal qui fait le reste.

J'espère vous avoir un peu aidé. Faites les choses progressivement, étape par étape. C'est à ce prix que vous maitriserez. Je dois encore étudier votre programme pour voir s'il est bien conçu et ceci peut prendre du temps.

Je vous propose donc pour la suite de partir du programme de l'article 1 et le transformer jusqu'à ce qu'il détecte bien les trains sur les deux voies. Le reste viendra en son temps.

Bonne programmation.

Christian

chris_bzg

  • Global Moderator
  • Sr. Member
  • *****
  • Messages: 310
    • Voir le profil
Re : Passage à niveau 2 voies double sens
« Réponse #4 le: octobre 16, 2021, 11:08:32 am »
Je viens de me pencher sur votre programme.

Tout d'abord, il m'a fallu corriger plusieurs petites choses avant que la compilation puisse avoir lieu. La moindre des choses est déjà de nous donner des programmes qui passent la compilation sans problème. Dans votre programme, des variables n'étaient pas initialisées (old_top_debutISR_a et old_top_debutISR_b par exemple) et des erreurs de syntaxes comme Low à la place de LOW ou encore rising à la place de RISING).

D'ailleurs, pourquoi utilisez-vous RISING alors que mon programme utilise FALLING ? Vos détecteurs sont différents et produisent un signal HIGH au lieu de LOW ? Je ne pense pas.

Encore une fois, il faut y aller par étape. C'est aussi nécessaire pour que nous puissions vous aider car reprendre le programme de quelqu'un demande du temps et plus ce programme est court, moins il en faut et plus on trouve vite ce qui cloche. A partir de là, on vous donnera un programme qui fonctionne et vous le complèterez.

Vous y arriverez, d'autres y sont parvenus alors vous y arriverez.

Bon courage (et ne nous envoyez plus de programme qui ne compilent pas, corrigez les d'abord).

Pilou3837

  • Newbie
  • *
  • Messages: 21
    • Voir le profil
Re : Passage à niveau 2 voies double sens
« Réponse #5 le: octobre 16, 2021, 11:30:07 am »
Merci pour tout ces conseils très constructifs.

Je vais tenter de reprendre le projet au niveau de la détection des zones uniquement.

J utilise des détecteurs de courant  DCC qui bascule un relais, Viessman 5206 que j avais sur un vieux réseau j ai fait le choix high 5v si relais coller train détecté d ou mon choix de Rising , mais je pourrais inverser la sortie du relais et rester sur low 0v et donc falling au moment de la détection.relais non collé.
 Je vais regarder tout cela tranquillement
Encore merci
Pierre

chris_bzg

  • Global Moderator
  • Sr. Member
  • *****
  • Messages: 310
    • Voir le profil
Re : Passage à niveau 2 voies double sens
« Réponse #6 le: octobre 16, 2021, 11:54:49 am »
Je comprends mieux.

Commencez toujours par vous rapprocher le plus possible des conditions du programme donné dans un article (car il fonctionne et a été testé). Et si le votre fonctionne aussi, alors il sera possible de modifier.

Je vais vous laisser cogiter un peu et j'ai déjà une solution à vous proposer (que vous pourrez tester chez vous).

Partez de deux variables etatZone_A et etatZone_B dont la valeur est modifiée par les ISR ; dans le programme principal, commencez par déterminer ce que vaut la troisième variable etatZonePN (ceci était bien fait dans ce que j'ai lu). A partir de cette valeur de troisième variable, le reste du programme est identique à ce que j'ai publié.

Si vous progressez par étape, je suis certain de votre réussite.

chris_bzg

  • Global Moderator
  • Sr. Member
  • *****
  • Messages: 310
    • Voir le profil
Re : Passage à niveau 2 voies double sens
« Réponse #7 le: octobre 16, 2021, 02:07:19 pm »
Juste une dernière précision :
Puisque vous utilisez des détecteurs d'occupation, le programme que j'ai écrit ne peut plus convenir. En effet, ce programme est prévu pour traiter des événements de courte durée (déclenchement d'ILS) d'où la nécessité de recourir aux interruptions pour ne pas louper d'événements.
Or un détecteur d'occupation va délivrer un signal pendant une durée plus longue (tant que la voie est occupée). Ce signal, dans la mesure où il est ramené à une tension comprise entre 0 et 5V, peut être présenté à une entrée d'Arduino. Dans le programme principal, il suffit alors de commencer par lire l'état de l'entrée pour en déduire l'état d'occupation.
C'est donc encore plus simple.
Je n'avais pas percuté sur ce point car dans votre programme, vous continuez à appeler les entrées par 'ILS'. Il aurait mieux valu les appeler autrement, comme par exemple 'detecteur_A' ou bien 'signalOccupation_A'.
Cette fois, c'est à vous et j'attends de vos nouvelles.

Pilou3837

  • Newbie
  • *
  • Messages: 21
    • Voir le profil
Re : Passage à niveau 2 voies double sens
« Réponse #8 le: octobre 16, 2021, 05:09:34 pm »
Bonjour,

J'ai tenté de tenir compte de toutes vos remarques précieuses et j'ai drastiquement simplifié le sketch. cf pj
Pour les détecteurs de courant  c'est effectivement une zone 20cm isolée qui sert de détection  en amont du pn ( et en aval )
Par contre je n'ai pas déclarer de troisième variable  zone Pn  je n'en voyais pas l'interet, mais je peux me tromper !

En tout merci  pour vos conseils

Pierre


Pilou3837

  • Newbie
  • *
  • Messages: 21
    • Voir le profil
Re : Passage à niveau 2 voies double sens
« Réponse #9 le: octobre 16, 2021, 06:14:21 pm »
Annule et remplace le precedent fichier.
Pierre

chris_bzg

  • Global Moderator
  • Sr. Member
  • *****
  • Messages: 310
    • Voir le profil
Re : Re : Passage à niveau 2 voies double sens
« Réponse #10 le: octobre 16, 2021, 06:41:20 pm »
Bonjour,

J'ai tenté de tenir compte de toutes vos remarques précieuses et j'ai drastiquement simplifié le sketch. cf pj
Pour les détecteurs de courant  c'est effectivement une zone 20cm isolée qui sert de détection  en amont du pn ( et en aval )
Par contre je n'ai pas déclarer de troisième variable  zone Pn  je n'en voyais pas l'interet, mais je peux me tromper !

En tout merci  pour vos conseils

Pierre

Je vais regarder le nouveau sketch.

En déclarant une variable etatZonePN, vous vous retrouvez dans la même situation que ce que j'ai publié. Mais vous avez raison, on peut s'en passer, donc à vous de voir. Cette variable a aussi l'avantage de donner un programme plus facile à lire et à comprendre.

Par contre, vos zones de détection ne protègent pas l'ensemble du PN comme je l'ai expliqué dans l'article 5. Il va donc falloir tenir compte de cette particularité pour faire en sorte que les barrières ne se relèvent pas trop tôt. Mais il y a une solution que vous trouverez plus facilement que moi parce que vous pourrez faire des essais. Un schéma de votre réseau me permettrait de me rendre compte.

Comme vous le voyez, ça avance.

Pilou3837

  • Newbie
  • *
  • Messages: 21
    • Voir le profil
Re : Passage à niveau 2 voies double sens
« Réponse #11 le: octobre 16, 2021, 07:04:58 pm »
merci, le croquis de mon reseau pour vous eclairer.
je pense que j'ai assez de place entre PN et detection sur mon reseau pour laisser passer les plus longs trains, ceci étant, je peux aussi rajouter un délais avant ouverture des barrieres dès fin de detection.


Pierre

chris_bzg

  • Global Moderator
  • Sr. Member
  • *****
  • Messages: 310
    • Voir le profil
Re : Passage à niveau 2 voies double sens
« Réponse #12 le: octobre 16, 2021, 07:14:37 pm »
Je viens de regarder le nouveau sketch. Déjà il compile, c'est un progrès  ;)

Par contre, je l'ai essayé sur un simulateur Tinkercad et il ne fonctionne pas. Dès la mise en route, la LED_BUILTIN s'allume et en envoyant un signal de détection, rien ne se passe.

En modifiant les lignes 26 et 27, on arrive à le faire fonctionner.

Tout d'abord, je suppose que vos détecteurs envoient un signal LOW quand ils détectent puisque vous utilisez INPUT_PULLUP (le signal est HIGH en temps normal).

Ensuite, lorsque vous écrivez etatZone_A=digitalRead(CaptA); ce n'est pas orthodoxe. En effet, etatZone_A est un booléen (true ou false) alors que la lecture de l'entrée donnera LOW ou HIGH. Pour la beauté des choses et la compréhension par d'autres programmeurs, il vaut mieux écrire :

  if(digitalRead(CaptA)==LOW) {
    etatZone_A = true;
  }
  else etatZone_A = false;


Donc, en remplaçant les lignes 26 et 27 par ce que j'ai écrit, votre programme fonctionne sur Tinkercad et est plus facile à comprendre.

Bravo à vous tout de même pour ces changements. Je vous propose maintenant de tester en réel, sur votre réseau, ce fonctionnement pour voir si les zones de détection sont suffisantes pour protéger l'ensemble de la zone située de part et d'autres du PN. Une temporisation est peut-être une bonne idée. Et après cela, il sera temps de passer aux feux puis aux barrières. On en reparlera...

chris_bzg

  • Global Moderator
  • Sr. Member
  • *****
  • Messages: 310
    • Voir le profil
Re : Passage à niveau 2 voies double sens
« Réponse #13 le: octobre 16, 2021, 07:22:07 pm »
Vu le plan, votre montage équivaut à surveiller la frontière des zones, comme ce que j'ai publié.
C'est un peu dommage de ne pas avoir suivi le schéma que j'ai publié dans l'article 5 alors que c'était l'intérêt des détecteurs d'occupation. Mais je ne veux pas vous faire tout modifier. Il y aura d'autres solutions, logicielles cette fois : Arduino sait s'adapter à ce qui existe !

Pilou3837

  • Newbie
  • *
  • Messages: 21
    • Voir le profil
Re : Passage à niveau 2 voies double sens
« Réponse #14 le: octobre 16, 2021, 09:18:41 pm »
Merci beaucoup
j appreciie enormement vos conseils

Je vais potasser encore sur le sujet...

Pierre