ST Nucleo WB55RGをOpenThread RCPとして動かしてみた

# はじめに

WB55RGをMatterデバイスとして動かす前にOTBR(OpenThread border router)のRCP(Radio Co-Processor)として動かしてみます。

https://wiki.stmicroelectronics.cn/stm32mcu/wiki/Connectivity:Introduction_to_Matter

# STM32CubeProgrammer の入手

サンプルプログラムをデバイスへ書き込むために STM32CubeProgrammer を使用します。
こちらから入手してインストールします。

https://www.st.com/ja/development-tools/stm32cubeprog.html

# サンプルプログラム (Thread_RCP) の入手

サンプルプログラムはこちらから入手します。

 - どちらのサンプルプログラムも動作しました
 - Wireless Coprocessor Binaryを書き込むアドレスが一部異なるので注意

https://www.st.com/en/embedded-software/x-cube-matter.html

STM32CubeWB v1.18.0, CSA Matter SDK V1.1, OpenThread 1.3 

|Wireless Coprocessor Binary |STM32WB5xxG(1M) |Version
|---|---|---|
|stm32wb5x_FUS_fw.bin |0x080EC000 |V1.2.0
|stm32wb5x_Thread_RCP_fw.bin |0x080DE000| V1.18.0

|Application Binary |STM32WB5xxG(1M)
|---|---|
|Thread_RCP.bin |0x08000000

https://github.com/stm32-hotspot/stm32wb-matter-device-over-thread/

STM32CubeWB firmware release V1.17.0

|Wireless Coprocessor Binary |STM32WB5xxG(1M) |Version
|---|---|---|
|stm32wb5x_FUS_fw.bin |0x080EC000 |V1.2.0
|stm32wb5x_Thread_RCP_fw.bin |0x080CF000| V1.0.0

|Application Binary |STM32WB5xxG(1M)
|---|---|
|Thread_RCP.bin |0x08000000

# サンプルプログラムをデバイスへ書き込む

STM32CubeProgrammerを起動してPC(macOS)とデバイスをUSB Micro-Bケーブルで接続します。
デバイス側はST-LINKポートを使用します。

「connect」を押します。

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/21bf1950-b882-8685-6e83-02d2e7d1be66.jpeg)

Wireless Coprocessor Binaryは「Firmware Upgrade Services」メニューを使用します。
「File path」でstm32wb5x_FUS_fw.binファイルを指定し、「Start address」に書き込みアドレスを設定します。
「Firmware Upgrade」を押します。

![2_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/c63b6e37-0c51-7f3c-294d-b43abe451d78.jpeg)

「File path」でstm32wb5x_Thread_RCP_fw.binファイルを指定し、「Start address」に書き込みアドレスを設定します。
「First install」にチェックを入れます。
「Firmware Upgrade」を押します。

![2_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/78016161-c494-9f8f-37d6-297e7bb13d70.jpeg)

Application Binaryは「Erace & Programming」メニューを使用します。

「File path」でThread_RCP.binファイルを指定し、「Start address」に書き込みアドレスを設定します。
「Start Programming」を押します。

![3_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/614a739b-786c-ab76-7c94-823c4168cca0.jpeg)

# Border Router (Raspberry Pi)

ラズパイへボーダールーターのソフトウェアをインストールする手順はこちらを参照します。

https://qiita.com/kitazaki/items/00fdfbdfc3a8cdb1411e

## Raspberry Pi と WB55RB との接続

USB-UART変換ボード(赤い基板)とRaspberry PiをUSBケーブルで接続します。
USB-UART変換ボード(赤い基板)とデバイス(WB55RG)をジャンパーケーブルで接続します。

![Connectivity_STM32WB_RCP_hardware_connection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/1d2cc219-e726-06c6-164a-da720abc0238.png)

https://wiki.stmicroelectronics.cn/stm32mcu/wiki/Connectivity:STM32_OpenThread_border_router

![IMG_6036.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/d68ab7ac-8b4c-bf0c-04b8-2e97500bd942.jpeg)

## Raspberry Piの設定変更

nRF52840 Dongleデバイスは/dev/ttyACM0として認識されましたが、USB-UART変換ボード(赤い基板)は/dev/ttyUSB0として認識されるため、otbr-agentの設定を一部変更します。

/etc/default/otbr-agent

```bash
# for nRF52840 Dongle
OTBR_AGENT_OPTS="-I wpan0 -B eth0 spinel+hdlc+uart:///dev/ttyACM0 trel://eth0"
　↓
# for STM32 RCP via UART
OTBR_AGENT_OPTS="-I wpan0 -B eth0 spinel+hdlc+uart:///dev/ttyUSB0 trel://eth0"
```

otbr-agentを再起動します。

```bash
sudo service otbr-agent restart
```

![10_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/afebf211-1396-0624-b066-cb847c464124.jpeg)


### ST-LINK側のシリアルコンソール出力

```bash
[0000000000] [PLATFORM]   --> DebugLevel set to 1 
[0000000000] [PLATFORM]   IeeeEui64 = 0x0080e1fffebeccc2
[0000000001] [PLATFORM]   ----> EUID64 = 0x0080e1fffebeccc2
[0000000001] [PLATFORM]   [THREAD] Init_ThreadStack_Infrastructure
[0000001678] [PLATFORM]   EnableSrcMatch=0
[0000001678] [PLATFORM]   PANID=FFFF
[0000001678] [PLATFORM]   Short_Addr=FFFE
[0000001679] [PLATFORM]   PromiscuousMode=0
[0000001822] [PLATFORM]   PANID=FFFF
[0000001838] [PLATFORM]   Short_Addr=0
[0000001902] [PLATFORM]   Short_Addr=FFFE
[0000001966] [PLATFORM]   PANID=1234
[0000001998] [PLATFORM]   Short_Addr=3400
                        [TX :x4b|00011000|..|0000]      6abe -> ffff    (15)
                        [TX :x4c|00011000|..|0000]      6abe -> ffff    (15)
                        [TX :x4d|00011000|..|0000]      6abe -> ffff    (15)
                        [TX :x4e|00011000|..|0000]      6abe -> ffff    (15)
                        [TX :x4f|00011000|..|0000]      6abe -> ffff    (15)
                        [TX :x50|00011000|..|0000]      6abe -> ffff    (15)
[0000027307] [PLATFORM]   Short_Addr=FFFE
                        [TX :x51|00011000|..|0000]      6abe -> ffff    (15)
                        [TX :x52|00011000|..|0000]      6abe -> ffff    (15)
                        [TX :x53|00011000|..|0000]      6abe -> ffff    (15)
                        [TX :x54|00011000|..|0000]      6abe -> ffff    (15)
                        [TX :x55|00011000|..|0000]      6abe -> ffff    (15)
                        [TX :x56|00011000|..|0000]      6abe -> ffff    (15)
[0000033958] [PLATFORM]   Short_Addr=3400
                        [TX :x57|00011000|..|0000]      6abe -> ffff    (15)
                        [TX :x58|00011000|..|0000]      6abe -> ffff    (15)
                        [TX :x59|00011000|..|0000]      6abe -> ffff    (15)
                        [TX :x5a|00011000|..|0000]      6abe -> ffff    (15)
...
```