前回2回に渡り100円ショップ(でも300円w)にあるBluetooth接続のボタン「Shutter3」を使った音楽プレイヤーシステムをご紹介してきました。
前回の記事
仕上げとしてボタン制御の部分をまとめてみます。
分かりづらいかも知れませんけど、これでひとまずは完了とします。拙いプログラムなのでご指摘や改善案があればフォーラムなどにご記入ください。
なお、当方はブログのサブタイトルにあるように「文系オヤジ」の独学なので当たり前のことが分かっていないと思いますが、どうぞ温かい目でご覧ください。・・・石投げないで〜(笑)
ボタンの割り当てを再度考える
前回までにボタンを制御するBluebutton(https://github.com/kinnalru/bluebutton)で、4つのパターンがあると書きました。しかし、長押しの場合も先にkeydownのイベントを拾ってしまうため、実際には2パターンとなります。本来は1パターンのPythonプログラムなどでイベントを取得させて分岐させるしかありませんね。
keyup=echo UP
keydown=echo down; echo DOWN
longup=echo LONG UP
longdown=echo LONG DOWN
長押しではない場合は、keydownイベントになりますが、離せば当然のことながらkeyupのイベントもセットになります。そのため、keydownとupに分けて別の動作をさせようにも無理があります。
また、長押しの場合の挙動として以下のような順番になってしまいます。
- keydown
- longkeydown
- longkeyup
- keyup
これが厄介です。長押しの場合はkeydownを拾って欲しくないんですよ。仮にkeyupへ動作を割り当てても最後はやはりkeyupを拾ってしまうため。結局は先にダブるか後にダブるかの違いで、ほとんど変わりません。
仕方ないので、どちらもdown側に動作を割り当てました。
keyup=echo UP
keydown= sh /home/pi/next.sh && echo DOWN
longup=echo LONG UP
longdown=puthon /home/pi/nagaoshi.py && LONG DOWN
長押しする際にどうしても次の曲へ割り当てるイベントが発生してしまいます・・・。気にしないことにしました!
next.sh
実際のボタン制御をご紹介します。シェルスクリプトを.sh、Pythonプログラムを.pyとして準備します。
まず、次の曲へ選曲するシングルクリックのnext.shから。
#!/bin/sh
/home/pi/music/jvoice.sh 次の曲だよ
command="mpc next"
eval $command
ご覧のように「次の曲だよ」と喋らせて次へのコマンドです。シンプルです。
nagaoshi.py
もう一つ、Pythonプログラムで音楽の再生と停止を状態によって使い分けるプログラムを書きました。
長押しもまた一つの機能しか割り当てられません。従って、再生している時は停止に、停止している時に再生をさせます。
#! /usr/local/bin/python
import subprocess
cmd = 'mpc current'
ct = subprocess.check_output(cmd.split())
if ct !='':
print ct
cmd ='sh /home/pi/speak2stop.sh'
subprocess.call(cmd ,shell=True)
cmd = 'mpc stop'
subprocess.call(cmd ,shell=True)
pass
else:
cmd ='sh /home/pi/speak2play.sh'
subprocess.call(cmd ,shell=True)
cmd = 'mpc play'
subprocess.call(cmd ,shell=True)
一応動いたので問題ないと思いますが、エラー回避もなにもしていません。詳しい方は補足お願いしますw
簡単に説明すると・・・、
3行目の"cmd= 'mpc current"で現在再生している曲を知るコマンドを指定して、4行目の"ct="にアウトプットで代入します。この時、再生していると再生している曲名など入るわけですから、それで再生しているフラグとします。
何も再生していない時は空白、nullになると思いますので、それを分岐条件としているわけです。
5行目からif文での分岐です。
ct=が空白でない場合、真で音楽mpcをストップさせ、そうでなく空白ならば再生していないのでplayで再生させるというものです。
subprocess.call(cmd ,shell=True)でシェルコマンドとしてコマンドを実行させています。
ちなみに、「print ct」はターミナルでの確認用です。実際には要りません。
起動時にアプリを開始する
ボタンを検知させるbluebuttonのプログラムを起動時に自動実行させます。今回はcrontabを利用します。
・・・と、その前にシェルスクリプトを用意しましょう。
musicsys.shとして、
#!/bin/sh
command="sudo bluebutton -d="Shutter3" -c ~/.config/bluebutton"
eval $command
このbluebuttonはsudo必須とあったので、入れないとダメらしいのですが、これで合っているのか解りません・・・。動きましたけど。
このmusicsys.shをcrontabに記述します。
crontab -e
最終行へ以下のように追記します。
@reboot /home/pi/musicsys.sh
これで再起動後もしばらく待てばボタン制御も受け付ける状態になるハズです。
完成してみて
実際には2つボタンがあるのだから、それぞれ割り当てられればもっと多機能になりますね。そこまでの技術もないので先人のアプリケーションを使いました。
そして若干のタイムラグとどうしても次の曲をしゃべってしまうというのはありましたが、それを制御するのも面倒だったので、そういう仕様にしました!
このボタンは他にも使えますね。
また違う機能を割り当ててみたいと思います。
皆さんもぜひ、作ってみてください。
この記事のコメント(承認後に公開)