Raspbian資料一覧

タクトスイッチの長押しでRaspberry Pi 3をシャットダウンさせる(シェルスクリプト)

2016/11/23更新

対応バージョン: Raspbian Jessie Lite - September 2016

Raspberry Pi 3には電源ボタンがないのでシャットダウンするにはOS上でシャットダウン用のコマンドを入力するか電源ケーブルを抜くしか方法がない。

コマンドを入力するのは面倒だが、かといってOS稼動中にいきなり電源ケーブルを抜くのもファイルシステム損傷などの恐れがあるのでタクトスイッチを長押しすることでシャットダウンするようなスクリプトを書いてみる。

ここでは5秒長押しするとhaltコマンドを実行してシャットダウンする仕様とし、サービスとして常時稼動しておくようにする。

結線とプログラム

まず結線は以下の通りで、タクトスイッチとGNDの間に10kΩのプルダウン抵抗を挟む。タクトスイッチのON/OFFはGPIOポート18ピン(GPIO 24)を使って取得し、スイッチが5秒連続で押されたらhaltコマンドを発行するようなシェルスクリプトを組む。

takthalt.sh
#!/bin/sh

wait_max=5	# wait sec

PIN=24
HIGH=1
LOW=0

gpio -g mode ${PIN} in

while [ 1 ]
do
  sts=`gpio -g read ${PIN}`

  if [ ${sts} -eq ${HIGH} ]; then
    cnt=`expr ${cnt} + 1`
  else
    cnt=0
  fi

  if [ ${cnt} -ge ${wait_max} ]; then
    logger "shutdown by takt switch"
    sudo halt
    exit
  fi

  sleep 1
done

※gpioコマンドはWiringPiライブラリに含まれるので必要があればインストールしておく。

関連資料・記事

サービス化

作成したスクリプトを以下の手順でサービス化して常時稼動させておく。スクリプトは「/usr/local/bin/takthalt.sh」に配置するものとし、サービス名は「takthalt」とする。

サービス定義
% sudo vi /etc/systemd/system/takthalt.service
[Unit]
Description=Halt by Takt Switch(long press)

[Service]
ExecStart=/usr/local/bin/takthalt.sh

[Install]
WantedBy=multi-user.target
サービス有効化 & 起動
% sudo systemctl enable takthalt

% sudo systemctl start takthalt

% sudo systemctl status takthalt
● takthalt.service - Halt by Takt Switch(long press)
   Loaded: loaded (/etc/systemd/system/takthalt.service; enabled)
   Active: active (running) since 水 2016-11-23 17:06:50 JST; 4s ago
 Main PID: 1399 (takthalt.sh)
   CGroup: /system.slice/takthalt.service
           ├─1399 /bin/sh /usr/local/bin/takthalt.sh
           └─1415 sleep 1

11月 23 17:06:50 p1 systemd[1]: Started Halt by Takt Switch(long press).

ここまで設定できたら作業完了である。

タクトスイッチを長押しすればsyslogに「shutdown by takt switch」というメッセージを出力してシャットダウンする。

関連資料・記事

参考サイト