Une débutante dans le décor - Ep6 - Quelques automatismes (Arduino Nano)

Annexe C - Les fichiers des tutoriels Tuto01 à Tuto07

Versions du 21 mai 2021 :

Merci, c’est cool de les avoir en pdf.
Joyeux Noël !
Jean-Luc

1 « J'aime »

Bonjour Julie

Tu as 99% de chance de le fumer accidentellement.
Il n’y a pas de problème de relier la masse (GND) de l’Arduino à la masse ‘O’ du circuit. Faire attention néanmoins de ne pas avoir une boucle par l’ordinateur si celui-ci est également branché à la centrale.

Par contre les entres/sortie de l’Arduino ne doivent jamais dépasser la plage de tension -0.5V à VCC + 0.5V. Pour un rail de contact quand tout va bien la tension c’est soit 0V soit en l’air. Mais la probabilité d’avoir un retour de la tension numérique est proche de 100% (Ne serait-ce que par une loco qui perd brièvement le contact avec l’autre rail. Et dans ce cas l’Arduino va fumer de manière quasi instantanée.

Il faut un circuit de protection entre le rail de contact et l’entrée Arduino. On le trouve sur tous les schémas des S88 et similaires.

Bonne suite

Sylvain

Merci Sylvain,

Effectivement il y a un risque non nul sur un retour même si j’ai prévu des diodes de protection sur le rail de contact ?

Je vais devoir mettre cette protection sur chaque entrée digitale. :slight_smile:

Je vais voir s’il n’existe pas un module tout fait pour interfacer un nano avec ce genre de protection. Car je veux rester dans une démarche plug and play avec un petit coût.

J’ai trouvé une carte bornier mais elle est en prise directe, sans aucune protection.

A+

Bonjour Julie,

Très instructif ton tuto sur l’Arduino. Qqs questions en vrac

Le fil bleu est branché sur un rail (un seul rail à isoler bien sur ?) et non sur le picot central. Exact ?(apparemment puisque tu parles d’essieu conducteur mais bon …).
Ds le programme les lignes précédées de // sont des commentaires (sans action sur le prog lui même) tandis que celles sans // sont celles du prog proprement dit Exact?
Penses tu que l’Arduino puisse piloter un relais double contacts (puissance < à 150-200mA)
Y a-t-il un “dictionnaire” des termes à utiliser pour la programmation de l’Arduino (tous les digitalWrite, serial.println, delay etc…)
Cet Arduino peut-il être commandé par une CS3 dans la réalisation d’événements (un peu comme les M83 pour les aiguilles) ?

Bon assez pour aujourd’hui les questions !!

Cordialement,
Claude papaciela

Bonjour Claude,

Merci pour tes questions en vrac, elles sont très intéressantes pour compléter ce petit tutoriel. Allons-y l’une après l’autre.

J’ai fait un montage similaire à un rail à contact : les plots centraux (ou le rail central pour la fosse) sont connectés au B (Bahn) et l’un des deux rails est connecté au O. L’autre rail est effectivement un fil bleu sur lequel on va détecter la présence d’une tension lorsque qu’un essieu aura établi un contact entre les deux rails (en 3 rails les essieux sont conducteurs). Bien évidemment les deux rails sont isolés en amont et en aval.

Voir le maintenant classique montage avec une éventuelle diode de protection contre les retours de courant :

Tu peux voir aussi le montage que j’ai fait pour la fosse d’inspection ici : Une débutante dans le décor - Ep4 - Kitbashing d’une fosse d'inspection - #36 par Julaye

L’Arduino (tous modèles) se programme en un langage C / C++ (au contraire du Rasberry Pi qui se programme en Python). Parce que le C est le langage le moins gourmand en ressource et particulièrement efficace pour le petit embarqué contraint avec des tailles mémoires petites et des puissances de calcul limitées.

En C et C++, // marque une ligne avec un commentaire et /* */ encode une section de commentaires. Pour ma part, je n’utilise que le //.

Les autres lignes sont du source en langage C / C++ qui est transformé (on dit compilé) en code binaire exécutable par le logiciel Arduino de ton PC (ou de ton Mac), code téléchargé sur la carte pour être exécuté.

Il te faut un relais qui se commande en 0-5V. Arduino propose du double - canal (en réalité c’est une carte avec deux relais indépendant). En fonction de ton usage que je devine, il faut plutot un relais 2RT, et on en trouve en 0-5V pour la commande.

Oui la documentation est très complète : toutes les fonctions de base et les fonctions en bibliothèque (ou encore appelée la librairie qui n’est chargée sur la carte que si besoin).

Tu peux commencer avec ce lien :

Pour chaque fonction comme digitalWrite(), une explication détaillée des paramètres et de la fonctionnalité avec un ou plusieurs exemples d’utilisation.

L’Arduino possède beaucoup d’entrées digitales et certaines peuvent être utilisées pour recevoir des ordres depuis un M83 ou M84, en entrée Pull-up. C’est comme ça que j’ai mis des commandes de forçage allumé / éteint pour mes fosses depuis ma MS2.

L’étape suivante est de faire discuter l’Arduino avec la centrale (ou la mobile Station), en protocole Motorola ou DCC. Mais ceci est une histoire un peu plus compliquée que tu peux trouver sur un site dédiée : https://www.locoduino.org

Ici, je me contente d’utiliser l’Arduino pour réaliser des petits automatismes sympa pour pas cher.

Je vais même rappeler l’esprit de mes tutoriels Arduino : je souhaite utiliser l’Arduino comme petit automate sans utiliser de fer à souder : uniquement des petits modules pas chers que je connecte entre eux autour de cet Arduino Nano, comme un “lego” électronique.

Au besoin, il est toujours possible de prendre une sortie d’un M83 ou un M84 pour lancer une séquence d’un automatisme particulier, par exemple. J’aime bien le M84 configuré en mode 2, il permet d’avoir jusqu’à 8 commandes pull-up par exemple pour autant de fonctions digitales sur l’Arduino.

Mon prochain tutoriel avec un Arduino sera justement de remplacer un servo contrôler horriblement cher de chez Faller pour commander jusqu’à 6 servo moteurs avec cette petite carte de 5 € … (ça marche déjà sur mon petit bureau de Dakar). Et réaliser des petits automatismes du style la locomotive approche, la porte de la remise s’ouvre. Et avoir quand même une commande ouverture de porte depuis un M84.

A suivre,

Un grand merci de toutes ces explications.
J’utilise de la voie K, il faut donc que je prenne des longueurs de voies dont un rail est isolé sur toute la partie qui détectera la présence d’un véhicule. Bon, je fourre ça ds un coin du crâne et je poursuis mes autres travaux.

1 « J'aime »

Bonjour Julie

Cela n’est qu’une réalimentation pour les alternances négatives et éviter les plantages. Ce n’est pas la protection dont je parle plus haut.

Le circuit de protection d’une entrée S88 c’est par exemple ce que l’on trouve sur ce document: http://www.kc-modellbahntechnik.de/modellbahn/images/elektronik/Bausatz_Rueckmeldedecoder_KC%2088.pdf
Une résistance série de 10kohm, suivie d’un condensateur contre la masse et d’une résistance de pull-up de 100kohm. La pull-up externe est nécessaire car elle doit être adaptée à la résistance en entrée (la pull-up interne d’un Arduino a une valeur trop faible).

De cette manière en cas de tension de +20V ou -20V sur les entrées, on limite le courant dans les diodes de protection interne aux CI à 2mA (jusqu’à 3,4 mA peak avec du 24V AC) qui est dans la plage admissible.

Bonne suite

Sylvain

Bonjour Sylvain,

Ok j’ai compris, je n’avais pas conscience de la valeur très faible du pull-up interne d’un Arduino. Je vais voir comment je m’organise pour cette protection, j’aurais aimé la trouver toute faite prête à câbler entre l’Arduino et la voie, pour respecter l’esprit “lego” de mon usage de l’Arduino (pas de fer à souder).

Pour l’instant, j’avais utilisé une petite carte capteur de tension 0-25V -> 0-5V à 1,5 € l’entrée (cf Amazon.fr). C’est peut être la bonne solution pour rester en plug and play. Mais pour 16 entrées à protéger, ça fait quand même 24€ grrr.

Je fouille le web et je ne trouve pas de protections à ces entrées pull-up, je ne dois pourtant pas être la seule avec ce genre de besoin. Les borniers dit “shield” pour l’Arduino ne protègent en fait de rien, c’est juste une mise à disposition des entrées/sorties sur des borniers à visser.

@+

La pull-up de l’Arduino n’est pas faible (environ 20kohm) mais ce n’est pas assez pour cette application très spécifique.

Les shields “bornier” sont prévu pour fonctionner dans des applications qui n’utilisent que le 5V de l’Arduino…

Là tu es obligée de quitter le monde Arduino pour rentrer dans celui de l’électronique. Soit c’est des solutions à application large mais pas économique, soit il faut le faire soit-même. Pour ces entrées la méthode retenue (en premier par Märklin il y a plus de 35 ans) n’est pas dans les manuels…

Locodruino utilise des entrées à opto-coupleur, pour éviter la boucle ordi - Arduino - centrale - ordi, et c’est plus sécurisé en cas d’erreur de branchement.

C’est l’illustration de ce que je reproche à Arduino :
Arduino dit regardez c’est facile de faire du microcontrôleur sauf que ce n’est pas vrai. Tant que l’on reste dans l’écosystème oui c’est vrai car tout le travail est prémâché, mais la désillusion guette dès que l’on va y sortir. (Et même combiner deux sketches en un n’est simple, le nombre de personnes qui arrêtent à cela).

Je me suis mal exprimée. Mes souvenirs d’électronique remonte à 1989 :smiley: je n’en avais pas fait depuis, même si j’ai fait de la micro-électronique VLSI (mais c’est autre chose) en 1991.

J’ai vite remarqué ce problème là, venant du monde de l’embarqué en formation initiale :). On a très vite une contrainte avec une seule loop(). Il faut introduire à minima des co-routines et probablement des interruptions dès que l’on veut combiner plusieurs processus.

