
Recentemente, uma descrição do projeto DIY original baseado em Raspberry Pi e painéis de LED apareceu na rede . O objetivo do projeto é visualizar o nível de carga do processador do PC. Para isso, é utilizada a animação nos painéis de LED de um aparelho caseiro.
Quanto maior a carga na CPU, mais alta será a temperatura do chip e mais quentes serão as cores dos painéis de LED. A carga mínima é ciano e azul, a máxima é laranja e vermelho. O número total de LEDs envolvidos chega a 12.000. Abaixo do corte está a descrição do projeto, seus elementos, além do código-fonte do software que garante o funcionamento do gadget.
É assim que tudo parece:
Como surgiu a ideia do projeto?
No ano passado, o autor participou do 36º Chaos Communication Congress (36C3), onde viu um grande número de projetos DIY, incluindo cubos de LED. Ele ficou muito impressionado com isso.

A maioria desses projetos era sobre a resposta do dispositivo a fatores externos. Então, quando o aparelho foi girado na mão, ele brilhou com todas as cores do arco-íris, mostrando fotos coloridas.
Sebastian Staacks decidiu desenvolver seu próprio projeto - um dispositivo que pode mostrar o nível de carga de um processador de PC. Não tem nenhum sentido prático particular, trata-se de um projeto só para diversão.O custo total do sistema na montagem foi de $ 150.
Implementação de projeto
A aparência e funcionamento do cubo de LED é mostrada acima. Agora alguns detalhes. O dispositivo liga automaticamente após inicializar o PC ao qual está conectado.

O autor diz que tentou tornar as cores e animações o mais neutras possíveis para não distrair o usuário do PC durante o trabalho (ou jogo).
Hardware e software
O design do dispositivo é muito simples. Isso é o que verá quem quiser desmontar o aparelho.

O "cubo" tem apenas três faces. Isso é feito para reduzir o custo e simplificar um pouco o design. Se todas as facetas funcionassem, o projeto ficaria muito caro.
O autor encomendou painéis de LED da Aliexpress, escolhendo a melhor combinação de preço e qualidade. Não foi fácil, disse ele, já que os fornecedores raramente forneciam especificações detalhadas para seus produtos. Dessa forma, nem sempre ficou claro se esses painéis eram adequados para o projeto. Como resultado, o desenvolvedor comprou painéis com LED RGB 64x64 e fonte de alimentação de 5V.

Uma unidade de 50W com 10A e 5V foi usada para alimentar esses painéis. O adaptador alimenta o driver de matriz Adafruit, que é conectado aos painéis por meio do Raspberry Pi. O principal é que as características da fonte de alimentação contemplem o consumo do sistema.
Gestão do painel
Quanto ao "framboesa", o desenvolvedor usou Raspberry Pi 2. No momento, este dispositivo de placa única não pode ser considerado muito desatualizado moralmente, para tais fins é o bastante. Além disso, quase não aquece durante o funcionamento, o que não se pode dizer da terceira e quarta gerações.

Um módulo WiFi externo foi conectado à placa para eliminar os cabos de conexão à rede. Quase nada foi necessário para soldar, exceto algumas operações com o Adafruit RGB Matrix Bonnet.

É assim que a estrutura final fica quando montada. Para dar forma a tudo, o autor utilizou a caixa, que imprimiu em impressora 3D.

Os painéis não são colados para que possam ser removidos da caixa a qualquer momento. Suportes Raspberry Pi também são fornecidos. Você também pode imprimir a base do cubo, mas no geral, tudo parece bom e assim.

Agora sobre o software. Com o hardware tudo fica mais fácil, mas com o software de gerenciamento você terá que mexer. Shader OpenGL é usado para animação. Além disso, um script está rodando no PC que transfere as características do processador para o "malinka".
O software mais importante é o pequeno programa C ++ que manipula o cubo. Ele usa a biblioteca especial rpi-rgb-led-matrix . Em particular, é necessário abrir uma porta UDP para obter as características de funcionamento do processador com um PC, bem como OpenGL para renderizar animações. Detalhes do trabalho da biblioteca podem ser encontrados aqui .
Para instalar, você precisa de um script da Adafruit . As instruções de instalação estão disponíveis no link especificado.
Aqui estão as opções para personalizar os painéis
//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;
Observe que pwm_bits e pwm_lsb_nanoseconds não parecem muito importantes, mas são essenciais - principalmente para a qualidade da imagem. Em particular, pwm_bits define o número de bits PWM, que define o número de etapas de cor. A desvantagem de aumentar esse valor é diminuir a taxa de atualização do painel de LED. Você pode melhorar o parâmetro diminuindo as configurações de pwm_lsb_nanoseconds - se seus painéis suportarem valores tão baixos. Se você for filmar um cubo com uma câmera, é melhor aumentar a taxa de atualização para que tudo fique bonito.
É importante que o Pi esteja continuamente executando RGB Bonnet, caso contrário, podem aparecer artefatos. Para isso, é recomendável reservar um núcleo inteiro do processador.
O projeto pode ser encontrado cpu-stats-gl.cpp, para usá-lo em seu próprio projeto. Para usar, você precisa de 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 -rgb-led-matrix / lib -lrgbmatrix -lrt -lm -lpthread -lstdc ++ -Irpi-rgb-led-matrix / include /. Bem, para adicionar suporte a OpenGl, você deve seguir as instruções de Matus Novak .
Shader OpenGl
Ok, neste ponto o hardware está completo, mais o código importante para gerenciar os painéis. Em particular, você já pode exibir texto, imagens e GIFs. Mas para renderização colorida, você precisa adicionar OpenGL.
A animação que exibe o status do processador é implementada por um sombreador de fragmento, ou seja, um pequeno trecho de código que funciona em paralelo com "colegas". Essas áreas são necessárias para cada pixel do painel.
Para projetar corretamente a imagem no cubo, o autor renderiza três pares de triângulos, cada um cobrindo uma face do cubo. A questão é que, se você está olhando para um cubo como um objeto 3D e deseja mostrar uma forma 2D, como um círculo, você pode atribuir as coordenadas de uma tela 2D imaginária na frente de seu rosto para cada borda do cubo.

Se agora "expandirmos" o cubo em uma matriz retangular de pixels que estamos realmente endereçando, podemos cobrir essa matriz com vários triângulos. Também podemos mapear as coordenadas da "tela virtual" para cada vértice para obter um mapeamento de nossas coordenadas da tela para os pixels reais na matriz do painel.
Para shaders, isso é fácil - você precisa fornecer as coordenadas da tela para cada vértice como um buffer de matriz adicional para a GPU, permitindo que ela interpole essas coordenadas para cada pixel.
Obtenha o status do processador
Informações sobre o modo de operação do processador podem ser obtidas por meio do protocolo UDP usando um 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))
No PC do autor, o script é iniciado automaticamente, um IP estático é usado para operação, reservado para o cubo de LED.
Nesse ponto, tudo deve funcionar como planejado.

Você gostou deste projeto? Talvez você tenha desenvolvido algo semelhante ou, pelo contrário, único? Deixe-nos saber nos comentários.
