Spresense 向けWiSUNボードを使ってみよう

# 初めに

WiSUNのボードを以前から持っていて、Arduinoライブラリ化しておこうとしていた件を記事化しようと思って、ようやく書けました。WiSUNは、WiSUNは、京都大学の原田先生が生みの親の日本発のLPWAなので興味もあり頑張って欲しいと思っていました。
Home Area Network（HAN）や HEMSで話題になっていたけど、実際に触ってみたことがなかったのですが、
Spresense にAddonボードの形式で提供されたので、触れるいい機会になりました。

# 用意するもの

SpresenseはMainボードだけで良いです。

[**SPRESENSEメインボード[CXD5602PWBMAIN1]**
https://www.switch-science.com/catalog/3900/](https://www.switch-science.com/catalog/3900/)
<img src="https://d2air1d4eqhwg2.cloudfront.net/images/3900/500x500/42ccd153-3e89-4f7c-921c-775bc7de996d.jpg" width="200">


Spresense向けのWiSUN Addonボードは、SPRESENSE-WiSUN-EVK-701。

[**Wi-SUN Add-onボード SPRESENSE-WiSUN-EVK-701**
https://www.rohm.co.jp/support/spresense-add-on-board](https://www.rohm.co.jp/support/spresense-add-on-board)
<img src="https://www.rohm.co.jp/documents/11401/6353165/bp35c0-j11.jpg/b67fb07a-42fe-53b3-2280-36930de8de77?t=1568181522063" width="200">

対向デバイスは、PCのドングルで、RS-WSUHA-J11。

[**Wi-SUN USBアダプター RS-WSUHAシリーズ**
https://www.ratocsystems.com/products/wisun/usb-wisun/rs-wsuha/](https://www.ratocsystems.com/products/wisun/usb-wisun/rs-wsuha/)
<img src="https://www.ratocsystems.com/wp-content/uploads/2023/03/wsuha1000-680x680.jpg" width="200">

こちらを使ってPCをコーディネーターにします。

# ブログ（元ネタ）
この記事は、以下のブログに過去に投稿したもののまとめです。

[**Spresense 向けWiSUNボードを使ってみよう**
http://spresense.livedoor.blog/archives/34324898.html](http://spresense.livedoor.blog/archives/34324898.html)

# WiSUNモジュールについて

**SPRESENSE-WiSUN-EVK-701**に載っているWiSUNのモジュールは、BP35C0-J11です。
以下がデバイス情報になります。

[**BP35C0-J11　(Wi-SUN Enhanced HAN対応 無線モジュール)**
https://www.rohm.co.jp/products/wireless-communication/specified-low-power-radio-modules/bp35c0-j11-product](https://www.rohm.co.jp/products/wireless-communication/specified-low-power-radio-modules/bp35c0-j11-product)
<img src="https://fscdn.rohm.com/en/products/databook/package/3d_image/module/bp35c0-j11.jpg" width="200">

このモジュールは、Bルート/Enhanced HAN 全モードサポートということで、コーディネーターにも、エンドデバイスにもなれそうです。

# Arduino向けライブラリ
**BP35C0-J11**のArduino向けのライブラリは、ロームさんの公式GitHub、

https://github.com/RohmSemiconductor/Arduino/tree/master/SPRESENSE-WISUN-EVK-701

で提供されています。こちらは現時点では、エンドデバイスのサンプルのみの提供となっています。

また、このデバイスのコマンド仕様は、こちらにすべてありますので、これを使ってライブラリを拡張可能です。

[**BP35C0-J11(Wi-SUN Enhanced HAN)/J11_UART_IFコマンド仕様書_第1.1版.pdf**
https://github.com/RohmSemiconductor/Arduino/blob/master/SPRESENSE-WISUN-EVK-701/documents/BP35C0-J11(Wi-SUN Enhanced HAN)/J11_UART_IFコマンド仕様書_第1.1版.pdfpdf](https://github.com/RohmSemiconductor/Arduino/blob/master/SPRESENSE-WISUN-EVK-701/documents/BP35C0-J11(Wi-SUN%20Enhanced%20HAN)/J11_UART_IF%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E4%BB%95%E6%A7%98%E6%9B%B8_%E7%AC%AC1.1%E7%89%88.pdf)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526253/51d502e6-d258-c5a0-59ba-ac2d2779d72c.png" width="300">

基本的に、こちらのライブラリで動作するのですが、少し使いにくかったことと、今後、Arduinoのライブラリマネージャに登録することも鑑みて、構成の変更やArduinoライブラリっぽくしたものをGitに載せました。

https://github.com/Interested-In-Spresense/BP35C0-J11

こちらは、まだ、ライブラリ登録はしていません。
コーディネーター動作機能を追加したら登録しようかなと思っています。

# サンプルプログラム

ですので、現時点で、エンドデバイスとして、コーディネーターへのダミーデータの送信を行うサンプルのみ追加しています。

https://github.com/Interested-In-Spresense/BP35C0-J11/blob/main/examples/enddvice_sample/enddvice_sample.ino

APIは、非常に簡単にReadmeに書いておきました。
詳細は、上記のデバイスのUARTコマンド仕様を読んでもらえると良いです。

PC側のドングルに設定するコマンドも置いて置きました。

https://github.com/Interested-In-Spresense/BP35C0-J11/blob/main/examples/enddvice_sample/SKSTACK-IP/PAN_Coordinator.txt

TeraTermなどで流し込んてもらえればドングルがコーディネーターとして動作します。

https://forest.watch.impress.co.jp/library/software/utf8teraterm/


サンプルコードですが、非常にシンプルなものになっています。

```c
void setup() {

  if(!bp35c0j11.begin()){
    puts("Device error");
    exit(1);
  }

  if(!bp35c0j11.init(END_DEVICE, SLEEP_DISABLE, 0x05, 0x00)){
    puts("Init error");
    exit(1);
  }

  if(!bp35c0j11.set_auth(password)){
    puts("set_auth error");
    exit(1);
  }

  if(!bp35c0j11.start_han(pair_id)){
    puts("start_han error");
    exit(1);
  }

  if(!bp35c0j11.start_udp(mac_adr, my_port, dist_port)){
    puts("start_udp error");
    exit(1);
  }
}
```

このように、デバイスの初期化、認証の設定、HANの初期化と起動、UDPの設定を行った後、

```c
void loop() {

   static unsigned char data[MAX_WISUN_DATA_SIZE] = { 'T' , 'E' , 'S' , 'T', 'A' , 'B' , 'C' , 'D', 'E' , 'F' , 'G' , 'H', 'I' , 'J' , 'K' , 'L'};

  if(!bp35c0j11.send_data(data)){
    puts("start_auth error");
  }

  for(int i=0; i<sizeof(data); i++){
    data[i] = data[(i+1)%sizeof(data)];
  }

```

このようにダミーデータを送れば、以下のようにターミナルに受信データが表示されます。

<img src="https://livedoor.blogimg.jp/spresense/imgs/e/3/e312bb48.png">

これで、Spresenseからデータの送信ができました！

次は、コーディネーター対応を仕様かな…。