最近、RaspberryPiとLEDパネルに基づくオリジナルのDIYプロジェクトの説明がネットワークに登場しました。プロジェクトの目標は、PCプロセッサの負荷レベルを視覚化することです。このために、自家製のデバイスのLEDパネルのアニメーションが使用されます。
CPUの負荷が高いほど、チップの温度が高くなり、LEDパネルの色が熱くなります。最小負荷は青と青、最大負荷はオレンジと赤です。関連するLEDの総数は12,000に達します。カットの下には、プロジェクトの説明、その要素、およびガジェットの操作を保証するソフトウェアのソースコードがあります。
これがすべての外観です。
プロジェクトのアイデアはどのようにして生まれましたか?
昨年、著者は第36回カオスコミュニケーションコングレス(36C3)に参加し、LEDキューブを含む膨大な数のDIYプロジェクトを見ました。彼はこれに非常に感銘を受けました。
これらのプロジェクトのほとんどは、外部要因に対するデバイスの応答に関するものでした。そのため、デバイスを手で回転させると、虹のすべての色がきらめき、カラフルな写真が表示されました。
Sebastian Staacksは、PCプロセッサの負荷レベルを表示できるデバイスである独自のプロジェクトを開発することを決定しました。特に実用的な意味はありませんが、これはただの楽しみのためのプロジェクトです。アセンブリ内のシステムの総コストは150ドルでした。
プロジェクトの実施
LEDキューブの外観と動作を上に示します。今、いくつかの詳細。接続されているPCを起動すると、デバイスの電源が自動的にオンになります。
著者は、作業中(または再生中)にPCユーザーの気を散らさないように、色とアニメーションをできるだけニュートラルにしようとしたと述べています。
ハードウェアとソフトウェア
デバイスのデザインは非常にシンプルです。これは、デバイスを分解したい人が見るものです。
「キューブ」には3つの面しかありません。これは、コストを削減し、設計をいくらか単純化するために行われます。すべての側面が機能した場合、プロジェクトは高すぎるでしょう。
著者はAliexpressからLEDパネルを注文し、価格と品質の最良の組み合わせを選択しました。サプライヤーが製品の詳細な仕様を提供することはめったにないため、簡単ではなかったと彼は言いました。したがって、これらのパネルがプロジェクトに適しているかどうかは必ずしも明確ではありませんでした。その結果、開発者は64x64 RGBLEDと5V電源を備えたパネルを購入しました。
これらのパネルに電力を供給するために、10Aおよび5Vの50Wユニットが使用されました。このアダプターは、RaspberryPiを介してパネルに接続されているAdafruitマトリックスドライバーに電力を供給します。主なことは、電源の特性がシステムの消費をカバーしているということです。
パネル管理
「ラズベリー」に関しては、開発者はラズベリーパイ2を使用しました。現時点では、このシングルボードデバイスは道徳的に時代遅れとは見なされません。そのような目的にはそれで十分です。また、3代目、4代目とは言えない運転中の発熱もほとんどありません。
ネットワークに接続するためのケーブルを取り除くために、外部WiFiモジュールがボードに接続されました。Adafruit RGB Matrix Bonnetを使用したいくつかの操作を除いて、はんだ付けにはほとんど何も必要ありませんでした。
これは、組み立てられたときの最終的な構造の外観です。すべての形を作るために、著者は3Dプリンターで印刷されたケースを使用しました。
パネルは接着されていないため、いつでもケースから取り外すことができます。RaspberryPiマウントも用意されています。キューブのベースを印刷することもできますが、全体的に見て、すべてが見栄えがします。
さて、ソフトウェアについて。ハードウェアを使用すると、すべてが簡単になりますが、管理ソフトウェアを使用すると、いじくり回す必要があります。 OpenGLシェーダーはアニメーションに使用されます。さらに、プロセッサの特性を「malinka」に転送するスクリプトがPC上で実行されています。
最も重要なソフトウェアは、キューブを操作する小さなC ++プログラムです。特別なrpi-rgb-led-matrixライブラリを使用します。特に、PCでのプロセッサの動作の特性を取得するためにUDPポートを開く必要があります。また、アニメーションをレンダリングするための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_bitsとpwm_lsb_nanosecondsはそれほど重要ではないように見えますが、主に画質にとって重要であることに 注意してください。特に、pwm_bitsは、カラーステップの数を定義するPWMビットの数を定義します。この値を増やすことの欠点は、LEDパネルのリフレッシュレートを下げることです。パネルがそのような低い値をサポートしている場合は、pwm_lsb_nanoseconds設定を減らすことでパラメーターを改善できます。カメラでキューブを撮影する場合は、すべてが美しく見えるようにリフレッシュレートを上げることをお勧めします。
Piが継続的にRGBBonnetを実行していることが重要です。そうしないと、アーティファクトが表示される可能性があります。このため、プロセッサコア全体を予約することをお勧めします。
このプロジェクトは、あなた自身のプロジェクトでそれを使用するために、CPU-統計-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サポートを追加するには、MatusNovakの指示に従う必要があります。
OpenGlシェーダー
さて、この時点でハードウェアとパネルを管理するための重要なコードが完成しました。特に、テキスト、画像、GIFをすでに表示できます。ただし、カラフルなレンダリングを行うには、OpenGLを追加する必要があります。
プロセッサのステータスを表示するアニメーションは、フラグメントシェーダーによって実装されます。 「同僚」と並行して機能する小さなコード。このような領域は、パネルの各ピクセルに必要です。
画像をキューブに正しく投影するために、作成者は3組の三角形をレンダリングし、それぞれがキューブの1つの面を覆っています。重要なのは、キューブを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キューブ用に予約されています。
この時点で、すべてが意図したとおりに機能するはずです。
このプロジェクトは気に入りましたか?おそらく、あなたは似たようなもの、または逆にユニークなものを開発しましたか?コメントで教えてください。