2015年04月30日

タクトスイッチでRaspberryPiをシャットダウンさせてみた【Python】【supervisor】


今日のゴール

RaspberryPiにタクトスイッチを付けて、スイッチ押されたら、RaspberryPiをシャットダウンする


手順は以下
・タクトスイッチをRaspberryPiに取り付ける
・Pythonで、スイッチが押されたらRaspberryPiをシャットダウンするプログラムをつくる
・PythonのシャットダウンプログラムをSupervisorでデーモン化する

タクトスイッチ

以下のような、4つピンのタクトスイッチを使います。


タクトスイッチは以下のような構造になっています。
ボタンを押すと、通電する仕組みです。
今回は、1番と3番にピンは使用しないので、切り落としてしまってもよいでしょう。
raspi_sw2.gif

配線する

以下の様に配線します。
GPIOは好きな番号に変えても構いません。その場合はソースコードも変更してください。 raspi_sw.png
クリックで拡大します。

GPIO25とGNDの間に10kオームの抵抗を入れています。これはプルダウン抵抗といいます。
プルダウン抵抗を入れることで、スイッチをおした時GPIO25に3.3Vの電圧がかかる(HIGHの状態になる)、押してない時は0Vになる(LOWの状態になる)ようにします。

広告


シャットダウンプログラム【Python】

GPIOのモジュールがインストールされていない場合はインストールしてください。
$ sudo apt-get install python-rpi.gpio
「shutdown.py 」という名前で新規ファイルを作成し、下記のように編集します。
$ sudo vi shutdown.py 
#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import time
import RPi.GPIO as GPIO
import shlex
import subprocess

pin = 25
cmd = 'sudo shutdown -h now'

GPIO.setmode(GPIO.BCM)
GPIO.setup(pin, GPIO.IN)

def shutdown():
  print "shutdown"
  proc = subprocess.Popen(shlex.split(cmd))

try:
  GPIO.wait_for_edge(pin, GPIO.FALLING)
except:
  print "Quit"
finally:
  print "clean up"
  GPIO.cleanup()

shutdown()

20行目の「GPIO.wait_for_edge(pin, GPIO.FALLING)」は、GPIOにかかる電圧がHIGHからLOWに変わるまで待つという処理です。
タクトスイッチのボタンを押して(HIGH)、離したとき(LOW)に処理が進み、最後の行のシャットダウン処理まで到達します。

Supervisorを使用して、デーモン化

Supervisorがインストールされていない場合は、インストールします。
$ sudo apt-get install supervisor
「/etc/supervisor/conf.d/」ディレクトリの下に新しく、シャットダウンプログラム用の設定ファイルを作成します。
$ sudo vi /etc/supervisor/conf.d/shutdown.conf
以下のように編集します。
[program:shutdown_button]
command=sudo python /home/pi/work/shutdown.py
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/shutdown.log
user=pi
2行目の「/home/pi/work/shutdown.py」のパスは、ファイルを置いた場所に適宜変更してください。

下記コマンドを順に打てば、シャットダウンプログラムがデーモン化されます。
$ sudo supervisorctl reread
shutdown_button: available

$ sudo supervisorctl add shutdown_button
shutdown_button: added process group

$ sudo supervisorctl status
shutdown_button                  RUNNING    pid 1234, uptime 0:00:00

ボタンを押して、シャットダウン

ここまで、きたら、タクトスイッチのボタンを押してみます。
ボタンを押したら(正確には、押して離したら)RaspberryPiがシャットダウンします

ちなみに

RaspberryPiには50kオーム程度のプルアップ・プルダウン抵抗が内蔵されています。
ですので、上記のように、抵抗をつかってGNDにつなげなくても、プルダウンが可能です。
その場合は、13行目のGPIO.setupの引数にpull_up_downを追加します。

GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)


このほうが、配線がスッキリするので、ぜひ試してみてください。

ちなみに、ちなみに

タクトスイッチの2番ピンをGPIO25、4番ピンをGNDにそれぞれつなげ、GPIOピンをプルアップモード(pull_up_down=GPIO.PUD_UP)にすることで、タクトスイッチを押していない時はHIGH、押した時はLOWにすることもできます。

ちなみに、pull_up_downの設定を間違えると、ボタンを押しても、電圧の変化がおこらなくなります。
ですので、wait_for_edgeで止まったままになってしまいます。

色々と試してみてください。



posted by Raspberry Pi at 10:35 | Raspberry Pi | このブログの読者になる | 更新情報をチェックする