Détection de présence d'un train pour la fermeture d'un passage à niveau

Bonjour,

Voici le tracé de mon circuit en 3 voies Marklin pour mon garçon de 10 ans.
Celui-ci aimerait un passage à niveau indiqué sur le schéma. Il a choisi un passage à construire soi-même.
J’ai l’interface Arduino qui permet de commander les barrières et les feux.

Mon problème est que je ne sais pas très bien comment détecter la présence d’un train ou wagon pour fermer/ouvrir ses barrières.

J’ai regardé avec des captreurs ILS, j’ai peur que l’iamant ce passe pas sous la loco, de plus j’aurais besoin d’un aimant aussi sur le dernier wagon.

J’ai regardé l’info sur l’occupation des voies, mais je ne vois pas comment envoyer le signal sur une entrée de l’arduino.

Auriez-vous des conseils ou autres idées?

Je précise que je n’ai qu’une mobile station 2. Le S88 est donc à oublier :frowning:

Merci à tous.

Philippe.

Bonjour Philippe et bienvenue sur 3 Rails

Tu ne veux pas utiliser de S88, et pourtant il faut s’en inspirer.

Pour un seul contact tu peux reproduire l’entrée d’un S88. La puce derrière a les mêmes caractéristiques que l’Arduino. Il faut deux résistances, un petit condo et une entrée sur Arduino par contact.


La résistance d’entrée (R1) protège l’Arduino des tensions du signal digital. Mettre une valeur basse plus basse que 4K7 risque de cramer l’Arduino en cas de contact entre les picots et le rail de détection.
La masse de l’Arduino doit être connectée à la masse des voies (le fil brun, ou marque ‘O’ dans le système Märklin).
Tu peux aussi ajouter les deux diodes tel que recommandé pour les S88.

Si il y a plusieurs contacts à lire, l’Arduino doit facilement pouvoir interfacer le bus S88 au moyen du SPI. Je rechercherai les détails au cas où cela intéresse. (Mais je ne garantis aucun délai).

Avec cela tu peux utiliser la détection par rail isolé, la plus adaptée dans ce cas.

Bonne suite

Sylvain

Bonjour Sylvain,

Déjà un tout grand merci pour la réponse.
En Fait j’aurais besoin de 2 capteurs (D1 & D2) sur le schéma afin de fermer/ouvrir le PAN et ce quelque soit la direction du train.

Pour ce qui est SPI, je veux bien les schémas aussi :wink:

Je suppose que je dois isoler les deux rails latéraux ?

Encore merci.

philippe.

Eu non, il ne faut qu’une seule zone de détection entre D1 et D2. Quand cela devient occupé, le PN se ferme, et quand ce n’est plus occupé, le PN s’ouvre.

Bonne suite

Sylvain

Re bonsoir

Pour la détection, il faut isolé un rail, entre le début et la fin de la zone de détection. On en parle assez sur le forum.

Le s88 s’interface avec 6 connections.

  • VCC et GND, pas de surprise c’est l’alimentation de l’Arduino.
  • Load et Reset sont à brancher sur des E/S libres l’Arduino, ils seront à commander donc en mode sortie.
  • Clock, reprend le SCK du SPI (broche 13)
  • Data, reprend le MISO du SPI (broche 12)
    La sortie MOSI du SPI n’est pas utilisée (mais va fatalement travailler, donc n’est pas utilisable).

L’étude est plus sur le code, il faut prendre le bon mode SPI, et générer les bons signaux Load et Reset.
Il faut faire 2 lecture d’un octet par s88.

Jusqu’à présent j’ai juste évalué la faisabilité, mais je n’ai pas été dans le détail. Les points à définir sont quelle polarité, quelle mode SPI et les timings à respecter.

Tous les éléments sont facilement trouvables sur le net.

Bonne suite

Sylvain

Re Bonsoir,

Super, je vais regarder à ça!
Donc, si j’ai bien compris, le schéma ci-desous devrait fonctionner pour la détection?

Encore un tout grand merci!

Philippe.

Niet, là cela ne marchera pas.

Ce que tu dessine c’est une détection par consommation de courant puis couplage optique qui s’utilise d’une manière différente. (et presque inverse)
C’est l’équivalent du récent S88 DC qui n’est pas le S88 de base maintenant appelé S88AC par Märklin.

