Bluetooth® LEで音声通信にトライ！ オーディオ再生編

今回はSTマイクロエレクトロニクスのワイヤレス・マイコン[STM32WBシリーズ](https://www.stmcu.jp/stm32/stm32wb/)の開発ボードを使って、Bluetooth® Low Energy (Bluetooth LE)で音声通信を行うデモにトライします。このデモでは、スマートフォン内のオーディオ・ファイルをBluetooth LEでマイコンボードへ送信＆再生することができます。STM32WBマイコン１つでできてしまうので、ずいぶん手軽になりましたね。
圧縮されたステレオ48KHzサンプリングのWAVデータをBluetooth LEで受信し、パソコン側で再生します。
「Bluetooth LEでの音声通信はまだ先では？」と思った方もいるかもしれませんが、そのとおりです。2020年仕様公開予定の”[LE Audio](https://www.bluetooth.com/learn-about-bluetooth/bluetooth-technology/le-audio/)”とは別モノで、互換性はありません（当デモはSTベンダープロファイルで動作させています）。

（2024年5月update）
2024年より、LE Audio対応チップ搭載のボードがリリースされました。
<a href=https://www.st.com/ja/evaluation-tools/stm32wba55g-dk1.html#overview>STM32WBA55G-DK</a>

<a href=https://wiki.st.com/stm32mcu/wiki/Category:BLE_Audio>BLE Audio in STM32 WiKiページ</a>

![demo_allview.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/7ed93329-ab68-7bf2-3377-047fe6979cc7.jpeg)


# 1. ハードウェアの準備

【用意するもの】
 - [STM32WB Nucleo Pack](https://www.st.com/ja/evaluation-tools/p-nucleo-wb55.html)（Pack内に搭載されたMB1355Cボードのみ使用）
 - パソコン（Windows 10/7）
 - スマートフォン（Android）*Bluetooth 4.2以上
 - USBケーブル（Micro-USB）

今回使用するボードは、STM32WB55 Nucleo Packに搭載されている**MB1355Cボード**（以下、STM32 Nucleoボード）だけです。ボード以外にはパソコンとUSBケーブル（Micro-USB）、Androidスマートフォンを用意します。

今回使用するボード。STM32WB55 Nucleo Packに搭載されているMB1355Cボードのみ使用。
![boardkit.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/5455611a-9fba-bde8-2eff-02b489b769dc.jpeg)



# 2. ソフトウェアの準備
## STM32CubeProgrammerのインストール
（既にインストール済みであればスキップ）
初めてパソコンでSTM32 Nucleoボードを使用する場合、**STM32CubeProgrammer**（旧ツール：ST Link Utility）をインストールしてCOMポート･ドライバなどを入手します（この記事ではSTM32CubeProgrammerは使用しませんが、ドライバが必要）。このツールはSTM32WBマイコンにソフトウェアを書き込む際に必要です。

ダウンロードはこちらから：[STM32CubeProgrammer](https://www.st.com/en/development-tools/stm32cubeprog.html)

![stweb_cubeprog.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/a673dae6-3c1a-cd47-8d68-3a56ca6702e1.jpeg)



ダウンロード･ファイルを解凍した後は、実行ファイルを起動して案内にしたがってインストール。すでにSTM32CubeProgrammerをインストール済みの場合はこの作業は不要です。
インストールが完了したら次に進みます。




## 動作用ソフトウェアの入手
### デモ用プログラム・ファイルのダウンロード
続いて、デモ用のプログラム・ファイルをダウンロードします。
ダウンロードはこちらから：[FP-AUD-BVLINKWB1](https://www.st.com/ja/embedded-software/fp-aud-bvlinkwb1.html) 

![stweb_fp-aud-bvlinkwb1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/e7e72e1f-c883-2a19-202b-b5d849aa8a17.jpeg)



ダウンロードしたファイルを解凍すると、そのまま統合開発環境用の作業フォルダができあがります。以下のフォルダに今回使用するデモ用プログラム･ファイル（バイナリ・ファイル）が用意されているので、まずはファイルを確認します。
保管場所（例）：
「Drive:\...\STM32CubeFunctionPack_BVLINKWB1_Vx.x.x\Projects\P-NUCLEO-WB55.Nucleo\Applications\BLE\BVLPeripheral_FullBand\Binary」
ファイル名：**FP-AUD-BVLINKWB1_FullBand.bin**


### パソコンに接続してソフトウェアの書き込み
ソフトウェア書き込み時は、事前にボードを以下のようにセットします。なお、ソフトウェア書き込み時とデモ動作時ではここの設定が異なるので注意してください。間違えてもボードは壊れませんのでご安心を。
 - ジャンパーJP1*について、**"USB STL"**にジャンパーピンをセット
 - パソコンとNucleoボードを、**"ST-LINK"**コネクタにてMicro-USBケーブル接続
　（Micro-USBコネクタは2か所あるので注意）

*ジャンパーJP1：ボードへの5V電源供給元の選択用ジャンパ

![board_jp1_stlink.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/27c2c49b-1144-7755-0dc7-4c479586bd7d.jpeg)





NucleoボードをパソコンにUSBケーブルで接続すると、「NODE_XXXX」といったUSBメモリデバイスのような形式で認識されます。（初めての場合、最初にドライバのインストールが始まります）
先ほど確認した「FP-AUD-BVLINKWB1_FullBand.bin」というバイナリ・ファイルを、この「NODE_WB55RG」へドラッグ＆ドロップ。
これだけでSTM32 マイコンへのソフトウェア書き込みは完了です。


![copybinfile.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/0e75dc89-8dc7-8cef-02b0-940040c4f511.jpeg)




## スマートフォン・アプリのインストール

次は、スマートフォンで送信側の準備をします。
STのセンサ系アプリ「**ST BLE Sensor**」をスマートフォンにインストール。ここではオーディオ送信用に使います。（既にインストール済みであればスキップ）
現時点では、48KHzオーディオ送信デモに関してはAndroidのみ対応しています。
Google Playストアで”st ble”などで検索すると出てくるので、こちらをインストールします。STのセンサ・デモは大抵こちらのアプリに対応しています。

[STBLESensor](https://www.st.com/en/embedded-software/stblesensor.html)

![smartphone_install.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/f632e78f-38a2-da1e-d8f6-138841f56152.jpeg)


「ST BLE Sensor」では、接続されたデバイスのアプリケーション・デモプログラムによって使用できる機能が自動設定されます。今回のデモの場合、オーディオ送信機能が使えるようになっています。




# 3. オーディオ・ファイルの準備とボードの接続
## 準備
事前に、スマートフォン内の適当なフォルダにオーディオ・データファイル（WAV）を入れておきます。
このデモでストリーミング出来るファイルは48KHzサンプリングのWAVファイルのみです。使用するオーディオ・ファイルが48KHzPCMデータではない場合、リサンプリングが必要です（[Audacity](https://www.audacityteam.org/)などのフリーソフトでリサンプリング可能）。また、MP3やAACなどの圧縮ファイルもこのデモ内では対応していません。


[Audacity](https://www.audacityteam.org/)
![icon_audacity.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/5fe3871a-1288-b54f-97b4-f05bb800d0ec.png)

以下例として、44.1KHzPCMデータをAudacityで48KHzにリサンプリングする手順を簡単に紹介します。

![audacity_resample.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/0c14d414-11b0-43c8-7d1f-41c2959777af.jpeg)


上図の手順にてリサンプリング処理実行後、WAVファイルとしてセーブ。

![audacity_exportwav.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/6ba4151a-70f8-460b-f7e0-f6221c9203f1.jpeg)


これで48KHzのWAVファイルが作成できました。スマートフォン内の適当なフォルダに入れておきます。

## ボードをパソコンへ接続

デモ動作の前に、ボードを以下のようにセットします。ソフトウェア書き込み時にも一度注意しましたが、ソフトウェア書き込み時とデモ動作時ではここの設定が異なるので注意してください。
- ジャンパーJP1*について、"**USB_MCU**"にジャンパー･ピンをセット（=”USB_USER”コネクタから5Vを供給）
- パソコンとSTM32 Nucleoボードを、"**USB_USER**"コネクタでMicro-USBケーブル接続
（Micro-USBコネクタは2か所あるので注意。）
*ジャンパーJP1：ボードへの5V電源供給元の選択用ジャンパ

![board_jp1_demowork.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/5071e4f3-e536-c6e5-f957-d675cf8b212f.jpeg)



## デバイスの認識

ボードが正常にUSB接続されると、”マイクロフォン”（音声入力デバイス）として認識されるのでまずはその確認。
デスクトップ画面左下の検索から、「contro」などとテキスト入力検索して**コントロールパネル**を開きます。この中から「サウンド」をクリックすると、**サウンドプロパティ**が開きます。ここで**”STM32 AUDIO Streaming FS Mode”**という名前のデバイスがあるので、これを選択した状態で”プロパティ”をクリック。


![soundProperty.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/bd995314-12eb-f639-04bf-f311a3868025.jpeg)



[既定の形式]（下図内[Advanced / 詳細]タグ）内に入力形式を選択する項目が表示されるので、**「2チャンネル、16bit、48000Hz」**を選択した状態で”適用”をクリックします。

![soundProperty_advanced.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/d6618eff-bff9-81b9-0c81-602dd82a4eb0.jpeg)



以上でパソコン側の準備はＯＫです。これで、受け取ったオーディオ・データをUSBオーディオ経由でパソコンへ渡す準備ができました。

# 4. 動作確認
## スマホアプリを起動
パソコンにSTM32 Nucleoボードが接続された状態で、送信側のスマートフォン・アプリ（ST BLE Sensor）を起動します。

![icon_stblesensor_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/e7502d37-38ff-1bf5-9ce5-23af68702907.jpeg)


続いて、以下の手順でスマートフォンとデバイスをBluetooth接続します。

![app_start.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/b6623979-d6fb-f317-d2b3-2b1e34325f06.jpeg)



## オーディオ送信（テスト確認）
これでテスト用デモ音楽が再生送信できる状態になるので、まずは再生ボタンをタップします。パソコンのスピーカもしくはヘッドホンで音を確認してみてください。データ受信中はボード側の青LEDが早く点滅しているはずです。

![app_playdemo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/24c7fc28-7012-be87-181c-505651d22bb3.jpeg)


## オーディオ・ファイルの選択
“Song List”内にオーディオ・ファイルを追加することで自由に送信することもできます。”Song List”横のフォルダ・アイコンをタップして、オーディオ・ファイルの入ったフォルダを指定してください。手順は以下のとおり。


![app_selectFolder.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/aca55a94-1fc5-19c1-5a93-edf6dcbd9672.jpeg)

![app_selectMusic_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/73e979d2-05e7-7458-3fcd-02a1a7869893.jpeg)



いかがでしたでしょうか？
STでは、Bluetooth LEを使った音声飛ばしの工夫を以前から行っており、今回ダウンロードした[FP-AUD-BVLINKWB1](https://www.st.com/ja/embedded-software/fp-aud-bvlinkwb1.html) ファイルの中には双方向同時に音声を送受信できるソフトウェアも入っています。こちらも順次紹介していきます。


# 5. 動作の仕組み
最後に、動作の仕組みを簡単に解説します。

- 圧縮形式：[OPUS codec](http://opus-codec.org/)
- 通信データレート：96Kbps or 192Kbps
- オーディオ・フレームサイズ：10ms

元となるオーディオPCMデータを圧縮し、Bluetooth LE（4.2）で送信できるレートまで落として送信します。ここではOPUSというオープン・ソースの圧縮コーデックを使用。受信側では逆の要領で圧縮データをデコードし、出力されたオーディオPCMデータをUSBオーディオに渡しています。

![stds_block.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/1c5db43a-6dff-1989-a07c-49dacae02b81.jpeg)




## 関連情報
さらに詳しい情報は以下の関連情報もご覧ください。
[FP-AUD-BVLINKWB1のユーザマニュアル](https://www.st.com/resource/en/user_manual/dm00631949.pdf)
[STBLESensor source code/Android](https://github.com/STMicroelectronics/STBlueMS_Android)
[BlueST-SDK/Git-Hub](https://github.com/STMicroelectronics/BlueSTSDK_Android)
[OPUS/Git-Hub](https://github.com/STMicroelectronics/BlueSTSDK_Android/tree/1f55866b370778a93afce98bba0dd011eb558747/BlueSTSDK/src/main/java/com/st/BlueSTSDK/Features/Audio)
<a href=https://wiki.st.com/stm32mcu/wiki/Category:BLE_Audio>BLE Audio in STM32 Wiki</a>