Récemment, une description du projet DIY original basé sur Raspberry Pi et des panneaux LED est apparue sur le réseau . Le but du projet est de visualiser le niveau de charge du processeur PC. Pour cela, une animation sur les panneaux LED d'un appareil fait maison est utilisée.
Plus la charge sur le processeur est élevée, plus la température de la puce est élevée et plus les couleurs des panneaux LED deviennent chaudes. La charge minimale est cyan et bleu, le maximum est orange et rouge. Le nombre total de LED impliquées atteint 12 000. Sous la découpe se trouve une description du projet, ses éléments, ainsi que le code source du logiciel qui assure le fonctionnement du gadget.
Voici à quoi tout cela ressemble:
Comment est née l'idée du projet?
L'année dernière, l'auteur a assisté au 36e Congrès de la communication du chaos (36C3), où il a vu un grand nombre de projets de bricolage, y compris des cubes LED. Il a été très impressionné par cela.
La plupart de ces projets concernaient la réponse de l'appareil à des facteurs externes. Ainsi, lorsque l'appareil était tourné dans la main, il scintillait de toutes les couleurs de l'arc-en-ciel, montrant des images colorées.
Sebastian Staacks a décidé de développer son propre projet - un appareil qui peut montrer le niveau de charge d'un processeur PC. Il n'y a pas de sens pratique particulier, c'est un projet juste pour le plaisir.Le coût total du système dans l'assemblage était de 150 $.
La mise en œuvre du projet
L'aspect et le fonctionnement du cube LED sont indiqués ci-dessus. Maintenant, quelques détails. L'appareil s'allume automatiquement après le démarrage du PC auquel il est connecté.
L'auteur dit qu'il a essayé de rendre les couleurs et les animations aussi neutres que possible afin de ne pas distraire l'utilisateur du PC lorsqu'il travaille (ou joue).
Matériel et logiciel
La conception de l'appareil est très simple. C'est ce que verra une personne souhaitant démonter l'appareil.
Le "cube" n'a que trois faces. Ceci est fait afin de réduire le coût et de simplifier quelque peu la conception. Si toutes les facettes fonctionnaient, le projet serait trop coûteux.
L'auteur a commandé des panneaux LED à Aliexpress, choisissant la meilleure combinaison de prix et de qualité. Cela n'a pas été facile, a-t-il dit, car les fournisseurs ont rarement fourni des spécifications détaillées pour leur produit. En conséquence, il n'était pas toujours clair si ces panneaux étaient adaptés au projet. En conséquence, le développeur a acheté des panneaux avec LED RGB 64x64 et alimentation 5V.
Une unité de 50W avec 10A et 5V a été utilisée pour alimenter ces panneaux. L'adaptateur alimente le pilote de la matrice Adafruit, qui est connecté aux panneaux via le Raspberry Pi. L'essentiel est que les caractéristiques de l'alimentation couvrent la consommation du système.
Gestion des panneaux
Quant à la "framboise", le développeur a utilisé Raspberry Pi 2. Pour le moment, ce dispositif monocarte ne peut pas être considéré comme trop obsolète moralement, à de telles fins, il suffit amplement. De plus, il ne chauffe presque pas pendant le fonctionnement, ce qui ne peut être dit pour les troisième et quatrième générations.
Un module WiFi externe a été connecté à la carte pour se débarrasser des câbles de connexion au réseau. Presque rien n'a été nécessaire pour souder, à l'exception de quelques opérations avec l'Adafruit RGB Matrix Bonnet.
Voici à quoi ressemble la structure finale une fois assemblée. Afin de lui donner toute forme, l'auteur a utilisé l'étui, qui a été imprimé sur une imprimante 3D.
Les panneaux ne sont pas collés de manière à pouvoir être retirés du boîtier à tout moment. Des montures Raspberry Pi sont également fournies. Vous pouvez également imprimer la base du cube, mais en général, tout semble bon et ainsi de suite.
Maintenant sur le logiciel. Avec le matériel, tout est plus simple, mais avec le logiciel de gestion, vous devrez bricoler. Le shader OpenGL est utilisé pour l'animation. De plus, un script est en cours d'exécution sur le PC qui transfère les caractéristiques du processeur au "malinka".
Le logiciel le plus important est le petit programme C ++ qui manipule le cube. Il utilise la bibliothèque spéciale rpi-rgb-led-matrix . En particulier, il est nécessaire d'ouvrir un port UDP afin d'obtenir les caractéristiques du travail du processeur avec un PC, ainsi que OpenGL pour le rendu de l'animation. Les détails du travail de la bibliothèque sont ici .
Pour l'installer, vous avez besoin d'un script d'Adafruit . Les instructions d'installation sont disponibles sur le lien spécifié.
Voici les options pour personnaliser les panneaux
//LED Matrix settings
RGBMatrix::Options defaults;
rgb_matrix::RuntimeOptions runtime;
defaults.hardware_mapping = "adafruit-hat-pwm";
defaults.led_rgb_sequence = "RGB";
defaults.pwm_bits = 11;
defaults.pwm_lsb_nanoseconds = 50;
defaults.panel_type = "FM6126A";
defaults.rows = 64;
defaults.cols = 192;
defaults.chain_length = 1;
defaults.parallel = 1;
Veuillez noter que pwm_bits et pwm_lsb_nanoseconds ne semblent pas très importants, mais ils sont essentiels - principalement pour la qualité de l'image. En particulier, pwm_bits définit le nombre de bits PWM, qui définit le nombre de pas de couleur. L'inconvénient d'augmenter cette valeur est de diminuer le taux de rafraîchissement du panneau LED. Vous pouvez améliorer le paramètre en diminuant les paramètres pwm_lsb_nanoseconds - si vos panneaux prennent en charge des valeurs aussi faibles. Si vous envisagez de filmer un cube avec un appareil photo, il est préférable d'augmenter le taux de rafraîchissement pour que tout soit beau.
Il est important que le Pi exécute en permanence RGB Bonnet, sinon des artefacts peuvent apparaître. Pour cela, il est recommandé de réserver un cœur de processeur entier.
Le projet peut être trouvé cpu-stats-gl.cpp, pour l'utiliser dans votre propre projet. Vous aurez besoin des bibliothèques g ++ -g -o cpu-stats-gl cpu-stats-gl.cpp -std = c ++ 11 -lbrcmEGL -lbrcmGLESv2 -I / opt / vc / include -L / opt / vc / lib -Lrpi -rgb-led-matrix / lib -lrgbmatrix -lrt -lm -lpthread -lstdc ++ -Irpi-rgb-led-matrix / include /. Eh bien, pour ajouter le support OpenGl, vous devez suivre les instructions de Matus Novak .
Shader OpenGl
D'accord, à ce stade, le matériel est complet, plus le code important pour la gestion des panneaux. En particulier, vous pouvez déjà afficher du texte, des images et des GIF. Mais pour un rendu coloré, vous devez ajouter OpenGL.
L'animation qui affiche l'état du processeur est implémentée par un shader de fragment, c'est-à-dire un petit morceau de code qui fonctionne en parallèle avec des «collègues». Ces zones sont nécessaires pour chaque pixel du panneau.
Pour projeter correctement l'image sur le cube, l'auteur rend trois paires de triangles, dont chacun couvre une face du cube. Le fait est que si vous regardez un cube comme un objet 3D et que vous souhaitez afficher une forme 2D telle qu'un cercle, vous pouvez attribuer les coordonnées d'un canevas 2D imaginaire devant votre visage à chaque arête du cube.
Si nous "étendons" maintenant le cube dans un tableau rectangulaire de pixels que nous adressons réellement, nous pouvons couvrir ce tableau avec plusieurs triangles. Nous pouvons également mapper les coordonnées du «canevas virtuel» à chaque sommet pour obtenir un mappage de nos coordonnées canevas aux pixels réels dans le tableau de panneaux.
Pour les shaders, c'est facile: vous devez fournir les coordonnées du canevas pour chaque sommet en tant que tampon de tableau supplémentaire pour le GPU, ce qui lui permet d'interpoler ces coordonnées pour chaque pixel.
Obtenir l'état du processeur
Des informations sur le mode de fonctionnement du processeur peuvent être obtenues via le protocole UDP à l'aide d'un script Python.
#!/usr/bin/python3
import psutil
import socket
import time
TARGET_IP="192.168.2.45"
TARGET_PORT=1234
while True:
temperature = 0.0
time.sleep(0.5)
temperature += psutil.sensors_temperatures()["k10temp"][0].current
time.sleep(0.5)
temperature += psutil.sensors_temperatures()["k10temp"][0].current
time.sleep(0.5)
temperature += psutil.sensors_temperatures()["k10temp"][0].current
time.sleep(0.5)
temperature += psutil.sensors_temperatures()["k10temp"][0].current
time.sleep(0.5)
temperature += psutil.sensors_temperatures()["k10temp"][0].current
temperature /= 5.0
cores = psutil.cpu_percent(percpu=True)
out = str(temperature) + "," + ",".join(map(str, sorted(cores, reverse=True)))
socket.socket(socket.AF_INET, socket.SOCK_DGRAM).sendto(out.encode("utf-8"), (TARGET_IP, TARGET_PORT))
Sur le PC de l'auteur, le script démarre automatiquement, une adresse IP statique est utilisée pour le fonctionnement, réservée au cube LED.
À ce stade, tout devrait fonctionner comme prévu.
Avez-vous aimé ce projet? Peut-être avez-vous développé quelque chose de similaire ou, au contraire, d'unique? Faites le nous savoir dans les commentaires.