可视化:基于Raspberry Pi的LED立方体显示CPU利用率



最近,网络上出现基于Raspberry Pi和LED面板的原始DIY项目描述。该项目的目标是可视化PC处理器的负载水平。为此,使用自制设备的LED面板上的动画。



CPU上的负载越高,芯片的温度越高,LED面板的颜色越热。最小负载为蓝色和蓝色,最大负载为橙色和红色。所涉及的LED总数达到12,000个。



看起来是这样的:



这个项目的想法是如何产生的



去年,作者参加了第36届混沌通信大会(36C3),在那里他看到了许多DIY项目,包括LED立方体。他对此印象深刻。





这些项目大多数是关于设备对外部因素的响应的。因此,当用手旋转设备时,它会闪烁着彩虹的所有颜色,从而显示彩色图片。



Sebastian Staacks决定开发自己的项目-一种可以显示PC处理器负载水平的设备。没有特别的实际意义,这只是一个好玩的项目,系统在组装中的总成本为150美元。



项目实施



上方显示了LED立方体的外观和工作方式。现在一些细节。引导与其连接的PC后,设备会自动打开。





作者说,他试图使颜色和动画尽可能地保持中性,以免在工作(或玩耍)时分散PC用户的注意力。



硬件和软件



该设备的设计非常简单。这就是想要拆卸设备的人所看到的。





“立方体”只有三个面。这样做是为了降低成本并在某种程度上简化了设计。如果所有方面都起作用,那么该项目将太昂贵。



作者从Aliexpress订购LED面板,选择价格和质量的最佳组合。他说,这并不容易,因为供应商很少提供其产品的详细规格。因此,并不总是很清楚这些面板是否适合该项目。结果,开发商购买了带有64x64 RGB LED和5V电源的面板。





使用具有10A和5V电压的50W单元为这些面板供电。该适配器为Adafruit矩阵驱动器供电,该驱动器通过Raspberry Pi连接到面板。最主要的是电源的特性涵盖了系统的消耗。



面板管理



至于“树莓”,开发人员使用的是Raspberry Pi2。目前,从道德上讲,这种单板设备还不能算过时,因为这已经足够了。此外,它在运行过程中几乎不会发热,这在第三代和第四代产品中是无法说的。





外部WiFi模块已连接到板上,以摆脱用于连接网络的电缆。除了使用Adafruit RGB Matrix Bonnet进行几次操作外,几乎不需要焊接。





这就是组装后最终结构的外观。为了使其具有所有形状,作者使用了外壳,该外壳是在3D打印机上打印的。





面板没有粘贴,因此可以随时将其从机箱中取出。还提供了Raspberry Pi支架。您也可以打印多维数据集的基础,但是总体而言,一切看起来都不错,等等。





现在介绍该软件。使用硬件,一切都变得更加容易,但是使用管理软件,您将不得不进行修补。 OpenGL着色器用于动画。此外,PC上正在运行一个脚本,该脚本将处理器的特性传输到“ malinka”。



最重要的软件是操纵多维数据集的小型C ++程序。它使用特殊的rpi-rgb-led-matrix。特别是,需要打开UDP端口才能获得处理器与PC以及OpenGL渲染动画的工作特性。图书馆的工作细节可以在这里找到



要安装,您需要Adafruit脚本。在指定的链接上提供安装说明。



以下是自定义面板的选项



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




请注意,pwm_bitspwm_lsb_nanoseconds看起来并不重要,但它们很关键-主要是对于图像质量。特别地,pwm_bits定义了PWM位的数量,PWM位定义了色阶的数量。增大此值的缺点是降低LED面板的刷新率。您可以通过减小pwm_lsb_nanoseconds设置来改善参数-如果面板支持如此低的值。如果要使用相机拍摄立方体,则最好提高刷新率,以使一切看起来都很漂亮。



Pi连续运行RGB Bonnet非常重要,否则可能会出现伪影。为此,建议保留整个处理器内核。



可以在cpu-stats-gl.cpp中找到项目,以在您自己的项目中使用它。要使用,您需要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 /。好吧,为了添加OpenGl支持,您应该遵循Matus Novak说明



OpenGl着色器



好的,这时硬件已经完成,加上用于管理面板的重要代码。特别是,您已经可以显示文本,图像和GIF。但是对于彩色渲染,您需要添加OpenGL。



显示处理器状态的动画是由片段着色器实现的,即一小段与“同事”并行工作的代码。面板的每个像素都需要这样的区域。



为了将图像正确地投影到立方体上,作者绘制了三对三角形,每对三角形都覆盖了立方体的一个面。关键是,如果您正在将多维数据集视为3D对象,并且想要显示2D形状(例如圆形),则可以将脸部前面的虚构2D画布的坐标分配给多维数据集的每个边缘。





如果现在将多维数据集“扩展”为实际要寻址的矩形像素阵列,则可以用多个三角形覆盖该阵列。我们还可以将“虚拟画布”的坐标映射到每个顶点,以获取画布坐标到面板数组中实际像素的映射。



对于着色器,这很简单-您需要为每个顶点提供画布坐标,作为GPU的附加数组缓冲区,以允许它为每个像素插值这些坐标。



获取处理器状态



可以使用Python脚本通过UDP协议获取有关处理器操作模式的信息。



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


在作者的PC上,脚本会自动启动,使用静态IP进行工作,并保留给LED立方体使用。



此时,一切都应按预期工作。





你喜欢这个项目吗?也许您已经开发出类似或相反的东西?让我们在评论中知道。






All Articles