工作と競馬2

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

ラズパイオーディオにシャットダウン/起動用ハードボタンをつける

概要

ラズパイオーディオにシャットダウン/起動用ハードボタンをつけた。


背景と目的

ラズパイオーディオで、Webブラウザアプリからいろいろいじくっていると、ときどき操作ができなくなって しまう時があったりする。そういうときに再起動したいのだが、SSHで接続してコマンドを打つのも面倒なので、 ハードボタンがあった方がいいなと思った。なので、簡単なものをつける。


詳細

ハードウェア

私のラズパイの場合、JustBoom AmpHATが載っているので、その基板上のP2 ピンヘッダから配線する。

P2のピン配置は以下。

Boards Pinout • JustBoom

  • ボタンを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アプリが固まったときも 安全に対処できそうだ。