STマイクロ製Sigfoxトランシーバー評価ボードを使ってみる

[FT-ATR-SIGFOX1](https://www.st.com/ja/embedded-software/fp-atr-sigfox1.html)は、[STM32Cube](https://www.st.com/ja/ecosystems/stm32cube.html)ファンクションパックとして、環境センサ・モーションセンサから取得したデータをSigfoxネットワークを利用し送信することができる、[S2-LP](https://www.st.com/ja/wireless-transceivers-mcus-and-modules/s2-lp.html) Transceiverベースの評価ボード用ソフトウェアパッケージです。
このファンクションパックを使えば、Sigfoxトランシーバ（S2-LP）ボードをマイコンボード（STM32 Nucleo）から制御できるようになります。

#ハードウェアの準備
下記ハードウェアを準備します。

- マイコンボード: STM32 Nucleo-64 boards（NUCLEO-L053R8、NUCLEO-L476RG）
- センサボード: X-NUCLEO-IKS01A2
- SigfoxトランシーバS2-LPボード: X-NUCLEO-S2868A1
- USBケーブル（USB A - USB Mini B）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/39256d10-7af8-d3f2-733e-d085dbdf63e6.png)
各種ボードの準備が整っていれば、マイコンボードとトランシーバボード、センサボードを下写真のように連結します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/7ea52bee-fb6f-1f9d-8d28-bb7dfaad1653.png)


#ソフトウェアの準備
マイコンボード（STM32 Nucleo-64）を動かすために[STSW-LINK004](https://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-programmers/stsw-link004.html)をダウンロード＆インストールします。
その後、[FP-ATR-SIGFOX1](https://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32-ode-function-pack-sw/fp-atr-sigfox1.html)からZIPファイルをダウンロード解凍します。
解凍すると下図のようなフォルダが生成されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/36c8b502-b404-caeb-0712-bcd7efbe8fa1.png)
この中にサンプルコードやバイナリが入っています。
その他、TeraTerm等のターミナルソフトと、Sigfoxクラウドへのアクセス権があることを確認してください。

#サンプルを動かしてみる
##Sigfoxクラウドへのデバイス登録(ID/PAC)
Sigfoxクラウドへのデバイス登録は、[こちら](https://qiita.com/ghibi/items/5893923b44f1757294e9)を参考に、Sigfox Buyなどの手段で事前に登録しておいてください）

##STM32 NucleoをPCと接続する
STM32 NucleoとPCをUSBケーブルを接続するとSTMicroelectronics STLink Virtual COM Portとして認識されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/09d8220b-9eb8-77e1-b831-3d99c7d5aaf5.png)
同時に新たなドライブが認識されます。今回は、NODE_L053R8という名前でドライブDが出来上がりました。

##バイナリファイルを書き込む
このドライブにサンプルのバイナリファイルをコピーするだけで、マイコンボードに書き込みが完了します。
今回は、先ほどZIP解凍したフォルダにある下記バイナリファイルをコピーします。
`Projects\STM32L053R8-Nucleo\Applications\Sigfox\AssetTracker\Binary\NUCLEO_L0_ARIB.bin`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/820bd9e9-f3cb-37e0-5e60-f21db8a61a36.png)

##動作確認
ターミナルソフトのシリアルポートのレートを**115200bps**と設定したうえで、STM32 Nucleoが接続されているCOMポートを開けます。
さきほど書き込んだバイナリは動きを検知すると温度・湿度・気圧をSigfoxネットワークで送信するプログラムになっているようですので、ボードを動かしてみると、下記のようにMems eventが起こり、Sigfox Messageを送信していることが見れます。

```
>> Mems event
Sending: 01a500cf277a (Hum=421 Temp=207 Pres=10106)
>> Mems event
Sending: 01a700cf277a (Hum=423 Temp=207 Pres=10106)
>> Mems event
Sending: 01aa00d1277a (Hum=426 Temp=209 Pres=10106)
```
メッセージの送信トリガは、動き検知（加速度センサ）に加え、ボタン（青ボタン）プッシュ、タイマー（3分）のトリガが実装されています。
送信されたメッセージは、Sigfoxクラウドでも確認できました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/f04266c5-b917-7a1f-9df7-b924a6e43ac0.png)

###最後にソースコードをチラ見
最後に、センサデータを取得し、Sigfoxメッセージを送信するソースコードを見てみます。
Projects\STM32L053R8-Nucleo\Applications\Sigfox\AssetTracker\Src\main.cです。

```main.c
#if SEND_SENSORS
    int16_t humidity, temperature, pressure;
    
    sensors_read(&humidity,&temperature,&pressure);
    
    customer_data[0] = ( humidity >> 8 ) & 0xFF;
    customer_data[1] = humidity & 0xFF;
    customer_data[2] = ( temperature >> 8 ) & 0xFF;
    customer_data[3] = temperature & 0xFF;
    customer_data[4] = ( pressure >> 8 ) & 0xFF;
    customer_data[5] = pressure & 0xFF;
    
    printf("Sending: ");
    for(uint8_t i=0;i<6;i++)
      printf("%02x",customer_data[i]);
    printf(" (Hum=%d Temp=%d Pres=%d)\r\n", humidity, temperature, pressure);
    
    /* Call the send_frame function */
    SIGFOX_API_send_frame(customer_data,6,customer_resp,2,0);
```
ここでSIGFOX_API_send_frameでデータ送信していますが、この内部は"Middlewares"フォルダ配下に絡んでいそうですが、特にカスタムすることもないと思いますので、このライブラリ関数をそのまま使用すればよさそうです。
次回は、もう少しセンサの特性を活かした制御プラグラムを作ってみたいと思っています。

[Sigfox Japan KCCS](https://qiita.com/organizations/sigfox)