この記事を書いた動機
Raspberry Pi 5をPironman 5に入れ、Ubuntu 24.04 LTSでサーバーを構築していました。
組み上げて電源を入れた瞬間、ある事実に気付きます。
CPUは40℃台で涼しいのに、背面のRGBファン2発が常時フル回転で爆音を発し続けている。
sudo pironman5 -gm 3(温度ベース自動制御)を叩いても無反応。
公式ダッシュボードはエラー連発で使い物にならない。
gpiosetコマンドで直接叩いてみると――
sudo gpioset gpiochip4 6=0
# gpioset: error setting the GPIO line values: Device or resource busy
Device or resource busy。
Pironmanのコマンドも、Linux標準のGPIOコマンドも、すべてOSに弾かれていた。
この記事では、「なぜそうなるのか」という根本原因と、Pythonコードを一切書かずにたった1行で完全解決する方法を共有します。
環境
| 項目 | バージョン |
|---|---|
| ハードウェア | Raspberry Pi 5 |
| ケース | SunFounder Pironman 5 |
| OS | Ubuntu 24.04 LTS |
| Pironman5ソフト | pironman5 v1.2.7 |
| カーネル | 6.8以降 |
症状の確認
サービスのログを見ると、問題の核心が見えます。
sudo systemctl status pironman5.service
● pironman5.service - pironman5 service
Active: active (running)
...
[INFO] PWM Fan is supported, sync all other fan with pwm fan
[INFO] FanControl initialized
一見正常に見えますが、journalctlでより詳細なログを確認すると…
sudo journalctl -u pironman5.service -n 50 --no-pager
pm_autoモジュールがGPIO 6番にアクセスしようとしてサイレントにエラーを吐き、制御を放棄していることが確認できます。
設定値は正しく書き込まれているのに、ファンには何も伝わっていない状態です。
sudo pironman5 -c
# "gpio_fan_mode": 3 ← 設定は正しい
# でもファンはフル回転のまま
設定ファイルにgpio_fan_mode: 3が正しく書かれているのにファンが止まらない場合、ソフトウェアの問題ではなくOSレベルのGPIOロックが原因である可能性が非常に高いです。
根本原因:Ubuntuカーネルによる「GPIO 6番の自動予約」
これはPironman5のバグではありません。Ubuntu 24.04(Kernel 6.8以降)とRaspberry Pi 5の仕様変更の衝突が原因です。
ラズパイ5はRP1という新しいチップを搭載しており、Ubuntuのカーネルは起動時にデバイスツリーを読み込んで各ピンの用途を割り当てます。
このとき、特定のGPIOピンを「I2C・SPI・1-Wire通信用として将来使うかもしれないから、カーネルドライバで先に予約(ロック)しておこう」とお節介にも自動的に囲い込んでしまいます。
その結果として
Pironman5(pm_auto)
└→ GPIO 6番にアクセスしようとする
└→ Ubuntu カーネル「それは俺の予約済みピンだ。触るな(busy)」
└→ Pironman5「アクセス失敗…制御不能…フェイルセーフ発動…ファン100%で回し続けます」
という最悪の連鎖が起きています。
「gpiozeroを最新版(2.0.1)にアップデートすれば直る」という情報もありますが、このカーネルレベルのハードウェアロックには無力でした。
venv内のライブラリ更新、GPIOZERO_PIN_FACTORY=lgpioの環境変数設定、/dev/gpiochip4のシンボリックリンク作成、いずれも効果なしでした。
試した解決策と結果まとめ
| 試した方法 | 結果 |
|---|---|
pironman5 -gm 3(バランスモード設定) |
❌ 効果なし |
venv内のgpiozeroを2.0.1にアップデート |
❌ 効果なし |
GPIOZERO_PIN_FACTORY=lgpioを環境変数に追加 |
❌ 効果なし |
/dev/gpiochip4のシンボリックリンク作成 |
❌ 効果なし |
gpiosetコマンドで直接操作 |
❌ Device or resource busy
|
config.txtにGPIO宣言を追記 |
✅ 完全解決 |
解決策:/boot/firmware/config.txtへの1行追記
なぜこれで直るのか?
config.txtの設定はLinuxカーネルよりも低いレイヤー(ブートローダー=ファームウェア)が処理します。
つまりUbuntuカーネルがデバイスツリーを読み込んで「GPIO 6番を通信用に予約しよう」と動き出すよりも前の段階で、「このピンはユーザーが出力用に使います」という事実が確定されます。
その結果、カーネルはそのピンに通信用のロックをかけなくなります。
手順
1. config.txtを開く
sudo nano /boot/firmware/config.txt
2. ファイルの末尾に以下を追記する
gpio=6=op,dl
| パラメータ | 意味 |
|---|---|
6 |
GPIOのピン番号(Pironman5背面ファンの制御ピン) |
op |
Output(出力モードとして宣言) |
dl |
Drive Low(初期電圧を0V=OFFで固定) |
3. 保存して再起動
sudo reboot
動作確認
再起動後、あの煩かった背面ファンが静かになっているはずです。
以下のコマンドで制御が復活していることを確認しましょう。
# テスト①:強制フル回転(これで回ればGPIOアクセス成功)
sudo pironman5 -gm 0
sudo systemctl restart pironman5
# テスト②:温度ベース自動制御(冷えていれば止まる)
sudo pironman5 -gm 3
sudo systemctl restart pironman5
ファンモード(-gm)一覧
| モード | 名前 | 起動温度 |
|---|---|---|
0 |
Always On | 常時回転 |
1 |
Performance | 50℃ |
2 |
Cool | 60℃ |
3 |
Balanced | 67.5℃ |
4 |
Quiet | 70℃ |
OLED・LED・ファンをダッシュボードなしで管理する
Pironman5のダッシュボードはUbuntu環境で不安定なため、すべてコマンドラインで管理するのがおすすめです。
# 現在の設定を確認
sudo pironman5 -c
# LED制御
sudo pironman5 -re true # LED ON
sudo pironman5 -rc 0a1aff # 色(16進)
sudo pironman5 -rb 50 # 明るさ(0-100)
sudo pironman5 -rs breathing # エフェクト
sudo pironman5 -rp 50 # 速度(0-100)
# OLEDディスプレイ制御
sudo pironman5 -oe true # ON
sudo pironman5 -or 0 # 回転(0 or 180)
# 設定反映
sudo systemctl restart pironman5
OLEDには「スクリーンセーバー的な自動スリープ」機能がありません。画面焼け(バーンイン)を防ぐには、以下のスクリプトで「見たい時だけ30秒だけ点灯させる」運用がおすすめです。
#!/bin/bash
sudo pironman5 -oe true
sudo systemctl restart pironman5
echo "OLEDを点灯しました。30秒後に消灯します…"
sleep 30
sudo pironman5 -oe false
sudo systemctl restart pironman5
まとめ
gpio=6=op,dl
この1行が、数時間の苦しみを終わらせてくれました。
同じ問題に苦しんでいる人の参考になれば幸いです。
役に立ったと思ったら LGTM をお願いします 👍