Accueil

|

3D

|

DCC

|

Divers

|

ESP12-Car

|

Maquette

|

Principes

|

Téléchargement
 
Divers

>

Clavier multiplexé

>

Une publicité

>

Ma bibliothèque d'effets LED

>

Banc essai
Recherche
le train de JC

>

6574 visites

>

Me contacter

>

Administration

-------Ici-------
Pas de cookies
Rien à accepter
Pas de pop-up
Pas de pub
 

Je vous propose une bibliothèque qui gère mes effets de lumière. Je l'ai créée et je m'en sert dans mes décodeurs. Les paramètres sont en EEPROM pour pouvoir stocker les informations dans des CV. Grâce à la bibliothèque NMRA.H vous pouvez modifier les CV avec votre centrale DCC. Vous pouvez la télécharger ici Vous n'avez plus qu'à l'ajouter aux bibliothèques de votre IDE arduino.

Mise à jour:

L'autre bibliothèque gère les servomoteurs. En fait il y a ServoPico pour le raspbarry pi pico et ServoT2 pour les arduino nano. Les explications sont après LEDV2


LedV2

Cette bibliothèque permet de gérer des effets de leds avec des options.

  • On/Off
  • Clignotement
  • Gyrophare
  • Hasard
  • Soudure
  • Bougie (flamme)
  • Feu (Rouge,vert,jaune)

Chaque sortie possède une plage de 10 CV. Le nombre de sorties varie en fonction du décodeur. Mon décodeur 8L8SaNano possède 8 sorties leds amplifiées et 8 sorties servo et il est programmable par la centrale. Mon décodeur 16L8SaPico possède 16 sorties leds amplifiées et 6 servos toujours programmable avec la centrale DCC. Tous les CV ne sont pas utilisés, cela donne une marge pour des options supplémentaires. D'autre part, cela m'est plus facile pour retouver le CV d'une sortie..... c'est (sortie*10)+30 

Les CV commencent à l'adresse 30. En effet la bibliothèque NMRA.H écrit dans les CV7 et CV29...donc écraserait d'éventuels paramètres. Les sorties représentent les sorties physiques. Ce n'est pas le n° de pin qui change en fonction du type de décodeur.

CV 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 CV
CV0 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 CV0
CV1 31 41 51 61 71 81 91 101 111 121 131 141 151 161 171 181 191 201 211 221 231 241 CV1
CV2 32 42 52 62 72 82 92 102 112 122 132 142 152 162 172 182 192 202 212 222 232 242 CV2
CV3 33 43 53 63 73 83 93 103 113 123 133 143 153 163 173 183 193 203 213 223 233 243 CV3
CV4 34 44 54 64 74 84 94 104 114 124 134 144 154 164 174 184 194 204 214 224 234 244 CV4
CV5 35 45 55 65 75 85 95 105 115 125 135 145 155 165 175 185 195 205 215 225 235 245 CV5
CV6 36 46 56 66 76 86 96 106 116 126 136 146 156 166 176 186 196 206 216 226 236 246 CV6
CV7 37 47 57 67 77 87 97 107 117 127 137 147 157 167 177 187 197 207 217 227 237 247 CV7
CV8 38 48 58 68 78 88 98 108 117 128 138 148 158 168 178 188 189 208 218 228 238 248 CV8
CV9 39 49 59 69 79 89 99 109 119 129 139 149 159 169 179 189 199 209 219 229 239 249 CV9

 

 

 

 

 

 

 

 

 

Exemple la sortie n° 5 possède 10 CV stockés aux adresses 80 à 89. Je m'arrête à 249 car le RASPBERRY PI PICO n'a pas d'EEPROM (elle est émulée). Je n'ai pas eu de problème tant que je ne dépassais pas la valeur de 256. De toutes façons faire un décodeur avec 30 sorties ne serait pas pratique. Les sorties peuvent être de type LED avec bibliothèque LedV2.h ou SERVO avec mes bibliothèques ServoT2.h (pour Nano) et ServoPico.h (pour Pico). Maintenant je ne vais parler que de CV0 à CV9 puisque le raisonnement est le même pour toutes les sorties.


