Visualícelo: el cubo LED basado en Raspberry Pi muestra la utilización de la CPU



Recientemente, apareció en la red una descripción del proyecto de bricolaje original basado en Raspberry Pi y paneles LED. El objetivo del proyecto es visualizar el nivel de carga del procesador de la PC. Para ello, se utiliza la animación en los paneles LED de un dispositivo casero.



Cuanto mayor es la carga en la CPU, mayor es la temperatura del chip y más cálidos se vuelven los colores de los paneles LED. La carga mínima es cian y azul, la máxima es naranja y rojo. El número total de LED involucrados alcanza los 12 000. Debajo del corte hay una descripción del proyecto, sus elementos, más el código fuente del software que asegura el funcionamiento del dispositivo.



Así es como se ve todo:



¿Cómo surgió la idea del proyecto?



El año pasado, el autor asistió al 36º Congreso de Comunicación del Caos (36C3), donde vio una gran cantidad de proyectos de bricolaje, incluidos cubos LED. Quedó muy impresionado por esto.





La mayoría de estos proyectos trataban sobre la respuesta del dispositivo a factores externos. Entonces, cuando se giró el dispositivo en la mano, brilló con todos los colores del arco iris, mostrando imágenes coloridas.



Sebastian Staacks decidió desarrollar su propio proyecto: un dispositivo que puede mostrar el nivel de carga de un procesador de PC. No tiene un sentido práctico particular, este es un proyecto solo por diversión El costo total del sistema en el montaje fue de $ 150.



Implementacion de proyecto



La forma en que se ve y funciona el cubo LED se muestra arriba. Ahora algunos detalles. El dispositivo se enciende automáticamente después de iniciar la PC a la que está conectado.





El autor dice que trató de hacer que los colores y las animaciones fueran lo más neutrales posible para no distraer al usuario de la PC mientras trabajaba (o jugaba).



Hardware y software



El diseño del dispositivo es muy sencillo. Esto es lo que verá una persona que quiera desmontar el dispositivo.





El "cubo" tiene solo tres caras. Esto se hace para reducir el costo y simplificar algo el diseño. Si todas las facetas funcionaran, el proyecto sería demasiado caro.



El autor encargó paneles LED a Aliexpress, eligiendo la mejor combinación de precio y calidad. No fue fácil, dijo, ya que los proveedores rara vez proporcionaron especificaciones detalladas para su producto. En consecuencia, no siempre estuvo claro si estos paneles eran adecuados para el proyecto. Como resultado, el desarrollador compró paneles con LED RGB 64x64 y fuente de alimentación de 5V.





Se utilizó una unidad de 50W con 10A y 5V para alimentar estos paneles. El adaptador alimenta el controlador de la matriz Adafruit, que se conecta a los paneles a través de la Raspberry Pi. Lo principal es que las características de la fuente de alimentación cubren el consumo del sistema.



Gestión de paneles



En cuanto a la "frambuesa", el desarrollador usó Raspberry Pi 2. Por el momento, este dispositivo de placa única no puede considerarse demasiado desactualizado moralmente, para tales fines es suficiente. Además, casi no se calienta durante el funcionamiento, lo que no se puede decir de la tercera y cuarta generación.





Se conectó un módulo WiFi externo a la placa para deshacerse de los cables para conectarse a la red. No se necesitó casi nada para soldar, excepto un par de operaciones con Adafruit RGB Matrix Bonnet.





Así es como se ve la estructura final cuando se ensambla. Para darle forma, el autor utilizó el estuche, que imprimió en una impresora 3D.





Los paneles no están pegados para que se puedan quitar de la carcasa en cualquier momento. También se proporcionan soportes para Raspberry Pi. También puede imprimir la base del cubo, pero en general, todo se ve bien y así.





Ahora sobre el software. Con el "hardware" todo es más fácil, pero con el software de gestión tendrás que retocar. El sombreador OpenGL se utiliza para la animación. Además, se está ejecutando un script en la PC que transfiere las características del procesador al "malinka".



La pieza de software más importante es el pequeño programa C ++ que manipula el cubo. Utiliza la biblioteca especial rpi-rgb-led-matrix . En particular, es necesario abrir un puerto UDP para obtener las características del trabajo del procesador con una PC, así como OpenGL para renderizar la animación. Los detalles del trabajo de la biblioteca están aquí .



Para instalar, necesita un script de Adafruit . Las instrucciones de instalación están disponibles en el enlace especificado.



Aquí están las opciones para personalizar los paneles.



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




Tenga en cuenta que pwm_bits y pwm_lsb_nanoseconds no parecen muy importantes, pero son fundamentales, principalmente para la calidad de la imagen. En particular, pwm_bits define el número de bits PWM, que define el número de pasos de color. La desventaja de aumentar este valor es disminuir la frecuencia de actualización del panel LED. Puede mejorar el parámetro disminuyendo la configuración de pwm_lsb_nanoseconds , si sus paneles admiten valores tan bajos. Si vas a disparar un cubo con una cámara, es mejor aumentar la frecuencia de actualización para que todo luzca hermoso.



Es importante que el Pi esté ejecutando continuamente RGB Bonnet, de lo contrario pueden aparecer artefactos. Para ello se recomienda reservar un núcleo de procesador completo.



El proyecto se puede encontrar cpu-stats-gl.cpp, para usarlo en su propio proyecto. Necesitará las bibliotecas g ++ -g -o cpu-stats-gl cpu-stats-gl.cpp -std = c ++ 11 -lbrcmEGL -lbrcmGLESv2 -I / opt / vc / include -L / opt / vc / lib -Lrpi -matriz-led-rgb / lib -lrgbmatrix -lrt -lm -lpthread -lstdc ++ -Irpi-matriz-led-rgb / include /. Bueno, para agregar soporte OpenGl, debe seguir las instrucciones de Matus Novak .



Sombreador OpenGl



De acuerdo, en este punto el hardware está completo, más el código importante para administrar los paneles. En particular, ya puede mostrar texto, imágenes y GIF. Pero para una representación colorida, debe agregar OpenGL.



La animación que muestra el estado del procesador se implementa mediante un sombreador de fragmentos, es decir un pequeño fragmento de código que funciona en paralelo con "colegas". Estas áreas son necesarias para cada píxel del panel.



Para proyectar correctamente la imagen en el cubo, el autor renderiza tres pares de triángulos, cada uno de los cuales cubre una cara del cubo. El punto es que, si está viendo un cubo como un objeto 3D y desea mostrar una forma 2D como un círculo, puede asignar las coordenadas de un lienzo 2D imaginario frente a su cara a cada borde del cubo.





Si ahora "expandimos" el cubo en una matriz rectangular de píxeles que estamos abordando, podemos cubrir esa matriz con múltiples triángulos. También podemos asignar las coordenadas del "lienzo virtual" a cada vértice para obtener una asignación de las coordenadas de nuestro lienzo a los píxeles reales en la matriz de paneles.



Para los sombreadores, esto es fácil: debe proporcionar las coordenadas del lienzo para cada vértice como un búfer de matriz adicional para la GPU, lo que le permite interpolar esas coordenadas para cada píxel.



Obtenga el estado del procesador



La información sobre el modo de funcionamiento del procesador se puede obtener a través del protocolo UDP utilizando un script de 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))


En la PC del autor, el script se inicia automáticamente, se utiliza una IP estática para el trabajo, reservada para el cubo LED.



En este punto, todo debería funcionar según lo previsto.





¿Te gustó este proyecto? ¿Quizás has desarrollado algo similar o, por el contrario, único? Háznoslo saber en los comentarios.






All Articles