Introduction
J’ai découvert par hasard, un projet relativement intéressant permettant de faire une matrice de LED et d’afficher dessus ce que l’on souhaite. Ce projet s’appelle awtrix.
J’ai donc essayé de faire un équivalent de ce projet mais à ma manière, c’est à dire en refaisant tout le code. En effet awtrix 1.0 est codé en C++
et awtrix 2.0 est une refonte complète avec un contrôleur codé en C++
et des applications codées en Visual Basic
. Tout cela ne m’intéresse pas vraiment, du coup je me suis dit que je pouvais le refaire en mode minimaliste à base de python.
Matériel nécessaire
Pour pouvoir construire mon afficheur j’ai besoin de :
- Une matrice de LED
- Un embout pour l’alimentation
- Un bloc d’alimentation
- Un Rapsberri Pi Zero W
Je suis parti sur un RPI0W
mais il aurait été possible d’utiliser plein d’autres choses différentes (RPI3, ESP8266…). Bien entendu à cela il faut ajouter une carte microSD pour le RPI0W
.
Boitier
Pour faire le boitier de l’afficheur, j’ai utilisé ces plans, qui sont aussi ceux utilisés par awtrix
. Je les ai donnés à un ami qui a accès à une imprimante 3D (merci !!!!!) et qui a donc pu me les imprimer.
Le résultat n’est pas parfait, mais suffisant. Il a fallut que je passe un peu les côtés au dremel car sinon ça ne s’emboitait pas, et faire quelques finitions à la lime pour enlever les petites imperfections.
Branchements
Les branchements sont basiques. La matrice de LED utilise trois fils:
- La masse qui sera reliée au bloc d’alimentation
VCC+
qui sera aussi relié au bloc d’alimentation. Il fonctionne en 5V, donc aucun problème de conversion.- Le file de aata qui sera relié quant à lui à un port
GPIO
duPI0
Avant de tout emboîter j’ai fait quelques tests avec une breadboard
comme on peut le voir dans les photos suivantes.
Partie logicielle
Une fois que tous les branchements sont faits, il faut implémenter le code qui tournera sur le PI0
et qui pilotera l’affichage de la matrice. Pour la partie bas niveau, je me suis basé sur cette librairie. Elle implémente toute la glue bas niveau permettant d’allumer une LED du bandeau dans une certaine couleur et avec une certaine intensité. Il faut savoir que la matrice de LED est en réalité juste un bandeau de LED de dimension 1 replié sur lui même en serpentin.
Ci-dessous les indices de chaque LED dans la matrice:
0 15 16 ...
1 14 17 ...
2 13 18 ...
3 12 19 ...
4 11 20 ...
5 10 21 ...
6 9 22 ...
7 8 23 ...
J’ai codé ensuite le programme qui permet à partir des services offerts par la librairie, d’afficher du texte, des images…
led_matrix
Le code que j’ai developpé se trouve sur ici sur mon github. Je me suis inspiré de ce code pour la partie FrameBuffer
que j’ai un peu modifié pour notamment ajouter des fonctions de scrolling.
led_matrix
arrive avec 3 exécutables:
led_matrix
qui permet d’utiliser des fonctions basiques comme:- Allumer une LED
- Tracer une ligne
- Dessiner un rectangle
- …
matrix_animation
qui permet d’afficher une animation. J’en ai développé quelques unes comme la matrice du film Matrix, un feu, un pacman qui avance…matrix_manager
qui permet d’afficher de façon séquentielle plusieurs animations
Chaque programme peut utiliser une sorte d’afficheur virtuel qui peut être:
- L’afficheur LED
- Le terminal
- Un terminal ncurses
Les deux derniers sont utiles pour faire des tests dans le cas où on n’a pas l’afficheur LED.
$ matrix_animation -S Console -A "Pacman()"
................................
.........####...................
........###.##..................
.......######...................
.......#####....................
.......######...................
........######..................
.........####...................
Mise en oeuvre
Les premiers tests montrent que les LED éclairent fort, très fort… Voilà le résultat avec une intensité de 5%…
Pour pouvoir avoir un effet de diffusion et pour éviter de se griller l’oeil à chaque fois qu’on regarde l’afficheur, il faut mettre la grille en place et utiliser un diffuseur pour avoir l’impression d’un carré qui s’affiche et non pas d’une LED.
Ici en utilisant juste une feuille de papier blanche.
Le rendu est bien meilleur, bien que la feuille blanche manque clairement de contraste. Un autre exemple avec le PI0
qui se connecte sur un serveur distant pour récupérer la météo locale.
A l’heure actuelle, j’ai changé la feuille blanche par un sac poubelle derrière la grille… Ca permet de grandement améliorer le contraste et de garder une assez bonne diffusion. C’est pas génial, mais pour le moment je n’ai pas trouvé mieux. C’est clairement un point à améliorer.
Pour l’aspect visuel, j’ai bricolé deux plaques de plexiglass que j’ai mise de chaque coté du boitier… pour l’aspect WAF.
Conclusions
C’était un projet relativement sympa à faire et pour le coup assez utile. J’ai implémenté plusieurs applications qui tournent dessus permettant d’afficher:
- l’heure et la date
- La température de chaque pièce de la maison
- La météo du lendemain
- …
Futures Améliorations
Le code led_matrix
qui tourne sur le PI0
peut grandement être amélioré. Je n’ai pas mis beaucoup de temps pour le développer et il y a probablement pas mal de bugs à corriger et d’optimisations à faire.
Il faut ensuite développer du contenu à afficher, je pense notamment à:
- Un reminder pour les futurs évènement enregistrés dans un calendrier
- Quelques applications pour les enfants, par exemple un entraînement aux tables de multiplication pour ma fille :)
- Coupler l’affichage à un détecteur de présence, pour éviter l’affichage quand il n’y a personne dans la pièce
- …
Sur la partie boitier, je ne suis pas réellement satisfait du rendu final, non seulement sur la partie contraste, mais aussi sur le boitier en lui même avec ses plaques de plexiglass. Je pense donc retravailler cette partie.