2017/10/02

BLEデータに応じて音声出力!

どうも、クラゲです。
今回は、BLEデバイスからNotifyで読み込んだデータに応じて音声出力を出す方法を紹介します。
例えば、センサー値が、ある閾値を超えたら警告音を鳴らすなどの応用に使えます。

動画の音声はONにして見てください。今回は半固定抵抗のツマミを人が回すことで、センサー値の変化を代用しています。閾値は510付近、つまりツマミの半分の位置です。

【 必要なもの 】

scan のときと同じです

【 デモページとソースコード 】

デバイスがBLE Nanoの場合で説明します。
半固定抵抗のツマミを回すことで音声を出力することが出来ます。

WEB上で試せるデモページはこちら
https://secure1689.sakura.ne.jp/kurage.jellyware.jp/bluejelly/advance_sound.html

ローカル環境で試したい方はこちらのGitHubからダウンロードし、advance_sound.htmlを実行してください。
https://github.com/electricbaka/bluejelly

【 プログラム解説(HTML) 】

プログラムのベースはnotify です。
では、音声出力追加部分について見てゆきましょう。

事前準備として音声ファイルを用意しています。"効果音","素材"で検索するとたくさんサイトが見つかりますし、もちろん自分で録音して作ってもOKです。
今回はこちらの"ロボット合体3 衝撃弱め"を使用しました。
http://soundeffect-lab.info/sound/machine/

音声ファイル再生にはaudioタグを利用します。
まずHTMLにて以下のようにAUIDOタグを記述します。
preloadをautoにすることで音声ファイルを事前読み込みできます。

<!-- 音声ファイルの読み込み -->
<audio id="sound-file" preload="auto">
<source src="./union3.mp3" type="audio/mp3">
</audio>

【 プログラム解説(JavaScript) 】

超シンプルに「データが510以上になったら、PCで音声ファイルを繰り返し再生する」という場合は、Read後の処理部に以下の記述のみでOKです。

if(value >= 510)
  document.getElementById("sound-file").play();

しかしクラゲは、もう少し実用的な使い方を行うために、以下の4つの工夫を追加しています。

それでは見てゆきましょう

Global変数宣言の部分に、音声再生許可フラグを追加しました。初期値はtrueとしました。

//(変化時のみ再生対応)音声再生許可フラグ
var flag_playOK = true;

Read後の処理の部分に、音声再生を加えています。
閾値は510とし、それを超えたら音声ファイルを再生します。ただし再生できる条件として音声再生許可フラグがtrueのときのみです。再生したらfalseにします。また、再生前には必ず音声を巻き戻します。
もう一つの閾値を設け510としています。510以下になったら音声再生許可フラグをtrueにします。

//BLEデータ値に応じて音声出力
if(value >= 510)
{
  //(変化時のみ再生対応)音声再生許可が有効のときのみ再生
  if(flag_playOK == true)
  {
    //(割り込み再生対応)音声ファイルを巻き戻し
    document.getElementById("sound-file").currentTime = 0;
 
    //音声ファイル再生
    document.getElementById("sound-file").play();
 
    //(変化時のみ再生対応)音声再生許可を無効にする
    flag_playOK = false;
  }
}
//(ノイズ変動対応)音声再生許可の有効と無効の閾値に差を設ける
else if(value <= 500)
{
  //(変化時のみ再生対応)音声再生許可を有効にする
  flag_playOK = true;
}

PCの場合は、ここまでの変更でOKですが、スマホの場合はaudioタグでpreloadをautoにしても、実はロードされません。
そこで、javascriptで強制的にロードする必要があります。その時の注意点として、ユーザー操作を伴う動作に連動させる必要があります。つまり、window.onloadに記述してもダメです。今回は"Start Notify"ボタンを押したときにロードさせるようにしました。
ちなみにこの順番も重要で、ble.startNotifyの後に書いた場合はボタンを2度押さないと上手くいきませんでした。

document.getElementById('startNotifications').addEventListener('click', function() {
  //(スマホ再生対応) ユーザー操作時に音声ファイルをロード
  document.getElementById("sound-file").load();
 
  ble.startNotify('UUID1');
});

いかがでしょうか?
半固定抵抗のツマミを調子に乗ってキュッキュ、キュッキュ何回も回していたら、クラゲは手が痛くなりました。やり過ぎにご注意ください。
半固定抵抗からセンサーに変更すれば、ぐっと実用度が上がると思います!

以上、BLEデータに応じて音声出力でした。