今日のゴール
RaspberryPiにタクトスイッチを付けて、スイッチ押されたら、RaspberryPiをシャットダウンする
手順は以下
・タクトスイッチをRaspberryPiに取り付ける
・Pythonで、スイッチが押されたらRaspberryPiをシャットダウンするプログラムをつくる
・PythonのシャットダウンプログラムをSupervisorでデーモン化する
タクトスイッチ
以下のような、4つピンのタクトスイッチを使います。
タクトスイッチは以下のような構造になっています。
ボタンを押すと、通電する仕組みです。
今回は、1番と3番にピンは使用しないので、切り落としてしまってもよいでしょう。
配線する
以下の様に配線します。
GPIOは好きな番号に変えても構いません。その場合はソースコードも変更してください。
クリックで拡大します。
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=pi2行目の「/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で止まったままになってしまいます。
色々と試してみてください。