Me concernant ce n’est pas un problème vu mon parcours, mais c’est un réel frein pour la majorité des gens car une co-routine c’est tout sauf simple (cf Coroutine - Wikipedia).

Je suis surprise de ne pas trouver des cartes opto-coupleurs dans les kits de base de l’Arduino. Même chez les distributeurs comme AZ-Delivery qui ont multiplié les petites cartes autour de l’Arduino pour enrichir l’éco-système.

Bon ceci dit, dans mon usage, l’écosystème “lego” est suffisant, c’est juste pour ce bornier “intelligent” en attendant de mettre un S88 que j’ai un problème.

Je viens de terminer un bout de sketch et de câblages pour piloter des servo moteurs faller, ça tombe en marche et ça coute quand même 10 fois moins cher que leur servo controlleur :slight_smile:

Il faut effectivement être conscient des limitations liées principalement à ces entrées-sorties 0-5V non protégées et à l’absence d’un OS même rudimentaire pour gérer des taches.

Il y a quelques année (en 1999 je crois lol), j’avais refait un peu d’embarqué et il y avait des solutions vraiment sympa comme eCos qui ont complètement disparu. C’est dommage (cf MicroC/OS-II — Wikipédia)

Bon si j’ai le courage, je ferais bien une couche type eCos sur l’Arduino :smiley:

