M5Stamp C3でBLE5 Long Range のテスト

# はじめに
本記事は、
　　[M5Stamp C3でリモートIDを作りたい](https://qiita.com/hsgucci/items/8a79745c6af41c3e0a0d)
の一部です。

全体が長くなってきたので、部分的に別ページにしました。

2022年6月20日以降に機体登録する100g以上のドローンに搭載が義務付けられている「リモートID」を、
M5Stamp C3を使って、作ってみたいな～という記事の一部です。

# M5Stamp C3でBLE5 Long Range のテスト

M5Stamp C3で、まずはBLE5のLong Range（LE Coded）が送信できるかどうかを試します。

スケッチ例の中に、ちょうどよいサンプルがあります。
[**ファイル**]-[**スケッチ例**]-[**ESP32 BLE Arduino**]-[**BLE5_multi_advertising**]を開きます。
![ble5_example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/38276276-688d-6dc7-51b6-cad79d986848.png)

名前の通り「複数のAdvertise」です。LE Codedも含まれています。

これをコンパイルし、M5Stamp C3に書き込みます。
再掲しますが、C3Uを使うときは最初は真ん中ボタンを押しながらUSBを繋がないとCDCとして認識しません。
そして、USB CDCの設定をEnabledにしておけば、次回接続時はボタンを押さなくてもCOMポートとして認識してくれます。

書き込みが完了すると、マイコンはBLEで拡張advertiseを投げ始めます。
これをスマホで確認してみましょう。
以下のアプリをインストールします。

　　[nRF Connect for Mobile](https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp&hl=ja&gl=US)

Bluetoothの本家NORDICのモニタリングアプリです。

インストール完了したらアプリを起動して、<font color=blue>まずは自分のスマホの性能を知りましょう</font>(^^
下図のように[Device Information]を開けば、スマホがLE Coded PHYや拡張Advertiseに対応しているか確認できます。
![nrf_device.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/3e8c3b35-1af3-ad7e-a505-f6e5c61d9d97.png)

自分のスマホの性能が分かったら、M5Stamp C3を探します。

下図の一番左のように、デフォルトのままだとApple製品やWindowsノートパソコンなども見つけてしまうので、M5Stamp C3を見つけ出すのは大変です。
そこで、「**No filter**」と書かれているエリアの一番右の[▼]をタップし、フィルタ設定を開きます。
フィルタ項目の中では、「**Exclude:～**」と書かれているエリアの一番右の[︙]をタップします。
すると、AppleやMicrosoftなどの主要メーカーの名前があるので、とりあえず全部チェックを入れて、キーボードの[OK]のチェックボタンをタップします。
再度フィルタエリアの右の[▲]をタップしてフィルタを閉じると、余計なBLEデバイスが消えてくれます。

![nrf_filterd3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/e747f513-eb3c-f2a7-2f83-30d198918285.png)

上図の一番右で、赤枠で囲んだ４つのデバイスがM5Stamp C3だと分かる理由は、
`BLE5_multi_advertising`のプログラムの中にかかれているBLEのインスタンスアドレスと同じだからです。
![instance_address.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/0fb86f88-691e-2fa8-2184-d0402007e99d.png)
このように、プログラムで設定している４つのアドレス
- `c0:de:52:00:00:01` 
- `c0:de:52:00:00:02` 
- `c0:de:52:00:00:03`
- `c0:de:52:00:00:04`

がアプリ上で確認できているからです。
一見するとMACアドレスのような6バイトのアドレスですね。
M5Stamp C3は１台の無線機器ですが、プログラムでは４つのAdvertiseを同時に行っている別々のインスタンスです。

それぞれの項目を見ていきましょう。
下図のように、インスタンス部分をタップすると、表示エリアが広くなって詳細が見れるようになります。
![nrf_open2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/749c50c6-fd70-cdb0-6723-7efb53b71e78.png)
この詳細データと先程のプログラムの変数名を比較すると、下記の表のようになっているのが分かります。
|画像|    変数名  | アドレス | プライマリ | セカンダリ |
|:----------:|:----------:|:-----------:|:------------:|:------------:|
|![nrf01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/d90c7255-9b8e-102a-f684-50cd1c6bad94.png)| addr_1m    | `c0:de:52:00:00:01` | LE Coded  | LE 1M   |
|![nrf02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/224c9815-3d0b-f45e-320b-987105bfb83b.png)| addr_2m    | `c0:de:52:00:00:02` | LE 1M     | LE 2M   |
|![nrf03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/f683ade9-3721-0c7c-23b9-f89949758df0.png)| addr_legacy| `c0:de:52:00:00:03` | Legacy    | ---     |
|![nrf04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/b5df2d35-6e12-77cc-b6c3-17b41a7c0266.png)| addr_coded | `c0:de:52:00:00:04` | LE 1M     | LE Coded|

４つ目の**Complete Local Name**を見ると、
`VERY_LONG_DEVICE_NAME_SENT_USING_EXTENDED_ADVERTISING`
となっていて、プログラム中のこのデータだとわかります。
![long_message.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/ea91974a-9878-ed0d-b02a-57a69e2635ec.png)

すなわち、こちらのページ　[変更点③：8倍の通知データ容量](https://techweb.rohm.co.jp/iot/knowledge/iot02/s-iot02/07-s-iot02/5259)　で紹介されている、
![BT5-4_f2.png](https://techweb.rohm.co.jp/iot/upload/2021/05/BT5-4_f2.png)
BLE5の拡張Advertiseが最大255バイトのペイロード能力を持っていることを試していることがわかります。

# S=8モードが使いたい！

ESP32標準のサンプルプログラムで**LE Coded**が簡単に試せることがわかりました。
しかし、こちらのページ　[変更点②：4倍の通信距離](https://techweb.rohm.co.jp/iot/knowledge/iot02/s-iot02/07-s-iot02/5238)　で紹介されている、
![BT5-3_f1.png](https://techweb.rohm.co.jp/iot/upload/2021/04/BT5-3_f1.png)
4倍の通信距離を実現するには**LE Coded PHY S=8**で使う必要があります。

Arduino-ESP32のヘッダファイル中には、以下のように

https://github.com/espressif/arduino-esp32/blob/00214d5c2a1c2b1904f2caf6f0d5ddfe952331ff/tools/sdk/esp32c3/include/bt/host/bluedroid/api/include/api/esp_gap_ble_api.h#L738

`ESP_BLE_GAP_PHY_OPTIONS_PREF_S8_CODING`という定義がされているので、設定することはできそうです。
その下にtypedefされている`esp_ble_gap_prefer_phy_options_t`という型を使う関数も見つけました。

https://github.com/espressif/arduino-esp32/blob/00214d5c2a1c2b1904f2caf6f0d5ddfe952331ff/tools/sdk/esp32c3/include/bt/host/bluedroid/api/include/api/esp_gap_ble_api.h#L1876

ESP-IDFのドキュメントでも紹介されています。

https://docs.espressif.com/projects/esp-idf/en/v4.3/esp32/api-reference/bluetooth/esp_gap_ble.html?highlight=esp_ble_gap_set_prefered_phy#_CPPv428esp_ble_gap_set_prefered_phy13esp_bd_addr_t22esp_ble_gap_all_phys_t22esp_ble_gap_phy_mask_t22esp_ble_gap_phy_mask_t32esp_ble_gap_prefer_phy_options_t

`esp_ble_gap_set_prefered_phy`関数を使うことでS=8のオプションが設定できそうでが、使い方がまだわかりません(>_<)
どなたか、ご存知の方、いらっしゃいますでしょうか。。。