Un client nous a récemment demandé s'il était possible de créer un grand écran à défilement horizontal avec les modules Yoctopuce. Le Yocto-Color-V2-C est capable de piloter une chaîne de 512 LEDs, mais pour faire un grand écran à défilement horizontal, 512 LEDs ne suffisent qu'à faire une ligne de pixels. Alors, peut-on combiner plusieurs modules et les piloter de manière synchronisée ?
Pour un affichage qui ne change que périodiquement, il n'y a aucun doute qu'on peut combiner plusieurs Yocto-Color-V2-C pour piloter plusieurs milliers de LEDs RGB. Mais pour faire un écran à défilement fluide, il faut être capable de mettre à jour de manière très synchronisée toutes les LEDs, avec une fréquence de rafraîchissement d'au moins 25Hz.
La méthode force brute qui consisterait à envoyer en continu l'état de toutes les LED n'est pas envisageable: la quantité de données transférées serait trop importante pour obtenir les performances souhaitées. Nous avons donc récemment ajouté des méthodes dédiées facilitant la création d'affichage par défilement, permettant de faire, à l'aide d'une seule commande atomique:
- le décalage de tous les pixels RGB d'une position (vers la gauche ou la droite)
- le choix de la couleur du nouveau pixel RGB
- le déclenchement du rafraîchissement immédiat de la chaîne de LED
![]()
Effet de la méthode shr_rgb()
Selon l'effet désiré, vous avez le choix entre quatre méthodes: shl_rgb et shl_hsl pour défiler vers la gauche (shift left) ou shr_rgb et shr_hsl pour défiler vers la droite (shift right). Pour mettre à jour un affichage formé de plusieurs lignes de pixels, on appelle la méthode choisie consécutivement sur chacune des lignes de l'affichage, dans l'ordre. En supposant que la colonne de pixels à ajouter à gauche est définie dans un tableau newPixels, on utiliserait le code suivant:
for i in range(0, N_LED_STRIPS):
ledCluster[i].shr_rgb(newPixels[i])
# pause pour 10ms
YAPI.Sleep(10)
Le fait que la mise à jour des lignes soit séquentielle cause un très léger effet oblique sur l'affichage, mais il ne dérange absolument pas, au contraire. Voici le résultat pour un affichage à six lignes:
![]()
Pour réaliser cette vidéo, nous avons utilisé un Raspberry Pi 3B+, six Yocto-Color-V2 et des bandes de LED RGB de 4m avec 60 LEDs/m (mais les modules sont configurés pour piloter des bandes jusqu'à 8m, soit 480 LEDs). Voici qui vérifie qu'il est possible de piloter de manière synchrone par USB plusieurs Yocto-Color-V2 pour rafraîchir un écran à défilement avec une fréquence de rafraîchissement de 30 Hz.
Par curiosité, nous avons essayé de piloter le système à travers un YoctoHub-Ethernet connecté à un YoctoHub-Shield. Malheureusement, la vitesse de communication entre le hub Ethernet et le shield ne permet pas un taux de rafraîchissement comparable. On peut régler ce problème spécifique en répartissant les six bandes de LEDs sur deux YoctoHub-Ethernet, mais un nouveau problème apparaît alors: les légères variations de latence réseau entre les deux hubs résultent par moments en un décalage entre les deux groupes de bandes de LEDs, qui se remarque clairement. Mieux vaut donc s'en tenir à un contrôle direct par mini-PC, par USB.
Notez encore que la consommation de ces bandes de LEDs n'est pas négligeable, et croît fortement avec le nombre de LEDs allumées. Il est donc quasiment indispensable de fournir une alimentation externe aux bandes de LEDs. Dans notre cas d'exemple, la consommation des LEDs s'élève à 1 Ampère.
