ARGBファンコントローラーをRapberry Pi Picoで自作する
Make an original ARGB fan controller with Rapberry Pi Pico
ちょっと古めのマザーボードにはARGB(アドレッサブルRGB)LED専用のピンが搭載されていないので、空いているUSB 2.0ポートピンを活用してファンをWindowsアプリから好きな色で光らせることのできるコントローラーを作ってみることにしました。
「ASUS Aura Sync」「ASRock Polychrome RGB」「Gigabyte RGB Fusion」「MSI Mystic Lights」など、LEDライティング機能の名称はマザーボードメーカーによって異なっていますが、メーカーを問わず専用ピンから出力される信号は基本的に同一なので、これらの製品への対応を明記しているARGBファンであれば、プログラムコードを編集することなく作動させることができます。
今回開発に使ったPCケースファンは「
Aigo AR12 Pro」。国内では全くの無名ですが、PWMコントロールにも対応しており、なおかつ1個あたり約600円と安価で海外からの評価が高いのでこれに決めました。Proではないバージョンは一般的なコントローラーに対応しておらず、マザーボードに直付けできないので注意してください。
ファンにはシリアル線を1本つなげば良いので、回路はとても簡単です。この例では、マイコン用とファンLED給電用に2つのUSBポートを使っています。なお、ファンに備わっているLED端子に接続するには
2.54mmラウンドピンが必要になります。
AR12 ProにおけるLEDの仕様は製品には明記されていないので、まずは目視でチェックします。
ledtest.c
// 信号を送るピン
#define FAN_LED_PIN 10
// ファンとLEDの総数
#define LED_COUNT 50
#define NEO_PIXEL_TYPE (NEO_GRB + NEO_KHZ800)
Adafruit_NeoPixel leds = Adafruit_NeoPixel(LED_COUNT, FAN_LED_PIN, NEO_PIXEL_TYPE);
void setup()
{
leds.begin();
leds.clear();
leds.show();
}
int pos = 0;
loop()
{
leds.clear();
leds.setPixelColor(pos, leds.Color(0, 0, 255));
pos++;
if(pos > LED_COUNT) pos = 0;
delay(1000);
}
このようなプログラムコードを走らせ、1番から順にLEDを点灯させていくと、点灯する順番はこの画像ようになっている(※ファンの中心が鏡面になっている方が上の場合)ことがわかりましたので、これに基づいてプログラミングを行います。
fandef.c
// ファンとLEDの総数
#define FAN_COUNT 3
#define FAN_LED_COUNT 8
#define TOTAL_LED_COUNT (FAN_LED_COUNT * FAN_COUNT)
#define NEO_PIXEL_TYPE (NEO_GRB + NEO_KHZ800)
// デバイスの物理的な大きさ
#define FAN_WIDTH_MM 120
#define FAN_TOTAL_WIDTH_MM (FAN_WIDTH_MM * FAN_COUNT)
#define FAN_HEIGHT_MM 120
#define FAN_DEPTH_MM 25
#define FAN_LED_RADIUS 17
#define FAN_LED_DEPTH 5
// AR12 Proの場合は、排気側を床面に向けたとき
// 左下から時計回りにLEDが配置されている
const int FAN_LED_POS_MM[][2] = {
{-11, 28},
{-28, 11},
{-28,-11},
{-11,-28},
{ 11,-28},
{ 28,-11},
{ 28, 11},
{ 11, 28},
};
Githubに公開しているソースコードでは、PCケースに3つのファンを連結させて設置していることを前提としています。PlatformIO / Arduino-Picoを使っているので、環境の構築については
こちらの記事も併せて参考にしてください。
ファン1つには8個のLEDが中心近くに搭載されていますが、これでは位置ライティングが綺麗にならないので、意図的に中央に配置されているように見せかけています。また、LEDの位置はpythonコードであらかじめ算出した座標を固定値として宣言しました。
lamppos.c
uint16_t SendLampAttributesReport(LampAttributesResponseReport *report) noexcept
{
int fan_no = last_lamp_id / FAN_LED_COUNT;
int led_no = last_lamp_id % FAN_LED_COUNT;
float cx = fan_no * FAN_WIDTH_MM + FAN_WIDTH_MM / 2.0f;
float cy = FAN_HEIGHT_MM / 2.0f;
float x = cx + FAN_LED_POS_MM[led_no][0];
float y = cy + FAN_LED_POS_MM[led_no][1];
// 省略
return sizeof(LampAttributesResponseReport);
}
このプログラムでは単純な横三連構造として扱っています。もちろん、より繊細な表現を行いたいのであれば、Z座標も含めた細かい調整が必要です。
実際に配線するとこのような感じになります。マザーボードの9ピンUSBに直付けするので、先端は
2.54mm 2x4メスピンヘッダーを用いています。開発ボードから出ているUSBケーブルは、100円均一のType-A,Type-C変換ケーブルをカットしたものをハンダ付けしています。
マザーボードのソケットに差し込んだときのイメージです。特に5vとGNDピンの位置は間違えないようにしましょう。
この写真で使われているAntecのピラーレスケース「
CX200M」は付属ファンの回転数と発色が常に固定なのが欠点でしたが、これにより古い世代のマザーボードでも映えさせることができました。
2024/12/19