CV0-CV1 Ce couple de CV contient le n°de l'accessoire déclaré dans votre centrale. Le stockage se fait sur 2 octets pour pouvoir avoir 65535 accessoires. Ok là c'est un peu beaucoup mais sur un octet cela nous limite à 256 accessoires. Dans le CV0 il faut mettre le reste de la division du numéro d'accessoire par 256. Dans le CV1 il faut mettre le quotient du numéro d'accessoire par 256. ( voir sur le net "octet de poids fort et octet de poids faible) Exemple:

  • n°accessoire 158 -> CV0=158 CV1=0  
  • n°accessoire 312 -> CV0=56 CV1=1
  • n°accessoire 756 -> CV0=244 CV1=2

Voici un fichier XLS qui vous donne tous les CV0 et CV1 pour les 1024 premiers accessoires


CV2

On stocke dans CV2 le mode de fonctionnement de la sortie. Aujourd'hui (avant évolution possible) il peut prendre la valeur de 1 à 9. 


CV2=1 Mode On/Off

La sortie s'allume et s'éteint comme un simple interrupteur. Voici les options possibles:

CV3>0 Il y aura un effet "néon" à l'allumage

CV4>0 Il y aura un effet "faux contact" pendant la période d'allumage. Courte extinction par période aléatoire.


CV2=2 Mode Clignotement

La sortie va clignoter. Le clignotement est un cycle qui contient 3 valeurs (toutes en 1/10 de secondes)

CV3   contient la valeur de retard du démarrage du cycle. Cela ne sert que si vous voulez faire des effets avec d'autres sorties. Une valeur à 0 fait démarrer sans délai.Voir plus bas pour des explications sur des effets avec d'autres sorties (chenillard par exemple)

CV4 contient la valeur de la période allumée.

CV5 contient la valeur de la période éteinte. (CV4 et CV5 peuvent ne pas être de la même vateur pour faire des effets de "flash")

Pour une sortie clignotante rapide : CV3=0 CV4=5 CV5=5

Pour une sortie clignotante lente : CV3=0 CV4=20 CV5=20

Pour une sortie flash rapide: CV3=0 CV4=4 CV5=10

Pour une sortie flash lent: CV3=0 CV4=4 CV5=40

Vous pouvez faire des effets combinés avec d'autres sorties, le principe étant que chaque sortie soit indépendante. La notion à garder à l'esprit est la durée du cycle (CV3+CV4+CV5). Il doit être le même pour toutes les sorties de l'effet. De plus, toutes les sorties de l'effet doivent avoir le même numéro d'accessoire (elles répondent toutes au même ordre)

Clignotant alternatif avec deux sorties (un peu comme les feux des passages à niveau)

Sortie 0 CV0=x CV1=y CV2=2 CV3=0 CV4=10 CV5=10 (CV3+CV4+CV5=20)

Sortie 1 CV0=x CV1=y CV2=2 CV3=10 CV4=10 CV5=0 (CV3+CV4+CV5=20)

Même raisonnement pour un effet de chenillard (exemple sur 4 leds)

Sortie 0 CV0=x CV1=y CV2=2 CV3=0 CV4=10 CV5=30 (CV3+CV4+CV5=40)

Sortie 1 CV0=x CV1=y CV2=2 CV3=10 CV4=10 CV5=20 (CV3+CV4+CV5=40)

Sortie 2 CV0=x CV1=y CV2=2 CV3=20 CV4=10 CV5=10 (CV3+CV4+CV5=40)

Sortie 3 CV0=x CV1=y CV2=2 CV3=30 CV4=10 CV5=0 (CV3+CV4+CV5=40)


CV2=3 Mode Gyrophare

Avec ce mode, la led a un effet de gyrophare. Ce n'est possible que sur les sorties affectées a une pin PWM (Pas de problème avec un Pico)

CV3 contient la vitesse CV3=5 ->  c'est rapide et CV3=30 -> c'est lent


CV2=4 Mode Hasard

La led va s'allumer et s'éteindre aléatoirement. L'unité de stockage est la seconde

CV3 est la durée minimum allumé

CV4 est la durée maximum allumé

CV5 est la durée minimum éteint

CV6 est la durée maximum éteint


CV2=5 Mode Soudure

La sortie aura un effet de soudure à l'arc. La led doit être cachée et de forte intensité. Pas de paramètre. Il y a des périodes de soudures intercallées par des pérodes de repos.


CV2=6 Mode Bougie

La led va scintiller comme une bougie. Si vous avez 3-4 sorties avec des leds rouges, jaunes, blanches, vous aurez un effet de feu. l'effet est très réaliste lorsque l'on ne voit pas les leds. pas de paramètres.


CV2=7 Mode Feu vert (feu tricolore)

Combiné avec 2 autres sorties, vous pouvez gérer un "feu tricolore". les deux sorties verte et rouge doivent avoir le même numèro d'accessoire, la jaune c'est +1 (voir explication en mode jaune). Le numéro d'accessoire (CV0 et CV1) doit être le même pour le feu "rouge" et le feu "vert".

En CV3 n° de la sortie du feu "jaune", en effet la sortie rouge ayant le même n°d'accessoire, il sera éteint.


CV2=8 Mode Feu rouge (feu tricolore)

Combiné avec 2 autres sorties, vous pouvez gérer un "feu tricolore".  les deux sorties verte et rouge doivent avoir le même numèro d'accessoire, la jaune c'est +1 (voir explication en mode jaune)

En CV3 n° de la sortie du feu "jaune", en effet la sortie verte ayant le même n°d'accessoire, il sera éteint.


CV2=9 Mode Feu jaune (feu tricolore)

Combiné avec 2 autres sorties, vous pouvez gérer un "feu tricolore".  les deux sorties verte et rouge doivent avoir le même numèro d'accessoire, (CV0 et CV1) la jaune c'est +1 

En CV3 n° de la sortie du feu "vert" afin que la bibliothèque puisse l'éteindre.

En CV4 n° de la sortie du feu "rouge" afin que la bibliothèque puisse l'éteindre.

Petit rappel sur la norme DCC à propos des accessoires. Un ordre accessoire est toujours n°accessoire et une position "0" ou "1". Avec ce principe, les accessoires demandant plus de 2 positions ne sont pas permis, en effet 0 pour vert, 1 pour rouge, mais plus de possibilité pour jaune. En pratique la norme DCC utilise les numèros d'accessoire suivant. Lorsque vous déclarez un feu à 3 positions (vert, rouge, jaune) dans votre centrale à l'adresse 56 (par exemple) vous recevrez les ordres suivants:

ordre reçu 56 - 0 veut dire n°accessoire 56 à vert

ordre reçu 56 - 1 veut dire n°accessoire 56 à rouge

ordre reçu 57 - 1 veut dire n°accessoire 56 à jaune.

Donc le numéro d'accessoire (CV0,CV1) de la sortie "jaune" d'un feu tricolore est toujours n°+1 de ses feux "vert" et "rouge".


Bibliothèques SERVOT2 (pour nano) et SERVOPICO (pour pico)

Elle s'utilise comme la bibliothèque classique SERVO.H. Mais alors pourquoi avoir fait une surcouche et ne pas utiliser SERVO.H?

La bibliothèque SERVO.H doit entrer en conflit avec NMRA.H probablement utilisation du même timer (je laisse la main aux spécialiste). En pratique, je peux déclarer 2-3 servos et le décodeur fonctionne normalement, mais si je déclare plus de 3 servos, NMRA.H ne détecte plus les ordres DCC transmis. Me demander pas pourquoi, juste une constatation. J'ai donc trouvé SERVOTIMER2 une bibliothèque de servo qui utilise le timer2. Avec servotimer2, le décodeur fonctionne normalement avec 8 servos.....sur nano. Sur pico, cela ne veut pas compiler, peut-être que la bibliothèque servotimer2 est trop vieille. Sur pico, on a pas besoin de bibliothèque pour générer une impulsion de 1 à 2 ms toutes les 20 ms car il existe un mots clé qui peut piloter le PWM. Avec analogWriteFreq(50); le PWM aura une impulsion toutes les 20 ms, il suffit de faire un analogWrite entre 15 et 65 pour faire bouger votre servo de 0 à 180. Rien de scientifique que des tests.

  • CV0-CV1 adresse de l'accessoire
  • CV2 valeur minimal, en général 0
  • CV3 valeur maximal en général 180 (pas de contrôle si mini>maxi)
  • CV4 vitesse (5 rapide à 20 lent)
  • CV5 initialisation 0 pour s'initialiser à minimum (CV2) 1 pour s'initialiser à maximun (CV3) et il faut que je teste 2 pour pas de positionnement à l'initialisation.
  • CV6>0 inversion de sens

 

Pour l'utilisation des bibliothèques:

1-Il faut dire que l'on va utiliser les bibliothèques (exemple, ne pas mettre si vous n'utilisez pas)

  • #include <LedV2.h>
  • #include <ServoPico.h>
  • #include <ServoT2.h>

