Bluetooth® LEで音声通信にトライ！ 双方向通話編

今回はSTマイクロエレクトロニクスのワイヤレス・マイコン[STM32WBシリーズ](https://www.st.com/ja/microcontrollers-microprocessors/stm32wb-series.html)の開発ボードを使って、Bluetooth® Low Energy（Bluetooth LE）で双方向音声通信（通話）を行うデモにトライします。このデモでは、デジタルMEMSマイク搭載のSTM32 X-Nucleo拡張ボードを接続したセットを2台使用することで、同時通話を行うことができます。STM32WBマイコン１つでできてしまうので、ずいぶん手軽になりましたね。
モノラル16KHzサンプリングのWAVデータを圧縮後Bluetooth LEにて送信し、受信側でデータを展開しつつ再生します。
「Bluetooth LEでの音声通信はまだ先では？」と思った方もいるかもしれませんが、そのとおりです。2020年仕様公開予定の”[LE Audio](https://www.bluetooth.com/learn-about-bluetooth/bluetooth-technology/le-audio/)”とは別モノで、互換性はありません（当デモはSTベンダ・プロファイルで動作させています）。

![connection_overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/e57d70f2-3dee-0aea-7a82-dac22206390c.png)




#1. ハードウェアの準備
【用意するもの】
 - [STM32WB Nucleo pack](https://www.st.com/ja/evaluation-tools/p-nucleo-wb55.html)（Pack内に搭載されたMB1355Cボードのみ使用）　x 2セット
 - [X-NUCLEO-CCA02M2（MEMSマイク拡張ボード）](https://www.st.com/ja/ecosystems/x-nucleo-cca02m2.html)　x 2セット
 - パソコン（Windows 10/7）　x 2台
 - Micro-USBケーブル　x 2本
![kitx2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/57ab8c31-e694-f115-edcc-2e57d8de6782.png)



今回使用するボードは、STM32WB55 Nucleo Packに搭載されている**MB1355Cボード**（以下、STM32WB Nucleoボード）と、マイク搭載のSTM32 X-Nucleoマイク拡張ボード、**「X-NUCLEO-CCA02M2」**（以下、MEMSマイク拡張ボード）を使います。双方向通話用に使うので、2セットずつ用意します。ボード以外には音声確認用としてスピーカもしくはヘッドホン出力付きパソコンを2台と、USBケーブル（Micro-USB）を2本用意します。


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


ダウンロードはこちらから：[STM32CubeProgrammer](https://www.st.com/ja/development-tools/stm32cubeprog.html)
![stweb_cubeprog.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/89c90dbf-cb55-c66a-4ed7-61dadb67d1b6.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/34f4b978-3fa2-2c23-bf00-9f24aee770a2.jpeg)


ダウンロードしたファイルを解凍すると、そのまま統合開発環境用の作業フォルダができあがります。以下のフォルダに今回使用するデモ用プログラム･ファイル（バイナリ・ファイル）として、**Central用**と**Peripheral用**の2種類が用意されており、それぞれのファイル場所を確認します。ハードウェアに区別はないのでどちらにどちらを使用してもＯＫです（ただし、同じプログラム・ファイルを二つのボード両方に書き込まないこと）。
保管場所（例）：

 - 「Drive:\....\STM32CubeFP_BVLINKWB1_Vx.x.x\Projects\P-NUCLEO-WB55.NucleoApplications\BLE\\**BVLCentral**\Binary」
 - 「Drive:\....\STM32CubeFP_BVLINKWB1_Vx.x.x\Projects\P-NUCLEO-WB55.NucleoApplications\BLE\\**BVLPeripheral**\Binary」

それぞれファイルが入っていることを確認します。
Central用ファイル：「**FP-AUD-BVLINKWB1_Central.bin**」
Peripheral用ファイル：「**FP-AUD-BVLINKWB1_Peripheral.bin**」
![pc_swLocation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/a69174bf-3875-bcf4-7ff6-1c23fd84848c.png)



###パソコンに接続してソフトウェアの書き込み
ソフトウェア書き込み時は、事前にボードを以下のようにセットします。なお、ソフトウェア書き込み時とデモ動作時ではここの設定が異なるので注意してください。間違えてもボードは壊れませんのでご安心を。
 - ジャンパーJP1*について、**"USB STL"**にジャンパー・ピンをセット
 - パソコンとSTM32WB 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/10837408-3af6-7593-69c6-43073d9e8f35.jpeg)


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

1台目　xxx_Central.binの書き込み
![pc_swcopy_central.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/9074e840-ce64-0c4f-0a89-5e84ae0a7e00.png)

2台目　xxx_Peripheral.binの書き込み
![pc_swcopy_peripheral.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/4257d7d1-8ed7-23c7-c41f-ab8165c028cf.png)


##動作時のジャンパ設定に変更
デモ動作の前に、ボードを以下のようにセットします。ソフトウェア書き込み時にも一度注意しましたが、ソフトウェア書き込み時とデモ動作時ではここの設定が異なるので注意してください。
- ジャンパー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/b839d0dd-7baf-4b6f-1a5d-d6284ffc3613.jpeg)


#3. 組み立て
##マイク拡張ボード内インターフェースラインの設定変更
STM32WB NucleoボードにMEMSマイク拡張ボードのX-NUCLEO-CCA02M2を取り付けますが、その前にマイク・インターフェース用のラインを今回のデモ・ソフトウェア用に2か所ほど変更します（ジャンパー（0Ωチップ抵抗）変更）。デフォルトでは標準STM32 Nucleoボードとの接続を想定しているため、当デモで使用するSTM32WB Nucleoボードのマイク用ポートに合わせる必要があります。
デモでは”M1”マイクを利用します。マイク用のPDMデータラインとクロックラインを、それぞれSTM32WBのPA10ポートとPA8ポートに接続します。具体的には、以下のジャンパ2か所を移動させます。
**SB11 --> SB25 (MIC_PDM12) = STM32WB_PA10(SAI1_PDM_DI1)**
**SB7 --> SB26 (MIC_CLK_NUCLEO) = STM32WB_PA8(SAI1_PDM_CK2)**
SB1とSB2については必須ではありませんが（デフォルトで既にショートです）、マイク拡張ボード上のUSBコネクタを使用する場合には必要です。
![x-nucleo_jumper_pdm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/45fb75e4-f027-d417-1809-54f439bf75a3.png)





##ボード組み立て
ジャンパ変更が完了したら、図のようにMEMSマイク拡張ボードをSTM32WB Nucleoボードに取り付けます。**CN7**と**CN10**コネクタで接続します。向きに注意してください。
![stm32wbnucleo_connect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/652ae0ce-672a-69e2-c86c-831f3329882f.png)


Central側、Peripheral側デバイス2台とも完成したら次に進みます。


#4. パソコン側の設定

##ボードをパソコンへ接続
次に、さきほど完成させたボードをパソコンに接続し、マイクロフォンとして認識できるように設定します。
まずは1台のデバイスについて、パソコンとUSBで接続。ボード側の**"USB_USER"**コネクタを使用します。
![connection_PC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/56d05802-2fca-7ef8-ea1b-d6f745cf3537.png)



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

![pc_sound_property.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/c8bc3a97-3b6b-6b82-1325-a2a8ffccbc00.png)



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

![pc_microphone_advanced.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/61d6fa9d-de5c-0f27-41a5-569e43d8ae23.png)



ここまでの設定をCentral側、Peripheral側デバイスそれぞれのパソコンで実施してください。

もしこの設定ができない場合（[Advanced / 詳細]タグが無い場合）、次の操作を試してみてください。
1. Windows10のスタートボタンの上部にある”設定”から、”デバイス”を開きます。
2. オーディオデバイスとして、**”STM32 AUDIO Streaming FS Mode”**が認識されているので、これをいったん削除します（アンインストール）。
3. デバイスを一度パソコンから外し、再び接続します。
4. パソコン側で再度デバイスのインストールが始まりますので完了するまで待ちます。
5. Ready後、再度サウンド・プロパティを開いてみてください。

![pc_setting_device_audio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/e13e1484-0891-0d46-c52d-46e5efc76b98.png)


パソコン側でのマイク入力設定が完了したら、動作確認へ進みます。


補足
JP1を**"5V_EXT"**にセットすることでマイク拡張ボードのUSB-Miniコネクタを使うこともできます。その場合STM32WB Nucleoボード裏面の**SB2**と**SB4**をショートさせてください。

#5. 動作確認
2台のパソコンで、それぞれCentral、Peripheralデバイスを接続します。両デバイス共に電源が入ると自動でBluetooth接続を行います。正常に接続が完了するとLEDが緑点滅から青点滅に変わります。
どちら側のボードからでも構いませんが、例えばPeripheral側STM32WB Nucleoボード上の**SW1**ボタンを押すとPeripheral側ボードからCentral側ボードへ音声転送が開始されます。この時青LEDは早い点滅になります。
![stm32wbnucleo_sw1toStart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/cb9906c6-ea7a-fdea-52b0-e0aa818b6d6d.png)



マイクに向かって話しかけると、他方のSTM32WB Nucleoボードが接続されているパソコンのスピーカから音声が聞こえます。

![connection_overview_actual.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/8f30e12b-c139-45b6-6aa7-ecf28c8a80e9.png)


この状態でCentral側のSW1ボタンを押すと、Central側からも音声を送信できる状態になり、同時通話が可能です。もう一度SW1ボタンを押すと音声送信は停止します。この操作はどちらのデバイスでも独立して行えます。


いかがでしたでしょうか？
STでは、Bluetooth LEを使った音声通信の工夫を以前から行っており、今回ダウンロードした[FP-AUD-BVLINKWB1](https://www.st.com/ja/embedded-software/fp-aud-bvlinkwb1.html) ファイルの中には48KHzステレオ・オーディオを送信できるソフトウェアも入っています。

##関連情報
より詳しく知りたい方・実際に活用されたい方は以下の関連情報もご覧ください。
[FP-AUD-BVLINKWB1のユーザマニュアル](https://www.st.com/resource/en/user_manual/dm00631949.pdf)
[OPUS/Git-Hub](https://github.com/STMicroelectronics/BlueSTSDK_Android/tree/1f55866b370778a93afce98bba0dd011eb558747/BlueSTSDK/src/main/java/com/st/BlueSTSDK/Features/Audio)