Bonjour
Pour les ULN2803 qui crament, j'ai "investi" dans des supports pour CI
Le contrôle d’exclusion consiste à garantir, au plus bas niveau logiciel possible, qu’en aucun cas une bobine ne peut être alimentée si l’autre bobine du même aiguillage est déjà sous tension.
Ce contrôle est codé juste avant le digitalWrite() pour une fiabilité maximale.
La durée minimum de repos est gérée de manière globale pour les deux bobines d’un même aiguillage. Avant de mettre sous tension une bobine, le programme vérifie qu’elle et sa sœur sont au repos depuis au moins cette durée paramétrée.
Le dernier paramètre est un poil plus compliqué.
La règle s’énonce simplement, mais sa conséquence est moins triviale.
Elle s’applique de manière globale sur les 4 aiguillages (8 bobines) commandés.
Le paramètre définit un délai minimum entre les débuts de mise sous tension de plusieurs bobines. On ne s’intéresse là qu’aux fronts montants.
Ainsi, avant de mettre sous tension une bobine, le programme recherche la dernière bobine activée, et vérifie que ce délai minimum d’écart est bien respecté.
Par exemple, prenons comme hypothèses :
- une durée d’impulsion à 500 ms
- un ordre de bascule des 4 aiguillages simultanément, reçu à T0
Avec le paramètre positionné à 0 :
- les 4 aiguillages vont être activés simultanément, de T0 à T0+500
Avec le paramètre positionné à 100 :
- l’aiguillage 1 va être activé de T0 à T0+500
- l’aiguillage 2 va être activé de T0+100 à T0+600
- l’aiguillage 3 va être activé de T0+200 à T0+700
- l’aiguillage 4 va être activé de T0+300 à T0+800
Donc entre T0+300 et T0+500 on aura les 4 aiguillages actifs simultanément
Avec le paramètre positionné à 200 :
- l’aiguillage 1 va être activé de T0 à T0+500
- l’aiguillage 2 va être activé de T0+200 à T0+700
- l’aiguillage 3 va être activé de T0+400 à T0+900
- l’aiguillage 4 va être activé de T0+600 à T0+1100
Là il n’y a plus au maximum que 3 aiguillages actifs simultanément, entre T0+400 et T0+600
Et ainsi de suite en augmentant la valeur du paramètre.
Avec le paramètre est positionné à 600 :
- l’aiguillage 1 va être activé de T0 à T0+500
- l’aiguillage 2 va être activé de T0+600 à T0+1100
- l’aiguillage 3 va être activé de T0+1200 à T0+1700
- l’aiguillage 4 va être activé de T0+1800 à T0+2300
Et là seul un aiguillage est actif à la fois.
D’une part, ce paramètre permet de borner le nombre maximum de bobines actives simultanément au niveau d’un module.
D’autre part, il me semble (mais pas sur) que les instants de mise sous et hors tension des bobines génèrent le plus de parasites (inductance) sur la ligne d’alim 12V. Ce paramètre permet ne pas avoir de multiples fronts montants ou descendants simultanés. Un genre de debounce d’alim.
La nécessité de se pencher sur ce paramètre dépend des caractéristiques de l’alim 12V.
Et effectivement, si cette nécessité est avérée, il faudra aussi s’en préoccuper au niveau au-dessus, qui gère plusieurs modules parallèles.
Le maître I2C a accès à toutes les infos nécessaires pour gérer cela, dans les messages remontants. C’est vrai qu’à la fin, cela a fait une gestion à deux niveaux, mais tout ce qui peut être pris en charge au niveau le plus bas me semble plus fiable.
Dans mon cas, toujours en approche minimaliste, je pense partir sur une petite alim 12V 1,5A pour l’ensemble des aiguillages.
J’aurai donc au maximum une bobine active par module, et un seul module actif à la fois (gestion au niveau du Maître I2C : récupération régulière de l’état des modules, et envoi d’un ordre à un module seulement lorsque tous les autres sont au repos).
Pour l’I2C on verra bien. Je suis plutôt confiant car les modules ne seront pas positionnés sous le réseau, mais regroupés à la place des boitiers de boutons poussoirs actuels. Les câbles vers chaque aiguillage sont déjà tirés. Donc le réseau électrique 5V sera court et relativement distant des rails.
Pour la fiabilisation des positions d’aiguilles : admettons qu’une fonction soit prévue au niveau du maître I2C, pour resynchroniser tous les aiguillages (déclenchement manuel par appui sur un bouton poussoir, lorsque l’humain sent qu’il y a un truc qui déconne quelque part).
En l’état, le maître sera alors obligé de basculer tous les aiguillages dans un sens, puis dans l’autre, pour fiabiliser leur position. Pas terrible.
Je pourrais ajouter une fonction supplémentaire au niveau des modules, pour relancer une impulsion sur les bobines. Si l’aiguillage est censé être droit, je rebalance une impulsion sur la même bobine.
Dans la plupart des cas, l’impulsion ne servira à rien, car l’aiguillage sera déjà dans la bonne position. Du coup, je me demande s’il n’y a pas un risque à forcer trop longtemps sur la fin de course.
Il serait peut-être plus adéquat de passer par des impulsions plus brèves. Par exemple, au lieu d’une impulsion standard de 500 ms, envoyer 2 impulsions de 250 ms espacées d’une seconde.
Autre point :Jusqu’ici j’ai raisonné aiguillage, en supposant qu’un dételeur fonctionne de la même manière. Aucune distinction n’est effectuée au niveau du module.
Est-ce adéquat ?
Par exemple, est-ce qu’il y aurait nécessité à pouvoir paramétrer séparément la durée d’impulsion, selon le type de matériel commandé ?