Auteur Sujet: Un Arduino par canton  (Lu 108029 fois)

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Un Arduino par canton
« le: janvier 15, 2015, 06:36:28 pm »
Bonjour,

Il s'agit ici de faire du cantonnement sur un réseau analogique. L'idée est de pouvoir piloter un réseau « comme en numérique » avec une grosse différence : les « décodeurs » sont associés aux cantons et non aux locomotives.

Ce n'est pas une idée nouvelle, feu Driving Railways faisait cela. Mais il s'agit d'aller un peu plus loin en ayant une régulation de vitesse (compensation de charge dans le jargon).

Une première solution est de faire un arbre de relais qui permet d'associer une alimentation à un ou plusieurs cantons.

Une autre solution consiste à associer une alimentation pilotée par un Arduino à chaque canton. En plus de l'alimentation du canton, il assure la détection de présence et, idéalement, la mesure de vitesse de la locomotive qui occupe le canton.

C'est cette seconde solution qui est choisie.

Une première chose à faire est de synchroniser les PWM de tous les cantons. En effet, si les PWM ne sont pas synchrones, une locomotive à cheval sur 2 cantons recevra une impulsion plus longue et verra sa vitesse modifiée tant qu'elle est à cheval. Elle fera donc potentiellement un petit bond à chaque passage d'un canton au suivant.

Voici donc une bibliothèque qui assure la synchronisation des PWM de plusieurs Arduino. Elle utilise le timer2 dans un mode de PWM particulier qui permet d'ajuster finement la fréquence.

Un Arduino maître diffuse un signal de synchronisation aux autres Arduino, le code exemple est dans MasterClock. Le signal de synchro sort sur la broche 3.

Avec l'exemple SyncPWM, chaque Arduino affecté à un canton génère une PWM synchronisée sur la broche 3 et reçoit le signal de synchro sur la broche 8.

La fréquence de la PWM est d'un peu moins d'1kHz. l'erreur maxi entre 2 PWM, du moins ce que j'ai pu mesurer à l'oscillo, est d'environ 8µs. Les valeurs possibles pour la PWM vont de 0 à 254.

À 1kHz, le signal de synchro devrait pouvoir voyager sur une certaine distance (combien ? faut voir). Au delà, il faut passer en différentiel.

Si vous avez des questions, n'hésitez pas.

La bibliothèque :

https://dl.dropboxusercontent.com/u/67740546/SyncPWM.zip
« Modifié: janvier 30, 2015, 04:05:52 pm par Jean-Luc »
Cordialement

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 204
    • Voir le profil
    • Locoduino
Re : Un Arduino par canton
« Réponse #1 le: janvier 18, 2015, 11:11:32 am »
Comme en numérique c'est à dire ?
Chaque arduino pourra déterminer par exemple le sens du courant ?
Je ne connais pas ce log mais si on prend un exemple : réseau en 8 voie unique avec 2 gares sur les parties droites du 8 (dont une cachée donc)
pourrait-on faire partir chacun de leur coté un train d'une gare, ils vont chacun dans un sens pour arriver à l'autre gare et tout cela en analogique avec ce truc ? Comme en numérique donc ?
G.

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : Un Arduino par canton
« Réponse #2 le: janvier 18, 2015, 02:45:55 pm »
Il y a deux partie distinctes.

La première à réaliser est l'alimentation de la locomotive, ce que fait un décodeur de locomotive en numérique. La différence principale est qu'en analogique, c'est le canton qui est alimenté et non la locomotive. La locomotive change donc d'alimentation au fur et à mesure de son parcours.

Il y a deux façons de faire :
- avoir une collection d'alimentations centralisées, autant que tu veux avoir de locomotive en fonctionnement sur le réseau. Une série de relai permet de connecter chacune de ces alimentation a un ou plusieurs cantons.
- avoir une alimentation par canton sans relais pour l'y connecter.

Dans le premier cas, il y a énormément de câblage et la régulation de vitesse n'est probablement pas possible. Dans le second cas la regulation de vitesse est possible mais il faut que les PWM des alimentations soient synchronisées. Si on veut une marche régulière et de très bons ralentis, la seconde solution est la meilleure.

La 2ème partie est le suivi des convois sur les cantons. C'est la même problématique en analogique et en numérique. Habituellement c'est réalisé par un logiciel qui tourne sur un PC. Il y a deux parties dans cette partie : la sécurité c'est a dire éviter que les trains n'entrent en collisions via un bloc automatique. Le routage des trains pour automatiser la circulation. C'est a gérer de manière centralisée sur un Arduino dédié.

Mais ou, une fois tout cela en place, on peut piloter un réseau analogique comme un numérique.

Concernant SyncPWM, j'en suis l'auteur. C'est une des briques de base de la seconde solution. 
Cordialement

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 204
    • Voir le profil
    • Locoduino
Re : Un Arduino par canton
« Réponse #3 le: janvier 18, 2015, 03:13:26 pm »
Très intéressant ce truc comme je pensais.
La 1ère solution est vraiment compliqué : c'est sur que ce n'est pas une taille de lopette mais chalindrais en est un exemple.

