背景

ディスプレイなしの環境では,Raspberry PiをシャットダウンするときにいちいちVNCやsshでログインすることが面倒くさいですよね.そこで,Raspberry Piの端子にプッシュスイッチを付け,その操作で再起動およびシャットダウンをできるようにするスクリプトを作ります.

注意

ここにある設定を誤ると,OSが立ち上がらなくなる可能性があります.十分に注意してください.

環境

ハードウェア: Raspberry Pi zero

OS: Raspbian Buster February 2020

プッシュスイッチ: 2つあり,ここではSW1とSW2と呼びます.SW1は物理番号8番ピン,SW2は物理番号7番ピンにつながっています.いずれもプルアップされており,押すと0,離すと1がRaspberryPiに入力されます.

インディケータ: インディケータとしてLEDを使います.物理番号22番ピンにLEDが接続されており,Highだと点灯,Lowだと消灯します.

設定

次のような設定をします.

  1. SW1を押したら再起動,SW2を押したらシャットダウンするようにします.
  2. 最大5秒間,押すと上記の動作をすることとします.
  3. OSの起動時にSW1が押されていたら,LEDを2秒間点灯させ,加えて1及び2の動作をさせないようにします.

3のようにしたのは,予想外の動作をしてしまったときに対応させるためです.なお,SW1のつながっている物理番号8番ピンは,何も接続されていない場合には0となるため,結果としてスイッチが押されている状態と同じになります.従って,スイッチがないような状況では3が適用されるため,スイッチによる再起動は起こらないようになります.では,これらをスクリプトにしたものを下に示します.ここではcheck_reboot.shという名前のスクリプトとします.

#!/bin/sh
 
/usr/bin/gpio -g mode 14 in
/usr/bin/gpio -g mode 4 in
/usr/bin/gpio -g mode 25 out
 
PRESSED=`/usr/bin/gpio -g read 14`
if [ $PRESSED -eq 1 ]
then
	while [ 1 -eq 1 ]
	do
		PRESSED1=`/usr/bin/gpio -g read 14`
		PRESSED2=`/usr/bin/gpio -g read 4`
		if [ $PRESSED1 -eq 0 ]
		then
			/sbin/reboot
		elif [ $PRESSED2 -eq 0 ]
		then
			/sbin/shutdown -h now
		fi
		sleep 5
	done
else
	/usr/bin/gpio -g write 25 1
	sleep 2
	/usr/bin/gpio -g write 25 0
fi

スーパユーザでないとrebootやshutdownコマンドを実行できないので,このファイルのユーザをrootにします.また,スクリプトに実行権限を付加します.最後に,/usr/local/binの下に移動します.これらのことを下のように行います.

% sudo chwon root.root check_reboot.sh
$ sudo chmod a+x check_reboot.sh
% sudo mv check_reboot.sh /usr/local/bin/

あとはこのスクリプトを起動時に実行させるべく/etc/rc.localに追記しておきます.

# Check reboot and shutdown
/usr/local/bin/check_reboot.sh &

これで再起動すればよいです.