2-Déclarer les objets (objet LedV2 ou objet ServoPico ou ServoT2)

  • LedV2 sortie15;
  • ServoPico sortie16;
  • ServoT2 sortie10;

Ensuite toutes les bibliothèques ont les mêmes commandes... pour faire la même chose

3-Initialiser les objets  .begin(n°de la sortie)  ou .begin(n°pin, n°sortie). En effet en fonction du hard du décodeur, les sorties ne sont pas n'ont pas forcément le même numéro. Le produit fini, il est préférable que l'on voit les numéro de sortie se suivrent.

  • sortie0.begin(0); la sortie 0 sera pilotée par la pin 0 (possible sur pico à déconseiller sur nano)
  • .sortie0.begin(4,0); la sortie 0 sera pilotée par la pin 4 

4-Mettre à jour mes variables avec les CV  .get_NumAcc()    (en retour j'ai le numéro de l'accessoire). Iinitialisation de variables en fonction des CV, ou mise à jour après modification de CV avec votre centrale DCC

  • NumAcc[0]=sortie0.get_NumAcc();

5- Indiquer à l'objet l'ordre DCC .set(Direction); Quand NMRA.H a détecté un ordre, il faut le transmettre à la bibliothèque.

  •   if(Addr==NumAcc[0]) sortie0.set(Direction);

6- faire tourner la bibliothèque .loop A faire le plus souvent.... donc dans le loop du programme.

  • sortie0.loop();

 

 

5.6.34