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

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

zeroミュージックシステム 作ってみた
スポンサーリンク

前回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」はターミナルでの確認用です。実際には要りません。

teratail

teratail

独学で試行錯誤する場合、答えが見つからないことがしばしばあります。時間もかかります。最新技術に関する質問が投稿されているteratail(テラテイル)というサイトを利用すると解決策が見つかる場合もあります。海外のサイトで英語を読むのがツラい人は利用する価値はあると思います。

 

起動時にアプリを開始する

ボタンを検知させる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つボタンがあるのだから、それぞれ割り当てられればもっと多機能になりますね。そこまでの技術もないので先人のアプリケーションを使いました。

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

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

 

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

参考:

Chapter 3. Command reference
Raspberry Piでインターネットラジオを作る #3 - Yotazo Lab.
mpcのコマンド操作 mpc+Pythonでインターネットラジオのストリーミングを聴くプログラムを書いています。寝る前にチビチビ進めてはいるのですが、ひとつ関数を作っておしまいのような毎日です。先は長いなぁ~。 変なところでハマる 再生は $mpc play 、次の局は、$mpc next、前の局に戻る場合は $mpc...(続きを読む)
Pythonエラー一覧(日本語) - Qiita
#英語が分からないからエラーを読まない。 はい、私です。 反省します。 日々ここにpythonエラーを(正確性より分かりやすさ重視)をストックしていきます。 皆さんの力もお貸しいただいて、猿でも分かるエラー辞典を作りたいと思います。 ...
pythonでコマンド実行するには - それマグで!
シェルスクリプトの代わりにPythonで書いてみる コマンド実行をする subprocess モジュールを使う subprocess はコマンド実行がちょっと面倒臭い。 import subprocess input_f = "player.swf" output_f = "radiko.png" cmd = "/us...(続きを読む)
ご意見・ご感想
お気軽にメッセージください!

最後まで読んでいただきまして、ありがとうございます。
コメント欄以外にも、よろしければお気軽にメッセージください。

この記事についてのご感想などはもちろん、間違いのご指摘、またはRaspberry Piの世間話など何でもOKです!

この記事を書いた人
ラズパイダ

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

ラズパイダをフォローする
作ってみた
この記事をシェアしたり自分用に保存してみる。
ラズパイダ

コメント