Mes explications étaient données pour le S88 de base (ou S88AC) puisque c’est le seul qui peut détecter les wagons.

Sylvain

Ah Ok!!! je ne savais pas!
Merci pour l’info!

Donc, le schéma ici devrait fonctionner alors?
Encore merci :wink:

Bonsoir

Oui c’est cela

Bonne suite

Bonjour Sylvain,

Voilà, j’ai fait le test aujourd’hui.
J’ai utilisé R1=10K, R2=100K, par contre pour la capa, j’ai du placer une 10µF à la place d’une 10nF.
Pour éviter parfois les micros coupures…

Quand vous utilisez ce système, vous placez quoi comme valeur de Résistances et Capa en général?

Meric et bonne soirée.

Philippe.

Bonjour Philippe

J’ai les valeurs qui tu indiques 10K, 100K et 10n. Ma première réalisation était en 1K, 10K, 100n, mais le courant dans les diodes de protections des entrées de la puce est trop important en cas de contact avec le signal digital.

Par contre il y a un anti-rebond logiciel. A l’activation c’est immédiat, mais à la libération il y a un délai de 200ms au minimum.

Avec le condo de 10u tu fais pareil mais symétrique.

Bonne suite

Sylvain

Bonjour Sylvain, bonjour tout le monde,

Je suis tombé sur ce fil et je voudrais savoir si en utilisant le schéma du post de Kaon 230 (celui du 8/11), et que je remplace le rail de contact par un ILS (Interrupteur Lame Souple) comme ci dessous, est ce que ça fonctionne ? Si oui , quelle doit être la tension au bornes de l’ILS ?

Merci de ta réponse,
Cdlt,

Claude papaciela

Bonjour Claude,
Le second point de l’ils (en l’air sur ton schéma), se branche à la masse (GND). Du coup, quand l’ils est ouvert, l’entrée de l’arduino est à +5V au travers de la 100K. Il n’y a pas de courant à circuler dans la 10K car le circuit est ouvert.
Quand l’ils est fermé (passage de l’aimant), un point de la 10K est mis à la masse par le contact de l’ils. Du coup, l’entrée de l’arduino est au environ de +0,5V du fait du diviseur de tension formé par la 100K et la 10K.

Ce montage délivre une impulsion lors du passage de l’aimant, et non pas un état permanent :innocent:.

A+ Rémy

1 « J'aime »

Bonjour Remy,

Merci de ton explication. Si je comprends bien, il faut une “continuité” (état permanent) pour que l’Arduino “marche”.
Donc, un contact de relais pourrait faire fonctionner le truc. Le relais serait activé à travers un système bi-stable (a base de 555 par exemple) avec deux l’ILS : Un pour coller le contact le temps que le programme Arduino se fasse, l’autre pour remettre à “zéro” une fois que l’opération de l’Arduino est terminé.

Cdlt,

Claude papaciela

Claude,
L’arduino peut détecter une impulsion, pas de pb. C’est à toi d’y mettre le programme qui fera ce que tu souhaites en fonction de l’apparition de l’impulsion.
Ne sachant pas à quoi tu destines ton montage, on peut imaginer ce que l’on veut au travers du programme de l’arduino, comme transformer une impulsion sur une entrée de l’arduino en état stable sur une sortie.
Et après une tempo intégré dans le programme, relâcher la sortie.
A+ Rémy

Bonjour Remy,

Je crois que je vais outrageusement profiter de ta patience, de ton temps et surtout de tes connaissances de l’Arduino.
J’ai un programme, “construit” en utilisant ce qui se trouve sur le web et modifier pour mettre en rotation un servo moteur (qui va faire tourner une grue à charbon). La séquence complète est le suivante :
Rotation du point "0 ° " vers point "100 ° " , pause, retour de 100 vers 0, pause.
Cette séquence se répète cinq (5) fois et le programme stoppe.
Mais tout ça fonctionne avec l’Arduino connecté à l’ordi …ce qui, bien sur, n’est pas vraiment pratique, d’où mon intérêt pour ce fil.
Je voudrais en fait pouvoir ajouter les lignes nécessaires et suffisantes à mon programme pour qu’il soit “autonome” vis à vis de l’ordi.
Donc, soit avec détection par rail, soit par ILS (un seul ILS ou deux avec de l’électronique et système bi-stable), soit par fermeture du contact d’un relais, bref installer l’Arduino, son alimentation, le “truc” qui lance le programme pour que cette grue “tourne” SANS la connexion à l’ordi.)
Voila le programme (code chez Arduino )

