2015年1月8日木曜日

Volumio プッシュスイッチに機能追加 / Volumio + 1 push switch with 2 functions - shutdown and play/pause toggle

(日本語の本文は続きにあります)

For English readers,

This script is written for Volumio on Raspberry pi.
It enables one push switch (momentary on) to control two functions:  shutdown and play/pause toggle.
When you press the switch over 5 s, the system shutdowns.  An LED turns on informing you that the system enters the shutdown process and you can release the switch.
When you press for a moment (1 s or so), mpd starts/pauses the music -- toggle.
Watch the video below.

Install a push switch between Pins 15 and 17 of the GPIO port.
Install an LED between Pins 20 and 22.  Pin 20 is for the cathode (K).  No register is required (but a 50 - 200 ohm register in series is prefered :-) )
See the photo on this page.

The script may be named as you like, and the permission is 755.  Run it as daemon by adding the following line at the end of /etc/rc.local (just before 'exit 0' line).
When the script name is 'daemon.sh' and it is located at /home/volumio,

su -c /home/volumio/daemon.sh &


Volumio を入れた Raspberry pi にシャットダウンボタンを付けてある (こちらに記事).
ボタン長押しでシャットダウンプロセスに入るのだが,入ったことを示し,ボタンから手を離してよいタイミングを,LED の点灯で教えてくれる.
これはこれでいいのだが,シャットダウン以外にこのボタンが使われていないのがもったいない.
そこで,機能追加した.

実装した機能は,

短く押すと再生と停止のトグル動作,長押しするとシャットダウン.

こんな動作.



要は,mpc toggle コマンドを出すか,shutdown -h now コマンドを出すかを,ボタン押しの長さで識別することになる.

もとの shutdown 用スクリプトを改造する.シェルスクリプトをいじるのは久々であるw
まあ,たいしたことをしているわけではない.
while do done ループは無限ループにして,shutdown 時のみそこから break するようにしたことと,短時間でボタンが離されたことを確認して再生制御をかけるようにしたところ (ここの処理がスマートでないw) が改造点.

mpc toggle を実行してから実際に再生がスタート/ストップがかかるのに,タイムラグがあるときとないときがある (音楽データのバッファリングとかの関係か?) ので,短く押すのタイミングが取りづらいときがあるのは,まあご愛敬.
チャタリングとかを考えると,短く,といっても,コンマ何秒かは押して欲しい.しかも,そのあとボタンが離されたことを確実に見るために,0.4秒くらいウェイトを入れている (sleep が2行続くところ) のも,反応がいまいちな感じがする理由なんだろう.でも,これを0.2秒にすると,ディテクトし損なうことが多いので,あれこれ試した結果,このあたりを落としどころとした.
シェルスクリプトと stdio というところもあんまりよくないところなのかも.
python あたりで書き直す計画はあるw
# Push switch daemon for shutting-down and play/pause toggle
# Copyright (C)2015 by yjo
#
# Run as "su -c daemon.sh &" at the end of /etc/rc.local
# (before "exit 0" line)

# short-push : play/pause toggle
# long-push till LED on :  shutdown

# push switch : between pins #15 & #17
# LED : between pins #20(K) & #22(A)

#! /bin/sh
# constants
GPIO_SW=22          # GPIO port for SW
GPIO_LED=25         # GPIO port for LED
SLEEP_INTERVAL=0.2  # interval for sleep command
PUSHTIME_SD=5       # push-and-hold time for shutdownPUSHTIME_PP=1     # push-and-hold time for play/pause toggle

# initialization of GPIO
# port 22 for input w/ pull down
echo "$GPIO_SW" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio$GPIO_SW/direction
echo "low" > /sys/class/gpio/gpio$GPIO_SW/direction   # pull-down
# port 25 for output
echo "$GPIO_LED" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio$GPIO_LED/direction

# main loop
cnt=0
while :
do
  data=`cat /sys/class/gpio/gpio$GPIO_SW/value`
  if [ "$data" -eq "1" ] ; then
    cnt=`expr $cnt + 1`
  else
    cnt=0

  if [ $cnt -gt $PUSHTIME_PP ] ; then
    sleep $SLEEP_INTERVAL
    sleep $SLEEP_INTERVAL
    data=`cat /sys/class/gpio/gpio$GPIO_SW/value`
    if [ "$data" -eq "0" ] ; then
      mpc toggle
    fi
  fi
  if [ $cnt -gt $PUSHTIME_SD ] ; then
    break
  fi
  sleep $SLEEP_INTERVAL
  done

# turning on GPIO for LED (25)
echo 1 > /sys/class/gpio/gpio$GPIO_LED/value
# executing shutdown process
shutdown -h now

0 件のコメント:

コメントを投稿