Afficheur LED

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 :

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.

Boitier Grille

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 du PI0

Avant de tout emboîter j'ai fait quelques tests avec une breadboard comme on peut le voir dans les photos suivantes.

PI0 breadboard

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%…

LED

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.

Diffusion

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.

Température

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.