Auteur Sujet: Apprentissage electronique et arduino pour résau ferroviaire  (Lu 12443 fois)

Dlpmaire

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Bonjour,

Suite au cours de Christian Bézanger sur l'éléctronique je me suis inspiré pour découvrir la programmation de l'arduino dans le but "d'informatiser"mon futur réseau : le "Train Des Alpes"

J'ai donc formalisé le contenu du chapitre 23 "La commande du réseau".

J'ai utilisé un arduino Nano et un ecran LCD_I2C.
Je me suis appliqué à comprendre le fonctionnement les différentes phases du programme en y indiquant le déroulé sur un écran LCD (avec la fonction "afficheLcd") et le moniteur de l'IDE (avec la fonction "sp").

Le programme se veut avant tout didactique pour moi en vue de me sensibiliser à la programmation.

Des photos et le programme joints seront plus utiles pour la compréhension de mon petit montage.

Je prévois d'améliorer ce tableau de commande en y ajoutant deux bandes de led néopixel pour simuler le déplacement des trains mais là il faudra prévoir un arduino micro voir un arduino Uno.......

Je tiens à remercier Christian Bézanger pour la qualité des ses articles.

Dlpmaire

Dlpmaire

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Apprentissage electronique et arduino pour résau ferroviaire
« Réponse #1 le: mai 04, 2017, 05:59:20 pm »
Bonjour,

J'ai apporté une amélioration toujours dans un but didactique avec la création d'une "BASCULE" permettant ainsi de choisir le mode manuel ou automatique au niveau de l'ILS: manuel on appuie le bouton ILS),  automatiquement (plus besoin d'appuyer sur le bouton ILS).

Pour ceux qui ont téléchargé le 1er fichier de programmation voici le nouveau.... il a été modifié, pour être le moins possible dans la répétion des données et alléger ainsi le programme.
Les Portions d'arrêt sont représentées en Tension avec led allumée, Hors Tension avec led éteinte.
Activation de la boucle While controlant l'ILS ou non.
Innitialisation de l'interrupteur nommé "BASCULE".

J'attends le ruban de  "led néopixel". A leur reception on améliorera..... A suivre.....

Bien à Vous

Dlpmaire

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 904
  • HO avec DCC++
    • Voir le profil
Re : Apprentissage electronique et arduino pour résau ferroviaire
« Réponse #2 le: mai 05, 2017, 07:28:10 am »
Bonjour,

Je me permets juste une petite suggestion concernant les lignes 153 à 157 de ton code :

//Selection mode auto_manuel
  if (digitalRead(BASCULE) ==  1) {
     while (digitalRead (ILS) == HIGH) {   // on attent le retour du train 1
     }
  }

La boucle while est infinie si aucun événement ne se produit, ici tant que ILS == HIGH. Or on sait qu'un ILS peut être un peu "capricieux". Quid donc si ton train passe sur l'ILS qui ne commute pas ?



Il serait à mon sens judicieux de dire que si au bout de x secondes l'ILS ne s'est pas commuté, alors j'arrête le train. Le principe du conducteur qui lâche les commandes d'un train trop longtemps.

Par ailleurs, puisque tu dis que ton montage à un "but didactique", je pense que tu devrais utiliser les interruptions pour détecter la commutation de ton ILS. Voir l'article de Jean-Luc à ce sujet : http://www.locoduino.org/spip.php?article64

Comme je le disais plus haut, les boucle while sont infinie et bloquent finalement le programme si l'événement ne se produit pas. Sous interruption, c'est l'inverse, le programme se déroule, jusqu'à ce qu'un événement soit intercepté. Plus prudent et élégant à mon sens.

Bien amicalement.

Christophe

Dlpmaire

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Apprentissage electronique et arduino pour résau ferroviaire
« Réponse #3 le: mai 06, 2017, 12:19:21 pm »
Bonjour,

Merci pour pour la suggestion. En effet si ma loco faute à un disfonctionnement venait à sortir du réseau et à choir sur le sol, cela ne ferait pas propre  :) :)

Pour le "but didactique" de mon montage, comme tu le soulignes, il est didactique avant tout pour mon apprentissage de la programmation pour un réseau ferroviaire.

Je vais donc suivre ton conseil et me pencher sur la notion d'interruption d'autant que je découvre la gestion des cantons et leur signalisation avec comme délimitation des ILS (à lame souple). A ce sujet je me demande si le capteur infrarouge serait plus fiable ou non ?

Bien à Toi

Daniel

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 904
  • HO avec DCC++
    • Voir le profil
Re : Apprentissage electronique et arduino pour résau ferroviaire
« Réponse #4 le: mai 06, 2017, 10:18:40 pm »
Bonsoir Daniel,

Concernant l'ILS, il n'y a pas particulièrement de problème de fiabilité (pas plus que pour un IR) si l'on respecte bien les pullup (ou pulldown). C'est surtout que le temps de commutation peut être très court et si la boucle (loop) est longue à s'exécuter, cette commutation peut être ignorée par le programme. Problème résolu dans le cas de l'interruption. Néanmoins, il est sans doute prudent d'avoir deux modes de détection : soit deux ILS à quelques centimètres de distance, soit un ILS et un IR ou détection de courant. Personnellement je me simplifierais la vie avec deux ILS.

