Bonjour à tous,
J'ai été très enthousiasmé par les projets de "satellite" présentés tant sur le site éditorial que sur le forum.
Dans mon mes réflexions sur son utilisation sur mon prototype de réseau, j'ai voulu optimiser l'utilisation des entrées/sorties de la carte satellite surtout pour la gestion des signaux lumineux, lesquels consomment beaucoup de sorties.
Je partage aujourd'hui les résultats de mes premiers tests.
La solution testéeLa solution consiste à utiliser la puce WS2811 que l'on trouve habituellement dans les guirlandes NEOPIXELS pour gérer, à partir d'une seule sortie de l'arduino, une chaine de LEDS RGB connectées en série. L'arduino envoie sur l'unique sortie une suite d'octets pour "commander" en couleur et intensité chacune des LEDS RGB.
Dans mes expériences, la puce WS2811 n'est pas utilisée pour piloter des LED RGB mais les trois led mono-couleur d'un signal lumineux. En chaînant quelques WS2811 on pilote facilement plusieurs signaux de 3 LEDS ou plus. La puce W2811 permet de commander chaque LED en PWM pour plus de réalisme.
Le matériel utiliséJ'ai commandé des circuits imprimés vendus par lot de 50 unités sur ebay pour un peu moins de 8 euros (
https://ebay.us/BwxQcH)
Je les ai ensuite connectés en série à un arduino nano et quelques signaux pour les programmer enfin avec la bibliothèque light_ws2812 (
https://github.com/cpldcpu/light_ws2812/tree/master/light_ws2812_Arduino)
Les résultatsPiloter la chaîne de LED est simple avec la bibliothèque citée plus haut.
Mes problèmes ont commencés quand j'ai testé l'utilisation conjointe de ces LED avec des servos.
En effet, la bibliothèque LIGHT_WS2812, comme toutes les autres similaires que j'ai testées, désactivent les interruptions le temps d'envoyer à l'ensemble des LED la série d'octets (un octet par LED). La bibliothèque servo utilise des interruptions pour gérer la durée des impulsions envoyées aux servomoteurs => potentielle collision !
En poussant mes tests avec 8 servos et 18 LEDS (6 puces) j'ai constaté les effets néfastes de cette désactivation temporaire des interruptions : les servomoteurs ont des petits tremblements de temps en temps.
J'ai finalement trouvé une parade en vérifiant, avant de lancer le rafraichissement des LED, qu'il restait suffisamment de temps avant la prochaine interruption générée par la bibliothèque servo :
if (OCR1A - TCNT1 > LEDS_SYNC_DURATION)) {
// on verfie que le temps restant avant la prochaine interruption (OCR1A - TCNT1)
// est suffisant pour rafraichir toutes les LED
[...]
leds.sync();
}
Mes questions à ce stade- L'implémentation usuelle du bus CAN sur locoduino utilise des interruptions. Est-ce que je peux espérer avec la nouvelle puce MCP2517FD et son énorme mémoire que l'on puisse se passer des interruptions pour éviter de nouvelles collisions entre les bibliothèques ?
- Est-ce que quelqu'un a déjà testé ce type de LED (neopixel) dans un environnement ferroviaire ? sont-elles sensibles aux perturbations électromagnétiques sur courtes distances (30 cm) ?