Auteur Sujet: solution globale pour pilotage aiguillages avec 8 servos  (Lu 24886 fois)

SUPERN

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
solution globale pour pilotage aiguillages avec 8 servos
« le: janvier 20, 2016, 03:11:52 pm »
Salut,

Comme annoncé dans ma présentation, je vais vous exposer la solution que Xavier et moi mettons au point pour piloter 8 aiguillages pour moins cher que les décodeurs du marché, mais aussi avec plus de sécurité et de performance.

Ce décodeur 8 servos est basé sur un shield pour Arduino UNO. Il résulte des essais effectués sur plusieurs types de servos (adaptation du mouvement, utilisation optimale du débattement du servos, limitation des efforts en fin de course, et limitation de la consommation) et après étude des offres commerciales de décodeurs.
Voir les détails sur http://cdmrail.free.fr/ForumCDR/viewtopic.php?f=17&t=2425&hilit=globale

Il résulte des essais qu'il faut couper l'alimentation des servos lorsqu'on ne les fait pas bouger. Il y a donc un circuit de coupure d'alimentation par la masse.

Sur ce shield on trouve aussi l'isolement optique nécessaire à l'Arduino pour lire le DCC et une alimentation complète qui permet de fonctionner:
Soit en autonome: alimentation par le DCC de la voie (à condition d'utiliser des servos qui consomment peu et de bien respecter les règles de montage)
Soit avec une alimentation extérieure 5 volts servos: utile si on a un grand nombre de servos à piloter, donc plusieurs modules à alimenter.
Soit avec deux alimentations extérieures: 5 volts servos + 10 volts Arduino. Cela permet de ne pas gaspiller la puissance DCC destinée aux locomotives.

Ce shield comporte également une mémoire EEPROM / I2C qui nous sert à stocker les paramètres (adresse du décodeur, position min et max de chaque servo individuellement et dernière position logique droit/dévié avant coupure d'alimentation).

Voici le schéma du shield:

A+
Yves
« Modifié: janvier 20, 2016, 03:16:10 pm par SUPERN »

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : solution globale pour pilotage aiguillages avec 8 servos
« Réponse #1 le: janvier 21, 2016, 08:33:12 pm »
Bonsoir,

Projet intéressant. Nous avons également ce type de projet, voir ici : http://forum.locoduino.org/index.php?topic=125.0

J'ai quelques questions :

J'ai moi même sur une carte servomoteurs pilotée par un PIC, mis en œuvre une fonction d'allumage de l'alimentation de chaque servomoteur. Il ne s'agissait de régler un problème de consommation ou de grognement des servomoteurs quand ils forcent en butée, mais de limiter l'appel de courant à l'allumage car les servomoteurs frétillaient à la mise sous tension. Finalement, Guillaume a découvert qu'en tirant le signal de commande à +5V les servomoteurs ne frétillaient plus à l'allumage. Je suis donc revenu est arrière et j'ai redessiné une carte sans pilotage de l'alimentation des servos.

La question est : sachant qu'un micro-servomoteurs consomme environ 20mA (de mémoire il faut que je mesure à nouveau) est-il vraiment intéressant de complexifier le matériel pour cette fonction ?

Concernant la déconnexion du servomoteur quand il est en butée, il suffit d'arrêter de le piloter pour que la position ne soit plus asservie et que le moteur cesse de forcer. Cependant, certains servomoteurs numériques continuent d'asservir la position en l'absence de signal de commande mais ils sont rares.

Pourquoi mettre une EEPROM externe alors que l'Arduino en comporte déjà une ?

Pourquoi faire un shield qui a des contraintes de connecteurs plus complexes alors qu'une carte recevant un Arduino type nano ou pro mini est, me semble-t-il plus adaptée pour réaliser ce type de système ?
« Modifié: janvier 21, 2016, 08:43:09 pm par Jean-Luc »
Cordialement

SUPERN

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : solution globale pour pilotage aiguillages avec 8 servos
« Réponse #2 le: janvier 23, 2016, 05:58:24 pm »
Bonsoir Jean-Luc,

Merci pour ton intérêt.

Beaucoup de questions, mais je vais essayer d'y répondre le mieux possible:
- La coupure de l'alimentation des servos n'est pas seulement faite pour limiter la consommation globale, ni celle en butée (bien que cela soit ainsi traité) mais pour éviter tout mouvement intempestif des servos lors d'une mise sous tension. En effet, lorsque l'on met en route, j'ai observé que certains servos partaient en butée avant de revenir sur la plage autorisée. Dans le modélisme à l'échelle N, on ne peut pas accepter qu'un servo aille en butée, sinon on a de la casse. J'ai vérifié qu'un délai entre la mise sous tension de la carte micro et des servos résolvait de manière sûre ce problème.
- La consommation d'un micro servo est bien de 20mA, sauf en butée ou lorsqu'il force. J'ai observé couramment 150 à 200 mA. C'est pourquoi j'ai prévu une alimentation extérieure avec un fusible ré-amorçable automatiquement.
- l'arrêt du pilotage ne me semble pas suffisant car il ne répond pas à mon premier point.
- L'EEPROM est utilisée pour pouvoir mémoriser les positions de butée et les positions de chaque servos afin de sécuriser les mises en route et arrêt. J'ai mis une mémoire externe car ce type de mémoire ne supporte que quelques dizaine de milliers d'écriture, ce qui fait que l'on ne jette pas le micro tous les deux ans, seulement un boitier à 1 Euros sur support. Mais chacun son option!
- enfin, le format UNO a été retenu, car le format du shield correspond à celle là (et encore on rentre au chausse pied vu qu'on a des implantations pour une alimentation autonome sur DCC).

Voilà, j'espère avoir compris tes questions et y avoir répondu. Si cela n'est pas clair, je reste à ta disposition.
De ton côté, où en es-tu de ton projet?

A+
Yves

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : solution globale pour pilotage aiguillages avec 8 servos
« Réponse #3 le: janvier 23, 2016, 06:31:17 pm »
Beaucoup de questions, mais je vais essayer d'y répondre le mieux possible:
- La coupure de l'alimentation des servos n'est pas seulement faite pour limiter la consommation globale, ni celle en butée (bien que cela soit ainsi traité) mais pour éviter tout mouvement intempestif des servos lors d'une mise sous tension. En effet, lorsque l'on met en route, j'ai observé que certains servos partaient en butée avant de revenir sur la plage autorisée. Dans le modélisme à l'échelle N, on ne peut pas accepter qu'un servo aille en butée, sinon on a de la casse. J'ai vérifié qu'un délai entre la mise sous tension de la carte micro et des servos résolvait de manière sûre ce problème.

Il semblerait bien que tirer le signal de commande à 5V (via une résistance de 10kΩ par exemple, produise le même effet. Je l'ai testé avec les HK15178 que j'ai acheté pour mes aiguillages (http://www.hobbyking.com/hobbyking/store/__16257__HobbyKing_8482_HK15178_Analog_Servo_1_4kg_0_09sec_10g.html) et le SG90 que je viens de tester a le même comportement. Si vous avez un large échantillon de servos, vous pourriez tester cette configuration. L'avantage est une complexité moindre. J'avais par le passé essayé de tirer ce signal de commande à la masse et là le servo bouge à l'allumage. Ceci couplé à l'arrêt du pilotage remplirait votre cahier des charges je pense.

Je mettrais une diode de protection sur l'alimentation externe, un mauvais branchement est si vite arrivé.

Citer
- L'EEPROM est utilisée pour pouvoir mémoriser les positions de butée et les positions de chaque servos afin de sécuriser les mises en route et arrêt. J'ai mis une mémoire externe car ce type de mémoire ne supporte que quelques dizaine de milliers d'écriture, ce qui fait que l'on ne jette pas le micro tous les deux ans, seulement un boitier à 1 Euros sur support. Mais chacun son option!

On trouve des EEPROM externe qui supportent 1 million d'écritures. Par exemple : http://www.tme.eu/fr/Document/70a2a08b621e743c2d24fbd8cde093d0/m24c01-w.pdf

http://www.tme.eu/fr/details/m24c01-wbn6p/memoires-eeprom-de-serie/st-microelectronics/

11 centimes l'exemplaire :-)

Pour ma part, j'explore une autre piste, j'attends le composant. Il s'agit d'un composant à trois broches qui surveille l'alimentation. Quand elle chute en dessous de 4,3V, le composant envoie une interruption au micro qui peut alors procéder à la sauvegarde des positions des servos avant que la tension soit trop basse. De cette manière l'écriture en EEPROM n'est fait que lors de l'extinction et il n'est pas nécessaire de la changer et on peut donc utiliser l'EEPROM interne de l'Arduino.

Citer
De ton côté, où en es-tu de ton projet?

La carte est dessinée et par à la fabrication la semaine prochaine. Concernant le montage des servos, nous avons eu la même idée. Sur les miens j'ai également des contacts de fin de course et d'alimentation du cœur. Voir ici : http://modelleisenbahn.triskell.org/spip.php?article35

A+
« Modifié: janvier 23, 2016, 06:33:58 pm par Jean-Luc »
Cordialement

SUPERN

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : solution globale pour pilotage aiguillages avec 8 servos
« Réponse #4 le: janvier 26, 2016, 10:55:33 am »
Salut,

Merci pour ton retour d'expérience.
La résistance n'a pas eu d'effet dans mon cas, mais j'ai pu calmer les servos par logiciel avec un setup plus développé.
Donc la solution complète fonctionne (en prototype).

OK pour la diode... je vais la rajouter.

Pour la mémoire, super site, je vais le visiter plus en détail.

Enfin, concernant la mémorisation des positions des servos en cas de coupure de courant, j'ai prévu un monitoring des tensions par les entrées analogiques de l'Arduino. Qu'en penses-tu?

Cordialement,
Yves

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Re : solution globale pour pilotage aiguillages avec 8 servos
« Réponse #5 le: janvier 26, 2016, 12:21:09 pm »
Bonjour,

Pour la mémoire, super site, je vais le visiter plus en détail.

Je suis un fan de TME. Choix suffisamment large, prix excellents, livraison du jour pour le lendemain si la commande est passée avant 15h pour un tarif raisonnable.

Citer
Enfin, concernant la mémorisation des positions des servos en cas de coupure de courant, j'ai prévu un monitoring des tensions par les entrées analogiques de l'Arduino. Qu'en penses-tu?

J'y ai pensé aussi au début mais ça ne fonctionnera pas. En effet, la tension de référence pour la conversion analogique numérique est la tension d'alimentation (ou bien dérivée de la tension d'alimentation). Si la tension d'alimentation chute, la référence chute également. Par conséquent une lecture analogique de la tension d'alimentation renvoie 1023 quelque soit la tension d'alimentation. La chute n'est donc pas détectable de cette manière.

La question qui subsiste est le temps dont on dispose pour sauvegarder les données. Si les servos sont à l'arrêt et en butée, un octet suffit, chaque bit représentant la position, droit ou dévié, de chaque servo. Mais si on veut également gérer le fait qu'un ou plusieurs servos sont en cours de déplacement au moment de la coupure, il faut mémoriser la position, entre 500 et 2500, donc 2000 valeurs possibles, de chaque servo. Il faut 12 bits par servo, soit 12 octets en tout. Il faut également 2 bits de plus par servo pour déterminer si il était à l'arrêt, en mouvement vers l'angle min ou en mouvement vers l'angle max. Donc 2 octets de plus. Dispose-t-on de 14 x 3,3ms = 47ms avant que le programme plante et/ou que l'EEPROM ne soit plus programmable ? Une autre solution est de ne pas sauvegarder les 12 bits par servo mais seulement les 8 bits de poids fort et d'oublier les 4 de poids faible, on peut ajuster ce poids fort si le poids faible est > 7 pour n'avoir qu'une erreur maximum de 3 bits = 8µs en plus ou en moins. Sachant que 8µs représente une erreur d'angle de 8/2000 * 180 = 0,72°, ça me semble tolérable. On économise 4 octets et on tombe à 33ms. On peut également tolérer une erreur plus importante, surtout dans la manœuvre d'un aiguillage, et intégrer les 2 bits d'état dans l'octet qui code la position et l'état d'un servo. On a alors 5 bits d'erreur, soit 32µs maximum et un angle de 2,88° ce qui me semble aussi tolérable, sachant que les angle min et max mémorisée par ailleurs ne seront pas dépassés. On tombe alors à 8 octets et donc 26,4ms de temps d'écriture.

On peut également décider qu'on ne fait bouger qu'un seul servo à la fois. Dans ce cas il y a beaucoup moins de chose à mémoriser : 1 octet pour la position des servos qui sont en butée, 4 bits pour spécifier quel servo est en mouvement (il faut un bit pour dire « aucun n'est en mouvement »), 1 bit pour indiquer dans quel sens il bouge et le reste pour sa position. On est à 3 octets, soit 10ms.

Dans le manuel, il est aussi fait mention de taille de page pour l'EEPROM. Une page fait 4 octets. Visiblement une page peut être écrite d'un seul coup. Dans ce cas, peut être que 3,3ms suffisent pour écrire nos 3 octets. Le bibliothèque EEPROM gère-t-elle l'écriture par page ? Je je sais pas, il y a une étude à faire :)

De combien de temps dispose-t-on ? Le micro tourne à 16MHz et page 316 du manuel, on a une courbe qui définit une zone de fonctionnement sûr en fonction de la tension d'alimentation et de la fréquence. La tension min à 16MHz se situe vers les 4V. Le circuit de surveillance que j'ai vu déclenche à 4,3V mais un diviseur de tension peut le faire déclencher avant, 4,6 ou 4,7 V par exemple.
« Modifié: janvier 26, 2016, 04:08:05 pm par Jean-Luc »
Cordialement

SUPERN

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : solution globale pour pilotage aiguillages avec 8 servos
« Réponse #6 le: janvier 27, 2016, 09:08:09 pm »
Bonsoir Jean Luc,

En effet je pensais surveiller l'entrée aliments externe et pas le 5 volts dû micro.
Néanmoins je suis intéressé par ton composant de surveillance...
Si tu as une référence ?

Pour la mémorisation, j'ai essayé de ne stocker que les dizaines de micro secondes. Cela se fait sur 1 octet, donc 8 octets.
Au redémarrage on sait si le servo est en mouvement par la différence entre sa position et les butées.

Qu'en penses tu?

A+
Yves

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : solution globale pour pilotage aiguillages avec 8 servos
« Réponse #7 le: janvier 28, 2016, 11:06:49 pm »
Bonsoir Yves

Surveiller l'alimentation externe suppose qu'elle soit fixée à priori et stable. Or souvent on a une plage d'alimentation.

Le composant est le TC54 de microchip. Je ne l'ai trouvé qu'en SOT23 mais ça reste pas trop difficile à souder.

Pour la taille de ce qui est à stocker, l'expérience dira du temps dont on dispose. 8 octets pourraient se stocker en deux écritures. Je ne vois pas cette histoire de pages pour écrire dans l'EEPROM dans la Bibliothèque EEPROM, il faut que je creuse. À suivre donc.
Cordialement

SUPERN

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : solution globale pour pilotage aiguillages avec 8 servos
« Réponse #8 le: janvier 31, 2016, 09:40:04 am »
Bonjour,
Merci pour tes réponses
Je pense alimenter la carte arduino par du 12 volts, soit externe soit issu du DCC par 7812.
Mon idée est de détecter un passage en dessous de 10 volts, ce qui élimine les parasites et laisse le temps de descente jusqu'à 7 volts pour faire l'enregistrement.
Je vais donc essayer avec un pont diviseur devant le TC54.
A+
Yves

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : solution globale pour pilotage aiguillages avec 8 servos
« Réponse #9 le: janvier 31, 2016, 09:48:29 am »
Bien vu. Ça laisserait plus de temps pour faire la sauvegarde et ca laisse une marge de bruit confortable. 
Cordialement

SUPERN

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : solution globale pour pilotage aiguillages avec 8 servos
« Réponse #10 le: février 01, 2016, 06:12:57 pm »
Salut,

Bon cela marche comme je le souhaitais.
Merci pour ton aide.

Voici donc le schéma final

A+ pour le programme Arduino.
Yves

SUPERN

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : solution globale pour pilotage aiguillages avec 8 servos
« Réponse #11 le: février 01, 2016, 06:14:08 pm »
Salut,

Voici le circuit imprimé:

A+
Yves

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : solution globale pour pilotage aiguillages avec 8 servos
« Réponse #12 le: février 03, 2016, 06:24:08 pm »
Bonjour,

Concernant la détection de perte d'alimentation, le TC54 ne va pas fonctionner pour surveiller la tension à l'entrée du régulateur 5V.

J'ai pensé à ce petit montage avec une zener 6,8V (et tu t'es planté):



Tant que la tension VIN est supérieure à 6,8V, la diode zener est passante et LOST est tiré à la masse. Lorsque VIN chute en dessous de 6,8V, la zener se bloque et LOST monte à 5V, la diode vers le 5V tire l'excédent (point que je vais vérifier auprès d'un collègue plus fort que moi en électronique). Le montage provoque donc une transition de LOST qui peut être utilisée sur une entrée d'interruption du micro. S'il s'avère que la diode vers le 5V pose un problème, on peut faire ceci (et là je suis sûr que ça fonctionne nickel) :



Ça suppose que le pull-up de l'entrée du micro est actif. Cette fois si c'est une transition de l'état haut vers l'état bas.
« Modifié: février 10, 2016, 05:27:49 pm par Jean-Luc »
Cordialement

SUPERN

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : solution globale pour pilotage aiguillages avec 8 servos
« Réponse #13 le: février 06, 2016, 08:58:00 am »
Bonjour Jean-Luc,

Merci pour ta contribution. mais je pense que c'est exactement ce que fait le TC54 en version N, c'est à dire en collecteur ouvert.
Si tu utilises le TC54 normal, le niveau de sortie dépend de l'alimentation 5V du 7805 en effet.
J'ai reçu mes TC54N hier, je les câble aujourd'hui et te donne des nouvelles dans le WE.

Cordialement,
Yves

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : solution globale pour pilotage aiguillages avec 8 servos
« Réponse #14 le: février 06, 2016, 09:00:01 am »
Oui mais le TC54 à une tension maxi de 10V. Ça ne va pas aller avec un VIN de 12V
Cordialement