Raspberry PI 2 : GPIO事始めーシャットダウン/リブートボタンを作ってみる

Raspberry Piの設定ができたので、早速GPIOをいじってみようと思います。

実用的に、シャットダウンやリブートをすることが多いので、専用のボタンを設置しようと思います。シャットダウン例は豊富にあるので、それを参考に1回押すとリブート、2秒間押し続けるとシャットダウンするボタンをつくろうと思います。

GPIO押下でシャットダウンするpythonスクリプトについては、下記を参考にさせていただきました。

スイッチの配線

まず、Raspberry Pi 2 Model BのGPIOですが、下記の用になっています。

http://www.element14.com/community/servlet/JiveServlet/previewBody/73950-102-4-309126/GPIO_Pi2.png (参考:Raspberry Pi 2 Model B GPIO 40 Pin Block Pinout | element14

今回は、同様にPIN#6(GND)とPIN#16(GPIO23)をスイッチで直結し、Lowに落とすだけの単純な回路を組みました。 ボタンを押すと、GPIO23がLowに落ちます。

f:id:tomoyukim:20150527115609j:plain

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の電源ライフが送れること間違いなしです。