概要
ラズパイオーディオにシャットダウン/起動用ハードボタンをつけた。
背景と目的
ラズパイオーディオで、Webブラウザアプリからいろいろいじくっていると、ときどき操作ができなくなって しまう時があったりする。そういうときに再起動したいのだが、SSHで接続してコマンドを打つのも面倒なので、 ハードボタンがあった方がいいなと思った。なので、簡単なものをつける。
詳細
ハードウェア
私のラズパイの場合、JustBoom AmpHATが載っているので、その基板上のP2 ピンヘッダから配線する。
P2のピン配置は以下。
ボタンをGPIO3に接続。押したときにLOWになるようにする。
ラズパイはシャットダウン後、GPIO3をLOWにすることで起動できる。GPIO3は基板上でプルアップされているので、 押したときにGNDに接続されるようにしておけばよいことになる。 起動しているときは、通常の入力ポートとしてボタン操作を検出できる。
LEDは適当に余っているGPIO23から。
ソフトウェア
Pythonでボタン操作に応じて、シャットダウンする簡単なスクリプトを作成。 まず、以下をインストール。(volumioだと初めから入ってないんですね...)
sudo apt-get install python-rpi.gpio
shutdown.pyというのを/home/volumioに作成。
# coding: utf-8 import RPi.GPIO as GPIO import time import subprocess PIN_BUTTON = 3 # GPIO3 PIN_LED = 23 # GPIO23 WAIT_SEC = 0.1 LONG_PUSH_SEC = 3 LED_FLASH_PERIOD = 0.3 LED_FLASH_COUNT = 10 # ピンの設定 GPIO.setmode(GPIO.BCM) GPIO.setup(PIN_BUTTON, GPIO.IN) GPIO.setup(PIN_LED, GPIO.OUT) # スイッチ操作検出 while True: cnt = 0 long_pushed = False while GPIO.input(PIN_BUTTON) == GPIO.LOW: GPIO.output(PIN_LED, GPIO.HIGH) # LED点灯 time.sleep(WAIT_SEC) cnt += 1 if cnt > 1 / WAIT_SEC * LONG_PUSH_SEC: long_pushed = True break # 長押しならすぐ終了 GPIO.output(PIN_LED, GPIO.LOW) # LED消す if long_pushed: # LEDを点滅 for i in range(LED_FLASH_COUNT): GPIO.output(PIN_LED, GPIO.HIGH) time.sleep(LED_FLASH_PERIOD / 2.) GPIO.output(PIN_LED, GPIO.LOW) time.sleep(LED_FLASH_PERIOD / 2.) break # ピン設定解除 GPIO.cleanup([PIN_BUTTON, PIN_LED]) # パワーオフ subprocess.call(["sudo poweroff"], shell=True)
上記スクリプトを、起動時に実行するため、
sudo nano /etc/rc.local
で、
sudo python /home/volumio/shutdown.py &
と設定。
動作確認
ボタンを押すと、LEDが付き、3秒以上押しているとLEDが点滅し、シャットダウンされた。 ということで、ちゃんと動作している。
まとめ
簡単にシャットダウン/起動ができるようになった。とりあえず、これでWebアプリが固まったときも 安全に対処できそうだ。