ラズベリーパイ2にコマンドボタンをつけてみた

ラズベリーパイにスイッチをつけて、GPIOからシャットダウンしたり、リブートしたりしている人がいる。
確かに、リモートで接続していると、接続が切れてしまったりすると、どうしようもなくなって、やむなく、”えいっ!”っと、電源スイッチを切るのだけど、気の小さい僕には、精神衛生上、はなはだ、よろしくない。
と、言うわけで、シャットダウンスイッチをつけてみた。
せっかくなので、同時に、アプリケーションをスタートしたり、ストップしたりするコマンドボタンも作ってみた。
このコマンドボタンは、監視カメラ用に走らせている、motion のプログラムを起動したり、停止させたりするために利用している。 まぁ、コマンドスイッチ自体は、Python のプログラムしだいで、どのようにも利用できる。
ボタンは、前回のRTCの基盤のあいたところにスイッチを並べてみた。LED点灯用のピンも設定したが、途中で面倒になり、実装は、していない。 /^^;)

スイッチは、前回のRTCモジュールを組んだときの基板のあいたところにヘッダピンとともに並べてみた。
f:id:manpukukoji:20160723214957j:plain
Paithonのスクリプトは、以下のような感じで組んでみた。

#!/usr/bin/python
#coding: UTF-8
import time
import RPi.GPIO as GPIO
import os

System_Reboot=5
System_Shutdown=6
Monitor_Start=13
Monitor_Stop=19
pin_out=21

def SysRBoot_callback(gpio_pin):

	GPIO.output(pin_out, True)
	print "Reboot now!"
	os.system("sudo shutdown -r now")

def SysShut_callback(gpio_pin):

	GPIO.output(pin_out, True)
	print "Shutdown now!"
	os.system("sudo shutdown -h now")

def MStart_callback(gpio_pin):

	if os.path.exists("/var/run/motion/motion.pid"):
		time.sleep(1)
	else:
		os.system("sudo service motion start")
		print "motion start"

def MStop_callback(gpio_pin):

	if os.path.exists("/var/run/motion/motion.pid"):
		os.system("sudo service motion stop")
		print "motion stop"

GPIO.setmode(GPIO.BCM)
#GPIO.cleanup()
GPIO.setup(System_Reboot,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(System_Shutdown,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(Monitor_Start,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(Monitor_Stop,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(pin_out,GPIO.OUT)
GPIO.add_event_detect(System_Reboot,GPIO.RISING)
GPIO.add_event_detect(System_Shutdown,GPIO.RISING)
GPIO.add_event_detect(Monitor_Start,GPIO.RISING)
GPIO.add_event_detect(Monitor_Stop,GPIO.RISING)
GPIO.add_event_callback(System_Reboot,SysRBoot_callback)
GPIO.add_event_callback(System_Shutdown,SysShut_callback)
GPIO.add_event_callback(Monitor_Start,MStart_callback)
GPIO.add_event_callback(Monitor_Stop,MStop_callback)

try:
	while True:
		time.sleep(1)
except KeyboardInterrupt:
	GPIO.cleanup()