内容はタイトルの通りです。 HP のパソコンにそういう機能を持った機種があり,自作 PC でも再現したいと思いました。 調査の結果,いくつかのオープンソースソフトウェアと自作の C# アプリケーションを使って実現することができました。
試した環境は以下の通りです。
使用したマザーボード TUF GAMING B550-PLUS は通常の RGB LED とアドレッサブル RGB(ARGB)LED の接続に対応しています。 今回は以下の ARGB LED ストリップを使用しました。
アイネックス 2Way ARGB LEDストリップライト 30cm RLD-STRDM30B
今回作成したシステムの全体像は下図の通りです。
以下の構成要素からなります。
LibreHardwareMonitorLib を使って CPU の温度を取得するプログラムは以下のようになりました。"/amdcpu/0/temperature/2" の部分は CPU によって変える必要がありそうです。
また注意点として,このプログラムを実行するときは「管理者として実行」しないと,温度が取得できませんでした。 (参考: 常に管理者としてアプリケーションを実行させるには?
Computer computer = new Computer(); computer.IsCpuEnabled = true; computer.Open(); computer.Accept(new UpdateVisitor()); double temperature = 0; foreach (IHardware hardware in computer.Hardware) { foreach (ISensor sensor in hardware.Sensors) { if (sensor.Identifier.ToString() == "/amdcpu/0/temperature/2") { temperature = sensor.Value.GetValueOrDefault(); } } }
UpdateVisitor の定義は以下のようになっています。
public class UpdateVisitor : IVisitor { public void VisitComputer(IComputer computer) { computer.Traverse(this); } public void VisitHardware(IHardware hardware) { hardware.Update(); foreach (IHardware subHardware in hardware.SubHardware) subHardware.Accept(this); } public void VisitSensor(ISensor sensor) { } public void VisitParameter(IParameter parameter) { } }
OpenRGB を実行すると以下のような画面が出ます。OpenRGB 単体で LED を制御することもできます。
今回のようにクライアントアプリケーションから制御したいときは,"Mode" を "Direct" にするとよいようです。
また,サーバーとして動作させるには,"SDK Server" タブを選択し "Start Server" ボタンを押します。その後,クライアントアプリケーションからサーバーに接続します。
OpenRGB.NET を使って OpenRGB のサーバーに接続し,LED の色を設定するプログラムは以下のようになりました。変数 r, g, b に RGB 各色の輝度が入っています。
var openRgbClient = new OpenRGBClient(name: "My OpenRGB Client", autoconnect: true, timeout: 1000); var devices = openRgbClient.GetAllControllerData(); for (int i = 0; i < devices.Length; i++) { var leds = Enumerable.Range(0, devices[i].Colors.Length) .Select(_ => new OpenRGB.NET.Models.Color((byte)r, (byte)g, (byte)b)) .ToArray(); openRgbClient.UpdateLeds(i, leds); }
実際に CPU の温度を測ってみると無負荷時で 40℃ くらい,100% 負荷時で 90℃ くらいでした。 そこで, CPU の温度が 40℃ → 65℃ → 90℃ と変化するのに対応して,LED の色を 緑 → 黄 → 赤 と変化させることにしました。
この場合の温度から RGB への変換プログラムは以下の通りです。
int temp = (int)temperature; // 温度 int r, g, b; // RGB 各色輝度 if (temp < 40) { r = 0; g = 255; b = 0; } else if (temp < 65) { r = 255 * (temp - 40) / 25; g = 255; b = 0; } else if (temp < 90) { r = 255; g = 255 * (90 - temp) / 25; b = 0; } else { r = 255; g = 0; b = 0; }
実際使ってみると CPU の温度が目で見てわかるので,CPU が頑張って計算している様子が伝わってきて楽しいです。
以上