Raspberry Pi の自動シャットダウン処理


Raspberry Piは5,000円以下で買えるLinuxマシンだ。消費電力も3.5W程度と少ないから研究室や家庭用のサーバー にぴったりである。しかし、いくら消費電力が小さいといっても、夜間や旅行中など全く使わないときに電源を入れっぱなしにしておく のは気が引ける。必要の無いときには電源を切りたいところだが、小さいとはいえUnix系OSの載ったマシンはシャットダウン処理が必要であり、 サーバー専用機は普通キーボードや ディスプレイがついていないのが普通だから、外部からログインしてコマンドラインでシャットダウンしなくてはならず、 しょっちゅうやるのはとても面倒くさい。そこで、NASなどでよくある自動シャットダウン回路を考えてみた。非常に簡単な 回路なのだけれども、ネットで検索しても案外紹介されていない。

まず、2連トグルスイッチをONにするとPMOSFETがONになる。そうすると電源が供給されてRaspberry Piが起動する。 起動したところで、電源保持プログラムを走らせてPortAをHighにしてTrをONにする。これにより自己保持回路が成立するから、トグルスイッチを OFFにしてもPMOSFETがOFFになることはない。トグルスイッチがOFFになると、PortBを監視していた電源保持プログラムがそれを検知して シャットダウン処理を開始する。シャットダウンが終了するとPortAもLowになるからTrがOFFになり、PMOSFETもOFFになる。
電源保持プログラムの例を以下に示す。
-------- shutdown-daemon.sh ----------
#!/bin/sh
HOLD=7
PWSW=0

/usr/bin/gpio mode "$HOLD" out
/usr/bin/gpio write "$HOLD" 1

/usr/bin/gpio mode "$PWSW" up

cnt=0
while [ $cnt -lt 2 ] ; do
  data=`/usr/bin/gpio read $PWSW`
  if [ "$data" -eq "1" ] ; then
    cnt=`expr $cnt + 1`
  else
    cnt=0
  fi
#  echo "state = $data"
  sleep 1
done

echo "power sw off"
/sbin/shutdown -h now
---------------------------------------
ここで/usr/bin/gpioはWiringPiについてくるGPIO制御プログラムである。
このスクリプトをrc.localあたりに
su -c /sbin/shutdown-daemon.sh &
などと記述して起動すれば良い。