#include <Servo.h>
Servo myservo;
int pin_servo = 6;
int pos = 0;
int angle_initial = 0;
int angle_final = 100;
int increment = 1;

bool angle_actuel = false;
int compteur(0);



void setup()
{
Serial.begin(9600);  
while(!Serial){;}
myservo.attach(pin_servo);

for(compteur =0 ; compteur<5;compteur++)
{
for(pos = angle_initial; pos <= angle_final; pos += increment)
{ 
myservo.write(pos);              
    delay(55);   
    if (angle_actuel)
    {
        Serial.println(myservo.read());
}
}
delay(3000);
{
for(pos = angle_final; pos >= angle_initial; pos -=increment)
{
  myservo.write (pos);
  delay(55);
  if (angle_actuel){
    Serial.print(myservo.read());
  }
  }
delay(3000);
}
}
}
void loop(){
}

La chose n’est pas d’une urgence absolue,
En te remerciant par avance
Cdlt

Claude papaciela

Bonjour Claude,

Désolé de te décevoir, mais vu mes compétences en informatique (je ne suis pas informaticien, mais électricien), je ne suis pas capable de concevoir un programme. J’arrive tout au plus à modifier quelque chose d’existant, en particulier en adaptant les entrées sorties pour mon application.

Cependant, par rapport à ton projet et après l’avoir soumis à un collègue programmeur, ce que je peux dire d’après lui, c’est que tu devrais avoir 4 parties distinctes pour faire ton application.

Une partie initialisation (void setup ) ou tu vérifies et/ou positionne ta grue au repos.

Une partie détection de commande (void entrée) qui va surveillé que l’entrée change d’état (impulsion ou état stable) et qui positionnera une variable d’action en sortie.

Une partie rotation de la grue (void cmd_grue) qui sera déclenchée en fonction de la valeur de la variable d’action.

Une partie programme principal qui lancera les deux fonctions précédentes et en fonction du retour des variables exécuteras une action en fonction du besoin. En fait, cette partie passe son temps à attendre que la sortie de la fonction (void entrée) change d’état.
Sur ce changement d’état elle déclenche la rotation de la grue (void cmd_grue).
A la fin de la rotation de grue, elle se remet en attende pour le prochain déclenchement.

Désolé de ne pouvoir faire plus pour ton besoin. Il y a surement sur le forum des informaticiens chevronnés qui pourront t’aider pour avancer dans ta conception.

A+ Rémy.

2 « J'aime »

Bonjour Remy,

Pas de soucis, je comprends. Je vais voir sur le web.

Merci encore de ta patience,

Cdlt,

Claude papaciela

Hello

Il me semble t’avoir donné un programme qui répond au squelette mentionné par Rémy :slight_smile: il faut ajouter effectivement la lecture d’une entrée pour déclencher le mouvement dans la loop().

Je peux t’écrire le programme définitif si tu es au clair sur ton hardware. On peut échanger sur le sujet.

@+

Bonjour Julie,

Tout d’abord, merci de ta proposition, que j’accepte bien sur.
Seulement, je ne voudrais pas être “gavé” comme une oie. Il faut que j’essaie de me demerd… Donc, je vais aller voir tes programmes du paparazzi, de la fosse ,qui, selon mon souvenir, font intervenir un rail de contact.
De plus, sauf erreur, ce rail de contact se comporte en fait comme un interrupteur ou comme un contact de relais ou même un contact d’un décodeur M84 (si ne me trompette pas). Qd l’ essieu du wagon fait la liaison entre le rail non coupé et la portion de rail isolé, le “jus” passe et initie le démarrage de la carte Arduino, non ?
En fait c’est ca que je veux faire, démarrer mon Arduino avec autre chose que la connexion avec l’ordi.

Mais rentre d’abord chez toi, je ne suis pas à la minute pour ça.
Merci encore,
cdlt,

Claude papaciela