@+

En “lego” j’ai trouvé cette carte qui me parait pas mal du tout en terme d’isolation. Et qui gère 8 entrées d’un coup.

http://www.diymalls.com/DST-1R8P-N-24V-to-5V-PLC-level-voltage-converter-board-NP

D’une façon générale je pourrais l’utiliser pour protéger mon Arduino dès lors qu’il prend des informations en provenance de l’extérieur (M83, M84 ou tension de la voie).

$4.83 sur AliExpress avec $3.44 de livraison … ça fait les 16 entrées à 0,67 euro / entrée opto-isolée :slight_smile:

Bonjour Julie,

Je viens de commander les Arduino Nano (à recevoir d’ici qqs jours), j’ai chargé le logiciel en attendant, mais apparemment il faut qu’une petite bête d’Arduino soit connecté à l’ordi pour essayer de faire qq chose avec le programme, non ?

Cdlt,

Claude papaciela

Tiens une autre question :slight_smile:

J’ai à l’écran “put your set up code here, to run once”
et en dessous "put your main code here, to run repeatedly:

Je les ai ou ces codes ? Ou c’est moi qui les invente ?

Bonjour Claude,

Sans Arduino difficile de faire grand chose.

Oui les commentaires indiquent les endroits où tu dois placer ton code run once et run repeatedly.

