たった1行!ラズパイにシャットダウンボタンを実装してSDカードの破損を防ぐ

VCN ViewerでiPadなどをモニターとしてラズパイを操作していると、ネットワークの問題で繋がらなくなってシャットダウンできなくなることがあります。
シャットダウンできずに仕方なく電源を落とすと、SDカードが破損してラズパイが起動しなくなることがあります。
正常にシャットダウンしないと、SDカードの破損は高確率で起こるようです(私は3回中2回破損・・・)
この問題を防ぐために物理的なシャットダウンボタンを作って、外部から強制的にシャットダウンできるようにしてみようと思います。
Raspberry Pi 4 Model B
OS:Raspbian11 (bullseye)
外部シャットダウンを有効化する
実は、シャットダウンコマンドを走らせるコードの作成は不要で、設定ファイルに1行書き足すだけで外部からのシャットダウンを有効化させることができます。
テキストエディタ(nano)で/boot/config.txtを開きます。
sudo nano /boot/config.txt
開いた設定ファイルの一番最後の行に下記の1行を書き足します。
dtoverlay=gpio-shutdown
保存して再起動すれば有効化されます。
外部シャットダウンが有効化されると、GPIO3(5番ピン)をGNDにショートすればシャットダウンします。
シャットダウンボタンの作成
次にはシャットダウンボタンを作ります。
次のような回路でGPIO3をスイッチを介してGNDに接続できるようにします。

今回使った押しボタンスイッチです。

モーメンタリ動作といって、押している間だけ導通(オン)して離すとオフするスイッチです。
GPIO3に接続する線とGNDに接続する線をスイッチにははんだ付けしておきます。

完成したスイッチをGPIO3(5番ピン)とGND(9番ピン)に接続します。

これでスイッチを押せばラズパイがシャットダウンしてくれます。
シャットダウン後にもう一度ボタンを押せば再起動してくれるので便利です。
上手くいかない場合
今回やってみて躓いた点を載せておきます。
I2Cを有効にしていると反応しない
GPIO3はI2C用のピン(SCL1)を兼ねているので、I2Cを有効にしているとシャットダウンが走りませんでした。
/boot/config.txtの中に「dtparam=i2c_arm=on」の記載があるので、これをコメントアウトすることでシャットダウンが走るようになりました。
#dtparam=i2c_arm=on
抵抗を介してプルダウンすると反応しない
スイッチはGNDショートさせるので、接続ミスでラズパイが破壊する恐れがあります。
そこで、10kΩを介してショートさせるようにして電流制限がかかるようにしたのですが、これではシャットダウンが走りませんでした。
ボタンが無くても大丈夫
今回はシャットダウンボタンを作りましたが、GPIO3とGNDをショートさせるだけなので、実はボタンが無くても大丈夫です。
GPIO3とGNDを配線でショートさせてしまえばいいのです。
予め設定ファイルだけ修正しておけば、もしもの時はスイッチがなくてもシャットダウンさせることができてしまいます!