2014年3月11日火曜日

Volumio シャットダウンボタンに機能追加

OSを入れ替えると,データベースファイルが再構築になるのは痛い.曲数が曲数だけに,丸一晩以上かかるのだから.バックアップを取るべきか.

まあ,それはともかく.

シャットダウンボタンが効かなかったのは,GPIOのピンの接触不良だった模様.
PCのマザボから引っこ抜いたショートジャンパに,ブレッドボード用のジャンパ線を突っ込んだだけのものだから,文句は言えない.いろいろと仕様が固まったところでもっとちゃんとしたのにするつもりなのだが.

シャットダウンボタンは便利なのだが,長押しというのがどれくらいなのかのタイミングがつかみにくい.そこで,shutdownプロセスに入る前にGPIOを使ってLEDを点灯させてみることにした.



シャットダウンボタンを押す → LEDが光る → (ボタンを放してOK) → shutdown → LEDが消える → (基板上ののLEDがPWR以外消えるのを確認) → 電源を抜いてOK

こんな手順になる.LEDが消えただけではまだどこか動いてるかもしれないので,基板のLEDも見た方が安全ではある.

GPIO22 (PIN15) と +3.3 V (PIN17) の間にプッシュボタン
GPIO25 (PIN22) と GND (PIN20) の間にLED



GPIOの22や25を使っているのは,隣のピンが+3.3VだったりGNDだったりするからというだけのこと.

LEDは何かからはずした小さいのがあったので,抵抗も何も入れずに,またもショートジャンパを流用して直結.GPIOの電流供給能力も大したことないので,まあ,大丈夫だろう.

デーモンは以下のように

#!/bin/sh
GPIO=22     #使用するGPIOポート
PUSHTIME=2  #押す秒数

#初期設定
echo "$GPIO" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio$GPIO/direction
echo "low" > /sys/class/gpio/gpio$GPIO/direction

#所定時間押されるまで待つ
cnt=0
while [ $cnt -lt $PUSHTIME ] ; do
  data=`cat /sys/class/gpio/gpio$GPIO/value`
  if [ "$data" -eq "1" ] ; then
    cnt=`expr $cnt + 1`
  else
    cnt=0
  fi
  sleep 1
  done

# GPIO 25 をON
GPIO=25
echo "$GPIO" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio$GPIO/direction
echo 1 > /sys/class/gpio/gpio$GPIO/value

#シャットダウンの実行
shutdown -h now
シャットダウンがらみはこちらをそのまま拝借.
LEDを点けるところはGPIOの基本通り.

このスクリプトを chmod 755 しておいて,/etc/rc.local の最後 (exit 0 の前) に

su -c daemon.sh &

みたいに追記して 自動起動させる (1.2beta 以降.1.1の場合は先日の項を参照).ファイル名,パスは適宜修正.

これで狙った通りの動作になった.



後は最後にACアダプタを引っこ抜くというのをスイッチに置き換えたいところ.
メカニカルに簡単にやるとなると,パドルスイッチを入れて,起動はそれをONにする,終了はまずシャットダウンボタンを押して,システムが落ちたことを確認してからパドルスイッチをオフにするという感じか.これだけのために凝った回路を作るのもどうかと思うが,スマートではないのも確か.


(2015.1.9 追記)
さらに機能追加してみた.
短く押すと再生/停止のトグル,長押しでシャットダウン.
http://yjo-blog.blogspot.jp/2015/01/volumio.html

2 件のコメント: