ブロックを積みながら(14) micro:bit V2、BLEで出力スピーカ切り替え

Joseph Halfmoon

BBC micro:bit V2は「お値段据え置き」ですがメインのSoCがアップグレードされてメモリも増強されています。それだけではなくてV1系で搭載されていなかったスピーカとマイクが搭載されています。でもね、V1では外付けスピーカ使ってました。その辺互換性はどうなるの?BLEからのコマンドで内蔵スピーカと外付けスピーカを鳴り分けるサンプル作ってみました。

※「ブロックを積みながら」投稿順 index はこちら

(使用したプログラム-JavaScript形態-は末尾に)

micro:bit V1では、外付けスピーカをエッジコネクタのP0端子とGND端子に取り付けていました(Music出力の時の設定。音声合成の時はP0とP1端子間。)しかしV2では内蔵スピーカが搭載されてます。P0端子との関係はどうなっているの?回路図みればハード的な接続は直ぐに分かりました。

P0端子と内蔵Speakerへの端子は独立

つまり内蔵Speakerを鳴らしたからといって、P0端子に音声信号が勝手に出力されることはないです。とりあえずP0端子をスピーカ以外の用途に使っているときには普通に使える、と。しかし、外付けスピーカをP0端子に取り付けていたときはどうよ?外付けスピーカは使えないの?そんなことはありませんでした。

ソフトウエアで音声出力の行先をスイッチ

できるようになっていました。MakeCodeエディタの場合、MUSICカテゴリの下の方にmicro:bit(V2)というサブカテゴリがあり、そこに “set built-in speaker ON-OFF” というブロックが置かれていました(アイキャッチ画像をご覧ください。)JavaScriptのコードでいうと以下のメソッドです。

music.setBuiltInSpeakerEnabled(true)

true(ON)にすれば内蔵スピーカが鳴ります。それではfalse(OFF)にするとどうかというと、P0端子に外付けしたスピーカが鳴ります。デフォルトはONでした(music出力は内蔵スピーカに向いている。)

実際に外付けスピーカ(100円ショップで買ってきたやつ)を接続し、鳴り分けのサンプルプログラムを作って動かしてみました。ただ鳴らしても芸がないので、スマホからBLE uartサービスを使ってmicro:bit V2に「コマンド」を送り、その制御により、スピーカの切り替えと音声(メロディ)再生を行ってみました。ブロック形態でのコードは以下のようです。末尾にJavaScript形態でのコードも掲げました(多分こちらの方が分かり易い。)

v2MusicBLEsample以下にハード的なセッティングを示しました。micro:bit V2はHEXオブジェクトファイルを書きこみ後、スマホと再ペアリングの上、電池で動かしています。内蔵スピーカはボード裏面なので写真では見えていません。例によってLEDマトリックスの左肩の1個を「アライブ」表示用にLチカさせています。左下の丸いのが100円ショップの「内磁」型スピーカです。ワニ口に繋がっていなかったのでブレッドボードを介して接続してます。なお、micro:bit V2はワニ口に繋げ易いように端っこに窪み加工してあると聞いたのですが、手元のワニ口クリップ使う限りにおいてはあまりご利益は感じられませんでした。ワニ口の「想定サイズ」があるのかしらん。

v2SpeakerDUTさて、micro:bit V2上では BLE uartサービスを動かしてあります。これに接続すれば外部デバイスとの間で シリアル通信的なことができるようになります。スマホ上でBLE uartサービスを使うアプリもどきを作っても良かったのですが、今回はAndroidスマホ上の

Serial Bluetooth Terminal

というアプリを使わせていただきました(Kai Morich様ありがとうございます。)

コネクトアイコンを押せばすぐにコネクトして、通信できるようになりました。

SerialBluetooth実際には送信コマンドは先頭2文字しか見ていないのですが、”on” と送れば内蔵スピーカから、”off” と送れば外付けスピーカが選択されます。”blues”でビルトインメロディの”blues”が奏でられ、”funk”で”funk”メロディが鳴ります。解釈できないとV2で追加されたメソッドでgiggleという効果音が鳴ります。コマンドが受け取られて処理された後にACK:1というメッセージをmicro:bit側から送り返すようにしてあるのですが、長いメロディ(例えば blues)を再生してみると、メロディが鳴り続けているうちにACK返ってきます。どうもメロディ再生メソッドは「ノンブロック」であるようです。

内蔵スピーカは、こんなところですかね。次は内蔵マイクを触ってみますか。

ブロックを積みながら(13) micro:bit V2、BLEサービス「積んで」みたけれど へ戻る

ブロックを積みながら(15) micro:bitのBLEをラズパイPythonで捕捉 へ進む

BLEで内蔵スピーカと外付けスピーカを切り替えて使うサンプル(BBC micro:bit V2用 JavaScript)
bluetooth.onUartDataReceived(serial.delimiters(Delimiters.NewLine), function () {
    command = bluetooth.uartReadUntil(serial.delimiters(Delimiters.NewLine)).substr(0, 2)
    if (command == "on") {
        music.setBuiltInSpeakerEnabled(true)
    } else if (command == "of") {
        music.setBuiltInSpeakerEnabled(false)
    } else if (command == "bl") {
        music.startMelody(music.builtInMelody(Melodies.Blues), MelodyOptions.Once)
    } else if (command == "fu") {
        music.startMelody(music.builtInMelody(Melodies.Funk), MelodyOptions.Once)
    } else {
        soundExpression.giggle.play()
    }
    bluetooth.uartWriteValue("ACK", 1)
})
let command = ""
bluetooth.startUartService()
basic.forever(function () {
    led.toggle(0, 0)
    basic.pause(100)
})