Visualisieren Sie es: Raspberry Pi-basierter LED-Cube zeigt die CPU-Auslastung an



Kürzlich erschien im Netzwerk eine Beschreibung des ursprünglichen DIY-Projekts, das auf Raspberry Pi und LED-Panels basiert. Ziel des Projekts ist es, das Lastniveau des PC-Prozessors zu visualisieren. Hierzu wird die Animation auf den LED-Panels eines selbstgebauten Geräts verwendet.



Je höher die CPU belastet ist, desto höher ist die Temperatur des Chips und desto heißer werden die Farben der LED-Panels. Die minimale Belastung ist blau und blau, die maximale ist orange und rot. Die Gesamtzahl der beteiligten LEDs erreicht 12.000. Unter dem Schnitt finden Sie eine Beschreibung des Projekts, seiner Elemente sowie den Quellcode der Software, die den Betrieb des Gadgets sicherstellt.



So sieht alles aus:



Wie ist die Idee zum Projekt entstanden?



Im vergangenen Jahr nahm der Autor am 36. Chaos Communication Congress (36C3) teil, auf dem er eine Vielzahl von DIY-Projekten sah, darunter LED-Würfel. Das hat ihn sehr beeindruckt.





Bei den meisten dieser Projekte ging es um die Reaktion des Geräts auf externe Faktoren. Wenn das Gerät in der Hand gedreht wurde, leuchtete es in allen Farben des Regenbogens und zeigte farbenfrohe Bilder.



Sebastian Staacks hat beschlossen, ein eigenes Projekt zu entwickeln - ein Gerät, das die Auslastung eines PC-Prozessors anzeigen kann. Es gibt keinen besonderen praktischen Sinn, dies ist ein Projekt nur zum Spaß. Die Gesamtkosten des Systems in der Baugruppe betrugen 150 USD.



Projektdurchführung



Wie der LED-Würfel aussieht und funktioniert, ist oben dargestellt. Nun einige Details. Das Gerät schaltet sich automatisch ein, nachdem der PC, an den es angeschlossen ist, hochgefahren wurde.





Der Autor sagt, er habe versucht, die Farben und Animationen so neutral wie möglich zu gestalten, um den PC-Benutzer beim Arbeiten (oder Spielen) nicht abzulenken.



Hardware und Software



Das Design des Geräts ist sehr einfach. Dies sieht eine Person, die das Gerät zerlegen möchte.





Der "Würfel" hat nur drei Gesichter. Dies geschieht, um die Kosten zu senken und das Design etwas zu vereinfachen. Wenn alle Facetten funktionieren würden, wäre das Projekt zu teuer.



Der Autor bestellte LED-Panels bei Aliexpress und wählte die beste Kombination aus Preis und Qualität. Es sei nicht einfach, sagte er, da die Lieferanten selten detaillierte Spezifikationen für ihr Produkt vorlegten. Dementsprechend war nicht immer klar, ob diese Panels für das Projekt geeignet waren. Infolgedessen kaufte der Entwickler Panels mit 64 x 64 RGB-LED und 5 V-Netzteil.





Eine 50-W-Einheit mit 10 A und 5 V wurde verwendet, um diese Panels mit Strom zu versorgen. Der Adapter versorgt den Adafruit-Matrixtreiber mit Strom, der über den Raspberry Pi mit den Panels verbunden ist. Hauptsache, die Eigenschaften des Netzteils decken den Verbrauch des Systems ab.



Panel-Management



Für die "Himbeere" verwendete der Entwickler Raspberry Pi 2. Im Moment kann dieses Single-Board-Gerät moralisch nicht als zu veraltet angesehen werden, für solche Zwecke ist es völlig ausreichend. Außerdem erwärmt es sich während des Betriebs fast nicht, was für die dritte und vierte Generation nicht gesagt werden kann.





Ein externes WiFi-Modul wurde an die Karte angeschlossen, um die Kabel für die Verbindung mit dem Netzwerk zu entfernen. Zum Löten wurde fast nichts benötigt, außer ein paar Operationen mit der Adafruit RGB Matrix Bonnet.





So sieht die endgültige Struktur im zusammengebauten Zustand aus. Um alles in Form zu bringen, verwendete der Autor den Fall, den er auf einem 3D-Drucker druckte.





Die Paneele sind nicht geklebt, so dass sie jederzeit aus dem Gehäuse entfernt werden können. Himbeer-Pi-Halterungen sind ebenfalls vorhanden. Sie können auch die Basis für den Würfel drucken, aber im Allgemeinen sieht alles gut aus und so.