Je garde cela sous le coude ;) ou le pied je sais pas
G.

Pierre59

  • Sr. Member
  • ****
  • Messages: 346
    • Voir le profil
Re : Re : Un Arduino par canton
« Réponse #4 le: février 06, 2015, 04:39:56 pm »
Il y a deux façons de faire :
- avoir une collection d'alimentations centralisées, autant que tu veux avoir de locomotive en fonctionnement sur le réseau. Une série de relai permet de connecter chacune de ces alimentation a un ou plusieurs cantons.
- avoir une alimentation par canton sans relais pour l'y connecter.

Dans le premier cas, il y a énormément de câblage et la régulation de vitesse n'est probablement pas possible.
Bonjour

Je ne vois pas pourquoi ce "n'est probablement pas possible" ? A priori je le fait sur mon réseau !

Pierre

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : Un Arduino par canton
« Réponse #5 le: février 06, 2015, 04:47:51 pm »
Bonjour Pierre,

Pourrais-tu expliquer ce que tu fais sur ton réseau ?
« Modifié: février 06, 2015, 06:34:40 pm par Jean-Luc »
Cordialement

Pierre59

  • Sr. Member
  • ****
  • Messages: 346
    • Voir le profil
Re : Re : Un Arduino par canton
« Réponse #6 le: février 08, 2015, 11:51:22 am »
Pourrais-tu expliquer ce que tu fais sur ton réseau ?

Je fonctionne au choix en analogique ou en digital. En analogique j'ai 4 sources PWM (128 pas) commandables par l'ordinateur, en digital une centrale commandable aussi par l'ordinateur.
L'ordinateur connait la position des trains (détection de présence dans les zones et cantons), des aiguilles (par le biais des itinéraires) et a des informations de détection ponctuelles pour les signaux.

Quand un train passe sur une détection ponctuelle, l'ordinateur connait l'état du signal, la vitesse du train (cran), si par exemple le signal est à l'avertissement l'ordinateur va envoyer des commandes à l'alimentation (analogique ou digitale) pour réduire progressivement la vitesse (cran) jusqu'a 30 km/h. Si le signal est fermé il arrive sur le détecteur ponctuel à 30 km/h et reçoit alors un ordre d'arret.

Voila c'est très classique.

Pierre

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : Un Arduino par canton
« Réponse #7 le: février 08, 2015, 11:55:30 am »
Bonjour Pierre.

Ok, je vois. Quand je parlais de régulation de vitesse, je parlais de mesurer la FCEM et de piloter la PWM par une loi de commande pour que la FCEM soit égale à une consigne. Dans ce contexte, je pense que réguler la vitesse est difficile car la longueur de fils entre les rails et l'alimentation traction nuit à la mesure de la FCEM.
« Modifié: février 08, 2015, 08:27:29 pm par Jean-Luc »
Cordialement

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 204
    • Voir le profil
    • Locoduino
Re : Un Arduino par canton
« Réponse #8 le: février 13, 2015, 01:31:40 pm »
Je reviens vers toi pour cette librairie. Je réfléchis un peu à un réseau. Deux questions pour toi :
peut-on augmenter au maximum la fréquence des PWM ? Sans cela, je serais dans l'impossibilité de gérer avec cette biblio. Au regard de ce que tu dis, oui mais différentiel ?
Si je comprends bien un peu le code, c'est que pour les arduinos de base avec un atmega je parle, pas de possibilité encore du due par exemple.
G.

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : Re : Un Arduino par canton
« Réponse #9 le: février 13, 2015, 05:13:56 pm »
peut-on augmenter au maximum la fréquence des PWM ? Sans cela, je serais dans l'impossibilité de gérer avec cette biblio. Au regard de ce que tu dis, oui mais différentiel ?

Oui. On peut augmenter la fréquence de la PWM au maximum. Le signal de synchro sera à la même fréquence et donc il est préférable de le diffuser en différentiel. Le faire avec un MCP2551 est un peu coûteux. Il existe des drivers différentiels et des récepteurs moins coûteux (UA9638 et UA9637)

Citer
Si je comprends bien un peu le code, c'est que pour les arduinos de base avec un atmega je parle, pas de possibilité encore du due par exemple.

Je pense que tu parles du contrôleur central. Pour l'instant je n'ai pas fait l'émission de la synchro sur un Due mais je pense que ça se fait facilement et je le ferai.
Cordialement

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 204
    • Voir le profil
    • Locoduino
Re : Un Arduino par canton
« Réponse #10 le: février 13, 2015, 06:41:48 pm »
Il faudra que tu nous expliques cela le truc différentiel. Un peu cher le mcp comme tu dis. Les autres c'est mieux.
Une autre question d'ailleurs, les arduinos sont aussi reliés par la masse ?

Si on reprend le truc, un arduino lambda uno ou mega ou mini pour le moment démarre le master clock sur la broche 3. Sont reliés ensuite d'autres arduino qui démarre le prog sync, crée un objet selon la biblio avec réception du signal sur la broche 8 et envoie le pwm sur la broche 3 en fonction d'un argument byte.
Chaque arduino mettant l'attribut byte qu'il veut d'où l'indépendance de chaque canton.


