Raspberry piにshut downボタンを付ける

Raspberry piを停止する際はコンソールからshut downを行う必要が有ります.

pi@raspberrypi ~ $sudo halt

Raspberry piの仕様から端末に繋ぐことなくスタンドアロンで運用することも多いと思います.本体をちょっと移動したいとき電源を一時的に外さなくてはならないとき、いきなり電源をオフにしてしまえばSDメモリーカードの破損、破壊の恐れが出てきます.安全に電源を落とすためには確実にShut downを行わなければなりません。

そこでイーサネット越しにリモートログインしてshut downを行っても良いのですが、Raspberry pi単体でもShut down出来ないものかと。そこでここではGPIOの一つにshut downスイッチを設け、それを常に監視し、スイッチが押されたらShut Downシーケンスに入るものとします。

スイッチにaitendoで見つけたシートキーを使います.キーが4つ有りますのでシャットダウン以外にもそれぞれ機能を持たせる事ができます。
CIMG2384
Python用GPIOインストールしているものとして進めます.
インポートしているacm1602は外付けのLCDキャラクターディスプレイを制御するものです。
GPIOピンの22〜25にシートキーをプルダウン抵抗を介して接続しておきます。
いかサンプルコードを紹介します.


import time
import acm1602
import datetime
import subprocess
import RPi.GPIO as GPIO

def pushRedButtonLong():
        lcd.cls()
        lcd.putString("Shut Down?",0)
        lcd.putString("Y)Green,N)YellowL",1)
        while 1:
                if GPIO.input(pin_yellowBtnL) == 1 or GPIO.input(pin_yellowBtnR) == 1:
                        lcd.cls()
                        lcd.putString("Cancell",0)#LCDにshut downをキャンセルした事を表示
                        time.sleep(1)
                        return
                if GPIO.input(pin_greenBtn) == 1:
                        lcd.cls()
                        lcd.putString("sudo halt",0)#LCDにshut down処理を行っている事を表示
                        ret = subprocess.check_output(["sudo","halt"]);#システムにshut downを指示する
                        exit()
def pushRedButtonShort():
        lcd.cls()
        lcd.putString("Red Button",0)
        time.sleep(1)
def pushYellowButtonLeft():
        lcd.cls()
        lcd.putString("Yellow L Button",0)
        time.sleep(1)
def pushYellowButtonRight():
        lcd.cls()
        lcd.putString("Yellow R Button",0)
        time.sleep(1)
def pushGreenButton():
        lcd.cls()
        lcd.putString("Green Button",0)
        time.sleep(1)


print "start"
GPIO.setmode(GPIO.BCM)
pin_redBtn=25
GPIO.setup(pin_redBtn,GPIO.IN)
pin_yellowBtnL=24
GPIO.setup(pin_yellowBtnL,GPIO.IN)
pin_yellowBtnR=23
GPIO.setup(pin_yellowBtnR,GPIO.IN)
pin_greenBtn=22
GPIO.setup(pin_greenBtn,GPIO.IN)

lcd = acm1602.acm1602()
lcd.set_cursor('off')
try:
        redPushCount=0
        while 1:
                time.sleep(0.1)

               if GPIO.input(pin_redBtn) == 1:
                        redPushCount += 1
                        if redPushCount > 30:# 3秒長押し検出
                                pushRedButtonLong()
                                redPushCount = 0
                elif redPushCount > 0:
                        pushRedButtonShort() #短押しの場合
                        redPushCount = 0
                if GPIO.input(pin_yellowBtnL) == 1:
                        pushYellowButtonLeft()
                if GPIO.input(pin_yellowBtnR)==1:
                        pushYellowButtonRight()
                if GPIO.input(pin_greenBtn) == 1:
                        pushGreenButton()
except KeyboardInterrupt:
        print 'user terminated'
        GPIO.cleanup()

ここでは赤ボタンを長押ししたら、Shut downするかCancellするかどうかがLCDに表示されます.そこで緑ボタンを押せばShut down処理を始めます。
その他のキーの長押しはそのキーの名称をLCDに表示します.
ここまでで赤ボタン長押しし、そのあと緑ボタンを始めればShutDown処理に移行するようになりました。このようにユーザーの確認をワンクッション置く事で、間違ってShut downするのを防ぐことができます.
ここですぐに電源を抜いてしまうと、Shut down処理の途中ではSDメモリーカードにアクセスしていますので、アクセス中の電源断は運が悪ければSDカードの破損、再起動不能になってしまいます.
アクセスランプが消灯している事を確認してから電源を抜くようにしても良いのですが、筐体によってはボード上のLEDが見えない場合もあります。そこで接続してあるLCDにShut Down処理が完了したことを表示する事にします.

Raspberry pi(Raspbian)ではシャットダウン時に行うスクリプトを書くことができます.
/etc/default/halt
を編集してください.

# Default behaviour of shutdown -h / halt. Set to "halt" or "poweroff".
HALT=poweroff
/home/pi/shutDownLCD.py
/etc/default/halt

ここでは上のようにしました。ユーザーディレクトリに”shutDownLCD.py”というスクリプトを置いてます.これは単純にLCDに”Shut down”しましたよ〜という表示を行うだけのものです.LCDに表示する代わりに終了の音楽をならしても良いしLEDを明滅しても良いですし、ご自身の環境や趣味に合わせてスクリプトを用意してください.
厳密には電源を落としても大丈夫な状態になるのはここで指定したスクリプトが終わってからひと呼吸おいた後になるのですが、電源断のある程度の目安になる事でしょう.

今回は外部表示装置としてLCDキャラクターディスプレイACM1602を使いました。I2CインターフェイスをもつこのLCDはRaspberry piと接続したところ、ちょっと使いこなしが難しい点も幾つか見つかりました。(詳細は別記事にて)
I2Cインターフェイス基板LCD付きを使えばもっと簡単にLCDを制御できる事でしょう。


投稿日

カテゴリー:

投稿者: