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.
|