Le due n'est pas nécessaire pour le moment, je réfléchis à en prendre un vu son prix pas si différent d'un méga. Ca sera pour mon mini module en HOe.

G.

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : Re : Un Arduino par canton
« Réponse #11 le: février 14, 2015, 09:36:37 am »
Il faudra que tu nous expliques cela le truc différentiel. Un peu cher le mcp comme tu dis. Les autres c'est mieux.

http://fr.m.wikipedia.org/wiki/Signalisation_différentielle

Citer
Une autre question d'ailleurs, les arduinos sont aussi reliés par la masse ?

Oui via l'alimentation. Mais il ne faut pas considérer que les masses sont identiques partout. Un fil long n'est pas une équipotentielle.

Citer
Si on reprend le truc, un arduino lambda uno ou mega ou mini pour le moment démarre le master clock sur la broche 3. Sont reliés ensuite d'autres arduino qui démarre le prog sync, crée un objet selon la biblio avec réception du signal sur la broche 8 et envoie le pwm sur la broche 3 en fonction d'un argument byte.
Chaque arduino mettant l'attribut byte qu'il veut d'où l'indépendance de chaque canton.

Oui c'est ça. Mais les valeurs de PWM appliquées sur chaque canton sont décidées par un Arduino maître qui connaît l'emplacement des trains via une rétro-signalisation.

Citer
Le due n'est pas nécessaire pour le moment, je réfléchis à en prendre un vu son prix pas si différent d'un méga. Ca sera pour mon mini module en HOe.

Le due me semble bien taillé pour jouer le rôle de l'Arduino maître.
« Modifié: février 27, 2015, 07:49:14 am par Jean-Luc »
Cordialement

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 204
    • Voir le profil
    • Locoduino
Re : Un Arduino par canton
« Réponse #12 le: février 15, 2015, 10:01:35 am »
Merci pour ces réponses.
C'était un raccourci pour la valeur des PWM.

Pour ce qui est du DUE, il va falloir d'abord que je puisse accéder à l'IDE 1.5.8 car à ce jour impossible de l'avoir sur aucun de mes ordis, en attente. Cela marchait sur un seul de mes ordis, mais le temps faisait, il ralentissait de plus en plus vu toutes les installations de prog que je faisais, et les versions devenant de plus en plus gourmandes j'ai réinstallé pour un truc plus light. Bref, je dois cogiter un peu...

A suivre
G.

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 204
    • Voir le profil
    • Locoduino
Re : Un Arduino par canton
« Réponse #13 le: février 16, 2015, 11:42:46 am »
Finalement, la dernière version en stable qui remplace tout la 1.6 a résolu le pb sans intervention de ma part.
Plus qu'à commander le DUE.
G.

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : Un Arduino par canton
« Réponse #14 le: février 16, 2015, 04:37:06 pm »
Pour l'instant je fais des essais avec un moteur Graupner Speed 500E sans chercher à optimiser quoique ce soit. La seule chose que j'ai faite est de passer la fréquence de la PWM à 31,45kHz (d'après l'oscillo).

Le moteur est donc piloté avec une PWM à 31,45kHz.

Toutes les 10ms, la PWM est coupée et l'Arduino mesure la force contre électromotrice du moteur (FCEM).  Quand un moteur tourne, il produit une tension, comme une dynamo de vélo, qui est proportionnelle à la vitesse de rotation. Pour cela, un montage à d'amplificateur opérationnel permet de la mesurer. Ça ramène une valeur entre 0 et 10V entre 0 et 5V et ça fonctionne avec des masses qui ne sont pas exactement les mêmes, elles peuvent différer de plusieurs volts.

L'Arduino effectue 6 mesures car la FCEM est très bruitée et les trie. Les deux extrêmes sont éliminés et une moyenne des 4 centrales est effectuée.

J'ai mis en œuvre un asservissement de vitesse du moteur avec un régulateur PI (j'utilise asservissement plutôt que régulation pour ne pas confondre). PI pour Proportionnel Intégral. La consigne est la FCEM à atteindre. En soustrayant la FCEM mesurée à la consigne, on calcule une erreur. Cette erreur est multipliée par une constante qu'il faut régler : le gain proportionnel. On calcule également la somme des erreurs ce qui donne l'intégrale de l'erreur. Cette intégrale est également multipliée par un gain. La PWM est donc calculée comme suit (ici on divise par l'inverse du gain intégral) :

     int erreur = consigneVitesse - fcem;
     cumulErreur += erreur;
     pwm = erreur * gainProportionnel + cumulErreur / inverseGainIntegral;

La PWM est ensuite relancée avec la nouvelle valeur.

Pour l'instant l'électronique est un peu crade. L'ampli op est alimenté directement par la tension qui alimente le MOSFET et elle est très bruitée. Mais ça marche quand même :)
« Modifié: mars 31, 2015, 02:42:36 pm par Jean-Luc »
Cordialement