Nun zur Software. Mit "Hardware" ist alles einfacher, aber mit der Verwaltungssoftware müssen Sie basteln. OpenGL Shader wird für die Animation verwendet. Außerdem wird auf dem PC ein Skript ausgeführt, das die Eigenschaften des Prozessors auf die "Malinka" überträgt.



Die wichtigste Software ist das kleine C ++ - Programm, das den Cube manipuliert. Es verwendet die spezielle rpi-rgb-led-Matrix- Bibliothek . Insbesondere muss ein UDP-Port geöffnet werden, um die Eigenschaften der Prozessorarbeit mit einem PC zu erhalten, sowie OpenGL zum Rendern von Animationen. Details zur Arbeit der Bibliothek finden Sie hier .



Zur Installation benötigen Sie ein Skript von Adafruit . Installationsanweisungen finden Sie unter dem angegebenen Link.



Hier sind die Optionen zum Anpassen der Bedienfelder



//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;




Bitte beachten Sie, dass pwm_bits und pwm_lsb_nanosekunden nicht sehr wichtig aussehen, aber kritisch sind - vor allem für die Bildqualität. Insbesondere definiert pwm_bits die Anzahl der PWM-Bits, die die Anzahl der Farbschritte definiert. Der Nachteil beim Erhöhen dieses Werts besteht darin, die Bildwiederholfrequenz des LED-Panels zu verringern. Sie können den Parameter verbessern, indem Sie die Einstellungen für pwm_lsb_nanoseconds verringern - sofern Ihre Bedienfelder so niedrige Werte unterstützen. Wenn Sie einen Würfel mit einer Kamera aufnehmen, ist es besser, die Bildwiederholfrequenz zu erhöhen, damit alles schön aussieht.



Es ist wichtig, dass auf dem Pi kontinuierlich RGB Bonnet ausgeführt wird, da sonst Artefakte auftreten können. Hierzu wird empfohlen, einen gesamten Prozessorkern zu reservieren.



Das Projekt finden Sie unter cpu-stats-gl.cpp, um es in Ihrem eigenen Projekt zu verwenden. Zur Verwendung benötigen Sie g ++ - Bibliotheken -g -o CPU-Statistiken-gl CPU-Statistiken-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 /. Um OpenGl-Unterstützung hinzuzufügen, sollten Sie den Anweisungen von Matus Novak folgen .



OpenGl Shader



Okay, zu diesem Zeitpunkt ist die Hardware vollständig und der wichtige Code für die Verwaltung der Panels. Insbesondere können Sie bereits Text, Bilder und GIFs anzeigen. Für ein farbenfrohes Rendering müssen Sie jedoch OpenGL hinzufügen.



Die Animation, die den Prozessorstatus anzeigt, wird von einem Fragment-Shader implementiert, d.h. Ein kleiner Code, der parallel zu "Kollegen" arbeitet. Solche Bereiche werden für jedes Pixel des Panels benötigt.



Um das Bild korrekt auf den Würfel zu projizieren, rendert der Autor drei Dreieckspaare, von denen jedes eine Seite des Würfels bedeckt. Wenn Sie einen Würfel als 3D-Objekt betrachten und eine 2D-Form wie einen Kreis anzeigen möchten, können Sie jedem Rand des Würfels die Koordinaten einer imaginären 2D-Leinwand vor Ihrem Gesicht zuweisen.





Wenn wir den Würfel jetzt in ein rechteckiges Array von Pixeln "erweitern", die wir tatsächlich ansprechen, können wir dieses Array mit mehreren Dreiecken abdecken. Wir können auch die Koordinaten der "virtuellen Leinwand" jedem Scheitelpunkt zuordnen, um eine Zuordnung unserer Leinwandkoordinaten zu den tatsächlichen Pixeln im Bedienfeldarray zu erhalten.



Für Shader ist dies einfach: Sie müssen die Canvas-Koordinaten für jeden Scheitelpunkt als zusätzlichen Array-Puffer für die GPU angeben, damit diese Koordinaten für jedes Pixel interpoliert werden können.



Prozessorstatus abrufen



Informationen zum Betriebsmodus des Prozessors können über das UDP-Protokoll mithilfe eines Python-Skripts abgerufen werden.



#!/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))


Auf dem PC des Autors startet das Skript automatisch, für den Betrieb wird eine statische IP verwendet, die für den LED-Würfel reserviert ist.



Zu diesem Zeitpunkt sollte alles wie vorgesehen funktionieren.





Hat dir dieses Projekt gefallen? Vielleicht haben Sie etwas Ähnliches oder im Gegenteil Einzigartiges entwickelt? Lass es uns in den Kommentaren wissen.






All Articles