内容はタイトルの通りです。 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 が頑張って計算している様子が伝わってきて楽しいです。
以上