作ってみた!ラズパイガジェット達はこちら

Shutter3とRaspberry Pi Zero Wを使ったBluetoothボタンの制御まとめ

スポンサーリンク
zeroミュージックシステム 作ってみた
Raspberry Pi 何ができる

前回2回に渡り100円ショップ(でも300円w)にあるBluetooth接続のボタン「Shutter3」を使った音楽プレイヤーシステムをご紹介してきました。

前回の記事;

  1. Speaker pHAT 単体で音楽再生+Bluetoothボタン制御
  2. Bluetoothボタンで動作と合成音声の再生

 

仕上げとしてボタン制御の部分をまとめてみます。
分かりづらいかも知れませんけど、これでひとまずは完了とします。拙いプログラムなのでご指摘や改善案があればフォーラムなどにご記入ください。

なお、当方はブログのサブタイトルにあるように「文系オヤジ」の独学なので当たり前のことが分かっていないと思いますが、どうぞ温かい目でご覧ください。・・・石投げないで〜(笑)

ボタンの割り当てを再度考える

前回までにボタンを制御する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に分けて別の動作をさせようにも無理があります。

また、長押しの場合の挙動として以下のような順番になってしまいます。

  1. keydown
  2. longkeydown
  3. longkeyup
  4. 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

 

これで再起動後もしばらく待てばボタン制御も受け付ける状態になるハズです。

動作している動画

タイムラグがお分かりいただけると思います。

button ctrl480p

完成してみて

実際には2つボタンがあるのだから、それぞれ割り当てられればもっと多機能になりますね。そこまでの技術もないので先人のアプリケーションを使いました。

そして若干のタイムラグとどうしても次の曲をしゃべってしまうというのはありましたが、それを制御するのも面倒だったので(笑)、そういう仕様にしました!

このボタンは他にも使えますね。
また違う機能を割り当ててみたいと思います。

 

ご参考にして作ってみてください。

参考:

作ってみた
スポンサーリンク
この記事をシェアしたり自分用に保存してみる。
[特集] Raspberry Pi はAmazonでの購入が最もおすすめ!

Raspberry Pi 関連商品は、Amazonのセールが絡むと途端に手に入りやすくなります。価格だけでは無い利点が多いので、もしもプライム会員なら必要な関連品も含めてチェックしてみてください。
利点をまとめてみました。

こちらの記事もオススメです♪
この記事を書いた人
ラズパイダ

学べる楽しむ便利になる。小さいくせにヤケにパワフル。そんなRaspberry Pi をまだ知らない人に伝えたい。様々な場所で利用されているRaspberry Pi を知って「あっ、これもラズパイだっ!」だからラズパイダ!

ラズパイダ——利用しているWEBサービス
ラズパイダ

コメント