Ubuntu 20.04.3 LTS(64bit) on Raspberry Pi 4 Model B(8GB) で 空冷ファンの制御をする
背景
先日ラズパイでクラスタを組んだものの、電源入れっぱなしのため寝るときに小さく聞こえるファンの音が気になって仕方ない。
しかし毎回電源落とすのも面倒。
ただ、ラズパイにはPWM制御のファンはそのままではつけられないらしい。
困っていたところ、トランジスタというものを挟んでファンを接続すれば指定したCPU温度をしきい値にしてファンのON/OFF制御はできることを知った。 (回転数の制御はできない)
とりあえずトランジスタを手に入れて試しにつなげて動作確認してみる
トランジスタを手に入れる
トランジスタは千石電商さんで 2SC1815-GR
を購入。
品番の GR とか Y とか BL とか意味不明だったので調べたら増幅率の違いや信頼性などでランク分けがあるらしい。
トランジスタやダイオードの型番の読み方とルール - Electrical Information
よくわからんが、まぁGRぐらいでよかろうということで店頭で購入。
初めて秋葉原の千石電商さんに行ったが、あまりのパーツの量で見つけられる気がしなかったので店員さんに写真と型番見せたらすぐに教えてくれた。(とっても親切)
取り付ける
重い処理をするわけじゃないので、3.3Vの電源を使ってちょっとでも回転数下げて静音化する。
配線はこちらを参考にした。
白執事の徒然なる日々 Raspberry Pi で冷却ファンをPWM制御してみよう
ラズパイの設定
$ sudo raspi-config
で Performance Options
> P4 Fan
を選択して GPIOピン(物理ピン番号ではなくBCM番号、今回は18を指定)とファンを回す温度のしきい値(今回は60℃)を設定する。
raspi-config を再起動せずに終了して念の為 /boot/config.txt
の最後の行にファン制御の設定が入っていることを確認してから再起動。
$ sudo cat /boot/config.txt # Disable audio (added by raspberrypi-sys-mods) dtparam=audio=no [all] dtoverlay=gpio-fan,gpiopin=18,temp=60000
sudo /sbin/shutdown -r now
しかし指定のCPU温度になってもFANが動かず。
どうやら、Ubuntu の場合は /boot/config.txt
ではなく /boot/firmware/config.txt
に設定する必要があることがわかった(後述)ので
[all] dtoverlay=gpio-fan,gpiopin=18,temp=60000
の部分だけ /boot/firmware/config.txt
に追記して無事に動いた。
いくつか謎が残る点とわかったこと
gpio readallで BCM 18ピンが出力High(1)になるのかなと思ったら変わらない件
60℃超えてファンが動き出したらV列が 1 になるのかなと思ったら変わらなかった。
よくわからんがちゃんと動いているのでヨシ
トランジスタの足の部分が狭すぎてジャンパケーブルをきれいに接続できない件
トランジスタが小さいので足の部分(?)が狭くてジャンパケーブルがきれいに刺さらない。
これどうすんの?
この件についてはピンソケットというものを使えばもうちょっとまともに接続できそうなので後日試してみる。
/boot/config.txt と /boot/firmware/config.txt の2つがある件
この2つの違いはなんなのか。
結論から書くと config.txt はPCなどであれば BIOS で設定するようなハードウェア設定を保存する設定ファイル とのこと。
OSの設定(config.txt) - Raspberry Pi公式ドキュメントを日本語訳
ラズベリーパイは組み込みプラットフォームなので、 普通のPCにあるようなBIOS がありません。 普通であればBIOSによって編集・保存される 様々なシステム設定のパラメータは、 ラズベリーパイでは config.txtというテキストファイルに保存されます。
ちなみに raspi-config
コマンドはこの /boot/config.txt
をGUIで設定できるユーティリティツールらしい。
そしてこの config.txt
は Raspberry Pi OS の場合は /boot/config.txt
から読み込まれるが、Ubuntuの場合は /boot/firmware/config.txt
から読み込まれるらしい。
ARM/RaspberryPi - Ubuntu Wiki
The GPU firmware partition is mounted at /boot/firmware. The /boot/firmware/config.txt file contains the system configuration and refers to several other files within /boot/firmware. Note, it is likely that you will have to adapt third party instructions to these file locations.
んで、 /boot/firmware
ディレクトリは boot 時に /dev/mmcblk0p1
がマウントされてるっぽい。
/dev/mmcblk0p1
は Raspberry Pi Imager でOSイメージを焼いたときに作成された領域なんだろう。
$ sudo less /var/log/syslog - 略 - Nov 3 10:21:35 ubuntu1 systemd[1]: boot-firmware.mount: Directory /boot/firmware to mount over is not empty, mounting anyway. Nov 3 10:21:35 ubuntu1 systemd[1]: Mounting /boot/firmware... Nov 3 10:21:35 ubuntu1 systemd[1]: Mounted /boot/firmware. Nov 3 10:21:35 ubuntu1 systemd[1]: Reached target Local File Systems. - 略 - $ df -h Filesystem Size Used Avail Use% Mounted on udev 3.7G 0 3.7G 0% /dev - 略 - /dev/mmcblk0p1 253M 124M 129M 50% /boot/firmware tmpfs 782M 28K 782M 1% /run/user/1001
config.txt
の立ち位置と OS による参照元の違い、マウントされるデバイスが整理できたのでなんとなく腑に落ちた。
raspi-config での設定変更が Ubuntu の場合に反映されない件
問題とワークアラウンド
以前の記事で Ubuntu でも raspi-config
コマンドが使えるようにインストール方法をメモした。
waysaku.hatenablog.com
しかし、 raspi-config
コマンドは config.txt
のGUI設定ツールなのでそのまま使うと /boot/config.txt
に書き込まれる模様。
そのため raspi-config
を使う場合は、コマンド実行前に
$ sudo mount /dev/mmcblk0p1 /boot
をしてマウント先を /boot/firmware
から /boot
に変更しておく必要がありそう。
もしくはいったん /boot/config.txt
に書き出してから手動で /boot/firmware/config.txt
にコピーするなり、変更箇所だけ書き写すとかする必要がある。
以前書いたraspi-configのインストール手順についてメモを見ると debian のパッケージとしてインストールしている。
なので、よくよく考えたらdebian 向けのパッケージなので特に Ubuntu 向けのカスタマイズは入ってないということか。(Raspberry Pi OSも debian ベースなのでUbuntuは想定してないとか?)
raspi-config
のソースコードにも /boot/config.txt
がハードコードされた。
github.com
本当に Ubuntu では /boot/configt.txt
は読み込まれないのか
Ubuntu で本当に /boot/config.txt
が読み込まれないのか確認するために、GPIOのFAN制御の設定の
[all] dtoverlay=gpio-fan,gpiopin=18,temp=60000
の項目を
/boot/config.txt
に設定して、/boot/firmware/config.txt
から削除すると指定のCPU温度になってもFANが動かない/boot/config.txt
から削除して、/boot/firmware/config.txt
に設定すると指定のCPU温度になるとFANが動いた/boot/config.txt
はtemp=60000
、/boot/firmware/config.txt
はtemp=70000
で設定すると70℃でFANが動き始めた
ので、挙動的には /boot/config.txt
があっても (Ubuntuにおいては) 無視されて、 /boot/firmware/config.txt
を読み込んでるっぽい。