Par ailleurs, si le temps de parcours jusqu'à l'ILS est à peu près constant, tu peux mettre une sécurité qui arrête ta loco avec la fonction millis() si le ou les ILS n'ont pas commutés après ce temps plus quelques secondes ou dizaines de secondes.

Bien amicalement.

Christophe 

Dlpmaire

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Apprentissage electronique et arduino pour résau ferroviaire
« Réponse #5 le: mai 10, 2017, 10:13:17 pm »
Bonsoir Christophe,

Je suis en train de travailler sur la fonction "millis()".

Je test mon programme sur une plaque à essai où j'ai mis une led témoin VOIE qui s'éteint si hors tension. J'ai une autre led qui fait office d'alerte en clignotant et met hors tension la VOIE.
J'ai également mis en place un bouton poussoir qui remet en tension la VOIE.
J'en suis là.

Il me reste maintenant à intégrer ce programme avec ma boucle WHILE de mon programme principal et à intégrer sur ma tablette le bouton poussoir, la led. mais aussi à  programmer un nouvel ILS ou IR  pour mieux exploiter la fonction "millis()".

J'avoue que la notion d'interruption me semble pas claire et de fait difficile à m'imaginer sa fonctionnalité avec ou sans "millis()".
 
Merci pour tes conseils.

Daniel
« Modifié: mai 11, 2017, 09:02:54 am par Dominique »

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2889
  • 100% Arduino et N
    • Voir le profil
Re : Apprentissage electronique et arduino pour résau ferroviaire
« Réponse #6 le: mai 11, 2017, 09:49:49 am »
Bonjour Danièl,

Je pense qu'on peut dire que ton programme est plutôt mal conçu et n'a pas la valeur didactique que tu souhaites.
Si tu veux intégrer d'autres ILS, d'autres boutons, d'autres Leds, tu n'y arriveras pas !

Il faut toujours avoir en tête que la loop() est une boucle qui se répète indéfiniment. A l'intérieur de la loop(), il doit y avoir une suite d'actions (conditionnées par des tests) et RIEN qui l'arrête : Donc il est interdit d'écrire ça :
while (digitalRead (ILS) == HIGH) {   // on attent le retour du train 1
     }
Car ton programme s'arrête si la condition n'est pas réunie !

A la place il faut écrire :
if (digitalRead (ILS) == HIGH) {   // au retour du train 1
    //faire ce qu'il y a à faire dans ce cas
     }

Autre anomalie à fuir systématiquement car cela stoppe aussi ton programme (plus rien ne se passe pendant ce temps et, comme le disait Christophe, rien n'empêche ta loco de sortir des rails à l'improviste) :
delay(attente_0);
A la place il faut utiliser une variable globale
long int temps_0
Quand tu veux démarrer la tempo tu écris
temps_0 = millis();
Quand tu veux tester la tempo pour savoir si la durée attente_0 est atteinte, tu écris :
if (millis() - temps_0 >= attente_0) {
      // faire ce qu'il faut faire quand la tempo attente_0 est atteinte
      }

Maintenant que plus rien ne bloque ton programme, il faut repenser entièrement ce que tu veux lui faire faire en étudiant toutes les actions possibles et toutes les conditions qui permettent de réaliser ces actions, sachant que la loop() va répéter tout cela indéfiniment et très rapidement.

Il faudra donc utiliser des variables d'état pour chaque action, qui autorisent chaque action dans un test if.

Tu trouveras des tonnes d'exemples sur Locoduino qui te montrent comment faire tout cela, comme celui de cet article :
http://www.locoduino.org/spip.php?article117

Si tu as besoin de plus d'explications n'hésites pas à demander.

Cordialement
Dominique
« Modifié: mai 11, 2017, 02:40:11 pm par Dominique »
Cordialement,
Dominique

Dlpmaire

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Apprentissage electronique et arduino pour résau ferroviaire
« Réponse #7 le: mai 11, 2017, 03:04:14 pm »
Bonjour,

Merci pour ce petit cours de programmation. Grâce à cela ce programme va s'améliorer dans sa conception.

Bien à Toi

Daniel


Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2889
  • 100% Arduino et N
    • Voir le profil
Re : Apprentissage electronique et arduino pour résau ferroviaire
« Réponse #8 le: mai 11, 2017, 03:38:13 pm »
Un autre piège à éviter, est la répétition intempestive des actions liées à une condition qui ne change pas.
Je m'explique :
La loop() va tourner très vite et se répéter par exemple 200 fois par seconde.
Si le test d'un interrupteur se traduit par l'allumage ou l'extinction d'une Led, ce n'est pas gênant.
Mais si le test d'un ILS démarre une tempo, tu risques de redémarrer la tempo 200 fois par seconde et tu auras l'impression qu'elle ne s'arrête jamais.

Pour éviter cela, il faut une variable booléenne de plus qui conditionnera le démarrage de la tempo une seule fois, si elle est vraie par exemple. En changeant cette variable à fausse au démarrage de la tempo, celle-ci ne redémarrera pas une nouvelle fois au tour de LOOP suivant, même si l'ILS est dans le même état actif.

Pour tout ce qui est dans la catégorie des contacts, je te conseille aussi les anti-rebonds comme la bibliothèque Bounce2 par exemple.

Bonne journée.
Dominique
Cordialement,
Dominique