Amazonのアソシエイトとして、ラズパイダ(raspida.com)は適格販売により収入を得ています。詳しくは当サイトの プライバシーポリシーをご覧ください。

以前、100円ショップ(でも300円w)にあるBluetooth接続のボタン「Shutter3」のボタン制御の部分をまとめてみます。

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

ボタンを制御する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を拾って欲しくないんですよ。

簡単に行うため、どちらもdown側に動作を割り当てました。

keyup=echo UP
keydown= sh /home/pi/next.sh && echo DOWN
longup=echo LONG UP
longdown=puthon /home/pi/nagaoshi.py && LONG DOWN

プログラミングができる人は、条件分岐で4パターンで書いてみてください。

next.sh

実際のボタン制御をご紹介します。シェルスクリプトを.sh、Pythonプログラムを.pyとして準備します。

まず、次の曲へ選曲するシングルクリックのnext.shから。

#!/bin/sh
/home/pi/music/jvoice.sh 次の曲だよ
command="mpc next"
eval $command

ご覧のように「次の曲だよ」と喋らせて次へのコマンドです。シンプルです。

■Pi 5は8GBモデルがオススメ

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)

エラー回避もなにもしていません。

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

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

このボタンデバイスは手軽に使えますね。また違う機能を割り当ててみたいと思います。

皆さんもぜひ、作ってみてください。