Raspberry PI 2 : GPIO事始めーシャットダウン/リブートボタンを作ってみる
Raspberry Piの設定ができたので、早速GPIOをいじってみようと思います。
実用的に、シャットダウンやリブートをすることが多いので、専用のボタンを設置しようと思います。シャットダウン例は豊富にあるので、それを参考に1回押すとリブート、2秒間押し続けるとシャットダウンするボタンをつくろうと思います。
GPIO押下でシャットダウンするpythonスクリプトについては、下記を参考にさせていただきました。
- Raspberry Pi にシャットダウンボタンをつける - 猫ぱーんち!
- How to use interrupts with Python on the Raspberry Pi and RPi.GPIO » RasPi.TV
スイッチの配線
まず、Raspberry Pi 2 Model BのGPIOですが、下記の用になっています。
(参考:Raspberry Pi 2 Model B GPIO 40 Pin Block Pinout | element14)
今回は、同様にPIN#6(GND)とPIN#16(GPIO23)をスイッチで直結し、Lowに落とすだけの単純な回路を組みました。 ボタンを押すと、GPIO23がLowに落ちます。
python スクリプトの作成
今回、長押しと単押しの区別などをするために、GPIO.wait_for_edge()
の利用をやめて、GPIO.input()
を利用したPollingに組み替えました。
スクリプトは下記になります。
#!/usr/bin/env python2.7 import RPi.GPIO as GPIO import os import time GPIO.setmode(GPIO.BCM) GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP) cnt = 0 while cnt < 200: if GPIO.input(23) == GPIO.LOW: cnt += 1 else: if cnt > 0: print "power button will reboot the system..." GPIO.cleanup() os.system("/sbin/reboot") break cnt = 0 time.sleep(0.01) # by 10 ms else: print "power button will shutdown the system..." GPIO.cleanup() os.system("/sbin/shutdown -h now")
GPIO.HIGH
の間はループが回り続ける用になっています。whileの時間を変えることで長押しの時間を変えることができます。
単押しのリブートまでの反応を良くするために、ループのスリープを10msにしています。(10ms単位のループなので、2秒だと200ループ)
一度でもボタンを押すと、2秒以下ならリブート、2秒以上ならシャットダウンという挙動になっています。
ちなみに、python用のGPIOモジュールについては、下記にドキュメントがあります。
raspberry-gpio-python / Wiki / Inputs
起動時に実行できるようにする
こちらは参考サイトそのままの方法でサービス化しました。
### BEGIN INIT INFO # Provides: power-button # Required-Start: # Required-Stop: # Default-Start: 1 2 3 4 5 6 # Default-Stop: 0 # Short-Description: Power Button # Description: Power Button ### END INIT INFO #! /bin/sh # /etc/init.d/power-button PIDFILE=/var/run/power-btn.pid case "$1" in start) if [ -f $PIDFILE ]; then echo $PIDFILE exists. exit 1 fi start-stop-daemon -S -x /usr/local/sbin/power-btn.py -b -m -p $PIDFILE ;; stop) if [ ! -f $PIDFILE ]; then echo $PIDFILE not found. exit 1 fi start-stop-daemon -K -p $PIDFILE rm $PIDFILE ;; *) echo "Usage: /etc/init.d/power-button {start|stop}" exit 1 ;; esac exit 0
これを、/etc/init.d/power-button
に配置して、下記を実行すればOKです。(元記事どおりWarning出ますが大丈夫でした。)
$ sudo update-rc.d power-button defaults
これで、気軽にパワーシーケンスに入ることができるようになりました。 スイッチ付きのACなどに接続しておけば、快適なRaspberryの電源ライフが送れること間違いなしです。