Je te propose d’organiser un webinar pour t’aider à mettre en œuvre tout ça ! Et nous pourrons élargir les participants pour en faire profiter les membres du forum intéressés.

Je reviens vers toi en MP.

@+

Merci de ta réponse, je voulais juste m’assurer que sans l’Arduino, on ne peut rien faire, je vais patienter jusqu’à la livraison.

Bonjour Julie,

Merci pour tes tutos très intéressants.
J’ai planché sur le tuto5 et j’ai quelques problèmes.
J’ai une installation identique, avec une arduino MEGA

J’ai fait les connexon comme démontré dans ton schéma, mais une LED à la place du relais

Quand j’affiche les valeurs, j’ai seulement des valeurs 16, 17 qui remontent,

même quand le secteur est occupé.

Sur ton schéma, le fin B est raccordé au GND et le fil O au VCC du module. Est-ce correcte?
Je ne sais pas trop où aller chercher, pourrais-tu m’aiguiller?, merci d’avance.
Meilleures salutations.
P.-A

Bonjour Pierre-André,

Un courageux qui se lance aussi ! c’est top :smiley:

B (Bahn) sur VCC et Rail contact bleu sur GND de la carte analogique (et non pas le O).

Aussi, je ne vois pas bien le montage que tu as fait en amont de la carte analogique (sur le bornier qui vient de la voie). Comment est branchée cette led jaune ?

Edit +1H : j’ai vérifié Tuto05, worksforme, donc on va trouver la différence :slight_smile:

Ajoute une ligne dans setup() :

pinMode(anaPin,INPUT_PULLUP);

Possible qu’il y ai une différence entre le Nano et le Mega à ce niveau là ? Je ne vois que ça car l’entrée contact en l’air, la lecture analogique doit envoyer 0 (PULLUP), sinon elle renvoie une valeur qui fluctue (tension et des trains digitaux de shunt correspondant aux trames DCC/MM2 et cie).

Donc tes valeurs 16 et 17 sont vraiment suspectes. Tu devrais avoir 0 ou 500 à 800 :slight_smile: ! (sur une échelle de 0 à 1023).

Par acquis, j’ai changé la carte analogique et le Nano, ça continue à marcher chez moi grrr : valeur 0 en l’absence de wagon sur le rail, une valeur qui fluctue fortement sinon.

j’ai ajouté le pinMode.
j’ai une valeur de 357, et qui augmente à chaque tour, que la voie soit libre ou occupée.
Je n’ai pas de valeur 0 si “Libre”
j’ai pris le B directement à la sortie de l’alimentation = résultat idem
je sèche.
J’ai débranché le rail de contact et le B = j’ai toujours mes valeurs qui augmentent
J’ai débrancher module => arduino = les valeurs augmentent toujours
donc je suppose que c’est dans code qu’il se passe qq chose ou le MEGA. je vais programmé un UNO pour voir.