Ubuntu 20.04.3 LTS(64bit) on Raspberry Pi 4 Model B(8GB) で 空冷ファンの制御をする

背景

先日ラズパイでクラスタを組んだものの、電源入れっぱなしのため寝るときに小さく聞こえるファンの音が気になって仕方ない。
しかし毎回電源落とすのも面倒。

ただ、ラズパイにはPWM制御のファンはそのままではつけられないらしい。
困っていたところ、トランジスタというものを挟んでファンを接続すれば指定したCPU温度をしきい値にしてファンのON/OFF制御はできることを知った。 (回転数の制御はできない)

とりあえずトランジスタを手に入れて試しにつなげて動作確認してみる

トランジスタを手に入れる

トランジスタ千石電商さんで 2SC1815-GR を購入。

www.sengoku.co.jp

品番の GR とか Y とか BL とか意味不明だったので調べたら増幅率の違いや信頼性などでランク分けがあるらしい。

トランジスタやダイオードの型番の読み方とルール - Electrical Information

よくわからんが、まぁGRぐらいでよかろうということで店頭で購入。
初めて秋葉原千石電商さんに行ったが、あまりのパーツの量で見つけられる気がしなかったので店員さんに写真と型番見せたらすぐに教えてくれた。(とっても親切)

f:id:flick-flick:20211103223920p:plain
めっちゃちっちゃい

取り付ける

重い処理をするわけじゃないので、3.3Vの電源を使ってちょっとでも回転数下げて静音化する。
配線はこちらを参考にした。

白執事の徒然なる日々 Raspberry Pi で冷却ファンをPWM制御してみよう

ラズパイの設定

$ sudo raspi-config

Performance Options > P4 Fan を選択して GPIOピン(物理ピン番号ではなくBCM番号、今回は18を指定)とファンを回す温度のしきい値(今回は60℃)を設定する。

f:id:flick-flick:20211103165659p:plain
f:id:flick-flick:20211103165752p:plain
f:id:flick-flick:20211103165827p:plain
f:id:flick-flick:20211103165845p:plain
f:id:flick-flick:20211103165857p:plain

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)になるのかなと思ったら変わらない件

f:id:flick-flick:20211103170208p:plain
60℃超えてファンが動き出したらV列が 1 になるのかなと思ったら変わらなかった。
よくわからんがちゃんと動いているのでヨシ

トランジスタの足の部分が狭すぎてジャンパケーブルをきれいに接続できない件

トランジスタが小さいので足の部分(?)が狭くてジャンパケーブルがきれいに刺さらない。
これどうすんの?

f:id:flick-flick:20211103162806j:plain
無理やりジャンパケーブルぶっ刺した状態。とにかくダサい。

この件についてはピンソケットというものを使えばもうちょっとまともに接続できそうなので後日試してみる。

/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.txtGUIで設定できるユーティリティツールらしい。



そしてこの config.txtRaspberry 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/mmcblk0p1Raspberry 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.txtGUI設定ツールなのでそのまま使うと /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.txttemp=60000/boot/firmware/config.txttemp=70000 で設定すると70℃でFANが動き始めた

ので、挙動的には /boot/config.txt があっても (Ubuntuにおいては) 無視されて、 /boot/firmware/config.txt を読み込んでるっぽい。