IoT向け小型センサ･ノード開発キット「STWIN 」を使ってセンサ･データ収集①

STマイクロエレクトロニクスのインダストリアルIoT向けワイヤレス･センサ･ノード用開発キット[「STWIN」（STEVAL-STWINKT1B）](https://www.st.com/ja/evaluation-tools/steval-stwinkt1b.html)を使って、センサデータの収集（データロギング）を試してみます。使用するソフトウェアは、データ収集用として用意されているFunction Pack[「FP-SNS-DATALOG1」](https://www.st.com/ja/embedded-software/fp-sns-datalog1.html)です。STWINは産業設備機器用のデータ･センシングに向いてますが、汎用的なデータ収集にも利用できます。STWINに搭載されているセンサは主に、加速度センサ、ジャイロセンサ、温湿度センサ、大気圧センサ、音響センサ（マイク）などです。今回は、有線（USBケーブル）接続にて行います。
また、機械学習用のデータ収集としても使えます。既に作成済みのucfファイル（Unico Configuration File *1）があればそれを読み込むことで機械学習判定もできます。
参考資料
ユーザ･マニュアル: [UM2688](https://www.st.com/content/ccc/resource/technical/document/user_manual/group1/de/86/bf/00/e8/27/4c/05/DM00685314/files/DM00685314.pdf/jcr:content/translations/en.DM00685314.pdf)（FP-SNS-DATALOG1のページ→ドキュメントより）
*1: センサ内レジスタに書き込む、ディシジョン･ツリー情報を含むコンフィギュレーション･ファイル。[Unico-GUIツール](https://www.st.com/en/development-tools/unico-gui.html)で生成できます。

本シリーズ「IoT向け小型センサ･ノード開発キット「STWIN 」を使ってセンサデータ収集」の関連記事はこちら
① セットアップ
[② スタンドアロンで実行](https://qiita.com/ykawano/items/84713da0bbb1bed77253)
③ Configファイル

![000_topImage_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/b037e35f-8cb1-f4db-fc7d-03270a253f9f.png)



データ収集用のファームウェア（Function Pack）は現時点で以下4種類の評価ボード向けに用意されています。FP-SNS-DATALOGには“1”と“2”の2種類ありますが、“2”はOSの変更やAIとの連携のしやすさが付加されている程度で、基本的なセンサ･ロギング機能としてはほぼ同じです。またPCからコントロールする際に、“1”、“2”両方ともPythonスクリプトによるコマンド操作（CUI）が基本ですが、“2”はこれに加えてGUIでの操作が可能になっています。

<table>
  <caption>データロギング用Function Pack（ファームウェア）</caption>
  <thead>
    <tr>
      <th>Function Pack名</th>
      <th>センシング</th>
      <th> Note </th>
      <th>評価ボード</th>
    </tr>
  </thead>
  <tr>
    <td> <a href="https://www.st.com/ja/embedded-software/fp-sns-datalog1.html">FP-SNS-DATALOG1 </td>
    <td> 加速度、地磁気、温湿度、音 </td>
    <td>  </td>
    <td> <a href="https://www.st.com/ja/evaluation-tools/steval-stwinkt1b.html">STEVAL-STWINKT1B（STWIN） <BR> <a href="https://www.st.com/ja/evaluation-tools/steval-mksbox1v1.html">STEVAL-MKSBOX1V1（SenosrTile.box）</a></td>
  </tr>
  <tr>
    <td> <a href="https://www.st.com/ja/embedded-software/fp-sns-datalog2.html"> FP-SNS-DATALOG2 </td>
    <td> 加速度、地磁気、温湿度、音 </td>
    <td> AzureOS <BR> AI連携 <BR> GUI操作</td>
    <td> <a href="https://www.st.com/ja/evaluation-tools/steval-stwinbx1.html">STEVAL-STWINBX1（STWIN.box） <BR> <a href="https://www.st.com/ja/evaluation-tools/steval-mkboxpro.html">STEVAL-MKSBOXPRO（SensorTile.box Pro） </td>
  </tr>

</table>


その他関連Function Pack（予知保全ソフトウェア）
[FP-IND-PREDMNT1](https://www.st.com/ja/embedded-software/fp-ind-predmnt1.html)

STWINを初めて使う方は、最初にこちら記事情報を参考にしてセットアップしてください。
[IoT向け小型センサ･ノード開発キット「STWIN」が予知保全に使える！？ 　スマホ編](https://qiita.com/ykawano/items/1550549bb31732470712)
→ 「1．ハードウェアの準備」

その他参考動画（Youtube）:
[STM32CubeProgrammer を使用して STWIN で FP-SNS-DATALOG1 ファームウェアをプログラムする方法](https://www.youtube.com/watch?v=Nd1EOjHfyN4)
[STWIN platform for AI and industrial IoT](https://www.youtube.com/watch?v=CiHDHQp2Hyw&t=28s)

# 1．ハードウェアの準備

【用意するもの】
- [STWINスタータキット：STEVAL-STWINKT1B](https://www.st.com/ja/evaluation-tools/steval-stwinkt1b.html)
- USBケーブルx2（USB-Micro）
- パソコン　（Windows7/10）


STWINに搭載されているセンサ

![100_STWIN.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/274ee9bc-164a-ccd3-62b0-0c40ca17c972.png)


6軸モーション･センサ（*1）: [ISM330DHCX](https://www.st.com/ja/mems-and-sensors/ism330dhcx.html)
加速度センサ: [IIS3DWB](https://www.st.com/ja/mems-and-sensors/iis3dwb.html)
加速度センサ: [IIS2DH](https://www.st.com/ja/mems-and-sensors/iis2dh.html)
地磁気センサ: [IIS2MDC](https://www.st.com/ja/mems-and-sensors/iis2mdc.html)
マイクロフォン（アナログ \*2）: [IMP23ABSU](https://www.st.com/ja/mems-and-sensors/imp23absu.html)
マイクロフォン（デジタル \*2）: [IMP34DT05](https://www.st.com/ja/mems-and-sensors/imp34dt05.html)
温湿度センサ: [HTS221](https://www.st.com/ja/mems-and-sensors/hts221.html)
温度センサ: [STTS751](https://www.st.com/ja/mems-and-sensors/stts751.html)
大気圧センサ: [LPS22HH](https://www.st.com/ja/mems-and-sensors/lps22hh.html)

“I”ではじまるMEMSセンサ型番は、インダストリアル･グレードに対応する産業機器向け製品となっています（10年間 長期供給保証）。

\* 1：慣性計測ユニット
 IMU（Inertial Measurement Unit、互いに補完する複数の異なるセンサを集積したユニット）。STでは加速度センサ、ジャイロ･センサ、地磁気センサを集積した製品群として、[iNEMO](https://www.st.com/ja/mems-and-sensors/inemo-inertial-modules.html)と呼んでいます。ISM330DHCXはiNEMOの中でもさらに機械学習コアを内蔵した、“加速度センサ + ジャイロセンサ”（3 + 3 = 6軸）搭載の、産業機器グレード製品。

\* 2：アナログ / デジタル･マイク
MEMSマイクのタイプには“デジタル”と“アナログ”がありますが、これはインタフェースの違い（デジタル出力 or アナログ出力）で基本的に中身の構造は同じです。STWIN内には両方のマイクが搭載されています。また、アナログマイクであるIMP23ABSUの方は60Khz程度までの音声周波数を取り込めるので、超音波帯域のデータ収集用途に適しています。

搭載マイコン: [STM32L4R9ZI](https://www.st.com/ja/microcontrollers-microprocessors/stm32l4r9zi.html)


# 2．ファームウェアの準備

最初に、パソコンに[STM32CubeProgrammer](https://www.st.com/ja/development-tools/stm32cubeprog.html)がインストールされていることを確認ください。


## 動作用ファームウェアの入手（FP-SNS-DATALOG1）

プログラム・ファイルが入っているProjectファイルをダウンロードします。
ダウンロードはこちらから：[FP-SNS-DATALOG1](https://www.st.com/ja/embedded-software/fp-sns-datalog1.html)

![200_FWdownload.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/6ce3c2a8-9562-be1c-ce1c-617232c6ac8a.png)


ダウンロードしたファイルを解凍すると、そのまま統合開発環境用の作業フォルダができあがります。“Projects”フォルダから下っていくと今回使用するデモ用プログラム･ファイル（バイナリ・ファイル）が用意されているので、まずはファイルを確認します。
ファイル保管場所（例）:
Drive:\...\STM32CubeFunctionPack_DATALOG1_V1.4.0\Projects\STM32L4R9ZI-STWIN\Applications\HSDatalog\Binary
ファイル名: **HSDatalog.bin**


## STWINにファームウェアを書き込み（パソコンと接続）

書き込み時のパソコンとの接続方法はこちらを参考にしてください。
[IoT向け小型センサ･ノード開発キット「STWIN」が予知保全に使える！？ 　スマホ編](https://qiita.com/ykawano/items/1550549bb31732470712)
→「STWINにファームウェアを書き込むための準備（パソコンと接続）」

![201_STWINwithSTLink.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/2ed35afc-8104-00af-1642-ff71157a00cc.png)


準備完了しましたら、先ほど確認した「HSDatalog.bin」というバイナリ・ファイルを、この「STLINK_V3M」へドラッグ&ドロップ。これだけでSTM32 マイコンへのファームウェア書き込みは完了です。
「容量が足りなくて書き込めない」といったメッセージが出た場合、STLINK側のUSBコネクタを抜き差ししてみてください。

![202_FWtoSTWIN.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/6e1e51aa-9bc1-a2cb-9fda-d3257564e884.png)


## PC側の準備

ログ開始・終了の操作はWindowsのコマンドプロンプトから行います。またデータ確認の際、Python実行環境が必要になりますので、もし無い場合は、Anacondaなどをインストールしておいてください。
[Anaconda](https://www.anaconda.com/download/)


# 3．動作確認　

FP-SNS-DATALOG1では大きく分けて２つの操作方法が用意されています。データの保存先としてはPC内か、STWIN本体内のSDカードになります。冒頭に述べたように、今回の記事ではUSB接続による方法を実行してみます。USBケーブル経由で、PC内ストレージにデータ保存します。

- PCへUSB経由保存（USBケーブル接続。コマンドやバッチファイルで操作）
- 内蔵SDカードへ保存（BLE接続、或いは本体スイッチによる操作）





## 3-1．セットアップ

そのままでもデータは取れますが、今回は模型用モーターを置いた台に設置してみました。モーターが回ると振動してSTWINに伝わる仕掛けになってます。振動や音データをログするイメージです。

![410_setup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/a8ca5313-ef7a-f513-75ef-e7b213075707.png)



## 3-2．コマンド実行

ダウンロードしたプロジェクトファイルにはいくつかツールが含まれています（→Utilitiesフォルダ）。データ取得用コマンドは、Windowsのコマンドプロンプトから入力します。
PCに接続後、コマンドプロンプトウインドウを開き、Utilities下の **cli_example** フォルダに移動します。

（例）
Drive:\...\STM32CubeFunctionPack_DATALOG1_V1.4.0\Utilities\cli_example

![420_usbdatalogbat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/1bc333d0-8b73-2616-35bd-3fc8fc995a61.png)


操作はコマンドラインからバッチファイルを実行 **（USB_DataLog_Run.bat）** して進めます。
どのセンサデータを取り込むかなどの設定情報は、ファイル内で指定するjsonファイルで設定します。デフォルトでは“DeviceConfig.json”ファイルが指定されてますが、この.jsonファイル名を変更したり、パラメータを書きかえることでユーザ独自の設定を反映させることができます。DeviceConfig.jsonの内容や、その他exampleとして用意されているjsonファイル内容については、次回記事で解説します。
-tでデータ取得時間のタイムアウトを指定できます（単位: 秒。デフォルト = 100秒）。直接コマンド（cli_example.exe）を打ち込んでもOKですが、このバッチファイルをダブルクリックした方が楽です。

![421_datalogbat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/883251a9-d39a-3757-d1d0-5dfd3d069cdf.png)


```USB_DataLog_Run.bat
REM Welcome to HS_DataLog Command Line Interface example
REM Usage: cli_example.exe [-COMMAND [ARGS]]
REM Commands:
REM -h Show this help
REM -f <filename>: Device Configuration file (JSON)
REM -u <filename>: UCF Configuration file for MLC
REM -t <seconds>: Duration of the current acquisition (seconds)

set PATH=%PATH%;.\bin\

cli_example.exe -f ..\STWIN_config_examples\DeviceConfig.json -t 100

pause
```

デフォルト設定（DeviceConfig.json）でアクティブになっている（= “true”設定）センサは以下７つです。

+ IIS3SWB = true（加速度）
+ HTS221_Humid = true（湿度）
+ IIS2MDC = true（地磁気）
+ ISM330DHCX_GYRO = true（ジャイロ）
+ LPS22HH_Press = true（大気圧）
+ IMP23ABSU = true（音響）
+ STTS751 = true（温度）

以下センサは“false”設定のため、非アクティブになっています。
HTS221_Temp = false
IIS2DH = false
IMP34DT05 = false
ISM330DHCX_ACC = false
ISM330DHCX_MLC = false
LPS22HH_Temp = false

DeviceConfig.jsonは、Utilitiesフォルダ下のSTWIN_config_examplesに入ってます。その他センサ設定用ファイルもここにあります。

![423_deviceConfig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/e5e49004-790e-fa59-e1f6-1e7a18eb1ff0.png)


このまま実行し、デフォルトのコンフィグ（DeviceConfig.json）を使ってデータ取得してみます。データ取得中、モータのスイッチをオンにして振動させた状態にします。10数秒程度経過したのち、ESCキーで終了。

![424_datalogging.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/b8db0b28-fe2b-1a5a-f0e4-a081f5afa51d.png)

cli_exampleフォルダ下に日付時間名フォルダが自動生成され、そこにセンサ･データが保存されました。
センザ名ごとに***.datというファイルが作られています。.DATファイルはRawデータの為そのままだと読むのは難しいので、変換作業が必要になります。

![425_datData.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/2f600edf-a12e-7ab1-d2a3-c3407f4866ba.png)

今回取得したのは16秒間弱のデータでしたが、データサイズの大きいものだとIMP23ABSU（アナログマイク）で約6MByte、IIS3DWB（加速度センサ ワイドバンド）で約2.5MByteでした。
それぞれのサンプリング･レート設定は192KHz、26.6KHzと高速なので、短時間でもデータ量はそこそこのサイズになります。STM32L4+はUSB FS（フルスピード）までのサポートで、HS（ハイスピード）には対応していませんが、十分データを取り込めています。ちなみに一番遅いSTTS751（温度センサ）は4Hzなので、400Byte程度でした。

## 3-3．データの確認

### データ変換

.DATファイルをcsvフォーマットに変換するために、今回はpython scriptを使います（→Utilities\Python_SDKフォルダ内）。

pythonコマンドラインから、***.DATファイルが入ったフォルダを指定してpython scriptを実行します。
→_Exportedフォルダが作成され、そこにまとめてcsvファイル変換後のデータが保存されます。
データフォルダは通常cli_exampleフォルダ下に作られているので、path指定が必要です。面倒であれば作業フォルダであるPython_SDKフォルダにデータフォルダをコピーして進めると良いです。

コマンド: **python hsdatalog_data_export.py [データフォルダ名] -s all**
“s”スイッチの後に“all”指定することで全センサデータを変換します。

![431_exportpy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/f18fced7-3fd6-15a5-7c8e-0722d2629061.png)

<details><summary>hsdatalog_data_export.pyのhelp </summary>

```hsdatalog_data_export.py (help)
(base) D:\_MySTM32Cube3\STM32CubeFP_DATALOG1_V1.4.0\Utilities\Python_SDK>python hsdatalog_data_export.py -h
Usage: hsdatalog_data_export.py [OPTIONS] ACQ_FOLDER

Options:
  -o, --output_folder TEXT     Output folder (this will be created if it
                               doesn't exist)
  -f, --file_format [CSV|TSV]  Exported file format
  -s, --sensor_name TEXT       Sensor Name - use "all" to extract all active
                               sensors data, otherwise select a specific
                               sensor by name
  -ss, --sample_start INTEGER  Sample Start - Data conversion will start from
                               this sample
  -se, --sample_end INTEGER    Sample End - Data conversion will end up in
                               this sample
  -r, --raw_data               Uses Raw data (not multiplied by sensitivity)
  -l, --labeled                Includes annotations taken during acquisition
                               (if any) in the exported data
  -d, --debug                  [DEBUG] Check for corrupted data and timestamps
  -h, --help                   Show this message and exit.

-> Script execution examples:
   python hsdatalog_data_export.py ..\STWIN_acquisition_examples\STWIN_00001
   python hsdatalog_data_export.py ..\STWIN_acquisition_examples\STWIN_00001 -s all
   python hsdatalog_data_export.py ..\STWIN_acquisition_examples\STWIN_00001 -s HTS221 -f TSV -r
   python hsdatalog_data_export.py ..\STWIN_acquisition_examples\STWIN_00001 -o ..\STWIN_acquisition_examples\EXPORTED_DATA_FOLDER
```
</details>




### エクセルで開いて確認

試しに**IIS3DWB_ACC** 加速度センサのファイルをエクセルで開いてみます。最初の500ポイント分のグラフを作成すると右図のようになりました。今回の16秒間分のデータでも約42万8千行ありましたので、開く際注意してください（エクセルの最大表示行数は約100万行）。
![432_excel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/c94971f6-65cb-4dec-6af2-81d157bb0458.png)


### Python scriptでグラフ確認

グラフだけさくっと見たい場合のPython scriptも用意されています。同じくPython_SDKフォルダに入っているグラフ作成用のhsdatalog_plot.pyを実行します。pythonコマンドラインから、以下コマンドを入力。まずはIIS3DWBセンサだけ確認してみます。

コマンド: **python hsdatalog_plot.py [データフォルダ名] -s IIS3DWB**

“s”スイッチの後にセンサ名を指定することで該当データのグラフを表示します。"all"指定すると全データのグラフを一度に表示します。

<details><summary>hsdatalog_plot.pyのhelp </summary>

```hsdatalog_plot.py
(base) D:\_MySTM32Cube3\STM32CubeFP_DATALOG1_V1.4.0\Utilities\Python_SDK>python hsdatalog_plot.py -h
Usage: hsdatalog_plot.py [OPTIONS] ACQ_FOLDER

Options:
  -s, --sensor_name TEXT       Sensor Name - use "all" to plot all active
                               sensors data, otherwise select a specific
                               sensor by name
  -ss, --sample_start INTEGER  Sample Start - Data plot will start from this
                               sample
  -se, --sample_end INTEGER    Sample End - Data plot will end up in this
                               sample
  -r, --raw_data               Uses Raw data (not multiplied by sensitivity)
  -l, --labeled                Plot data including information about
                               annotations taken during acquisition (if any)
  -p, --subplots               Multiple subplot for multi-dimensional sensors
  -d, --debug                  [DEBUG] Check for corrupted data and timestamps
  -h,  --help                  Show this message and exit.
  --help                       Show this message and exit.

-> Script execution examples:
   python hsdatalog_plot.py ..\STWIN_acquisition_examples\STWIN_00001
   python hsdatalog_plot.py ..\STWIN_acquisition_examples\STWIN_00001 -s all
   python hsdatalog_plot.py ..\STWIN_acquisition_examples\STWIN_00002 -s IIS3DWB -ss 7 -se 13579
   python hsdatalog_plot.py ..\STWIN_acquisition_examples\STWIN_00002 -s all -l
   python hsdatalog_plot.py ..\STWIN_acquisition_examples\STWIN_00002 -l -p -r
```
</details>

![433_hsdatalog_plot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/8ceaf58c-6344-93ca-74a8-04d2cc60ad83.png)


以下のようなグラフウインドウが自動で開きます。ルーペアイコンもしくは十字矢印アイコンクリック後、画面内でのマウス操作でグラフの拡大や移動ができます。フロッピーディスク･アイコンをクリックで画像セーブできます。



例1: IIS3DWB 加速度センサ

![434_IIS3DWBplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/a39247f6-0937-3a15-e98c-4f8c4e77073c.png)

<table>
  <caption> hsdatalog_plot.py グラフ操作 </caption>
  <thead>
    <tr>
      <th>アイコン</th> <th> 機能 </th>
    </tr>
  </thead>
<tr>
    <td>ホーム</td> <td>最初の表示に戻す</td>
</tr>
<tr>
    <td>← / → </td> <td>UNDO / Forward View </td>
</tr>
<tr>
    <td>十字矢印</td> <td>グラフ画面内を左ドラッグで表示範囲移動</td>
</tr>
<tr>
    <td>ルーペ</td> <td>グラフ画面内を左ドラッグで拡大範囲指定 → 拡大表示</td>
</tr>
<tr>
    <td>コントロール</td> <td>ウインドウ内グラフサイズ調整（境界線位置）</td>
</tr>
<tr>
    <td>グラフオプション</td> <td>グラフ表示範囲 ･ スケーリング ･ 色などの変更（拡大 ･ Linear/Log）</td>
<tr>
    <td>フロッピーディスク</td> <td>画像セーブ（.pdf/.jpeg/.pngなど）</td>
</tr>
</table>


今回取得したデータのうち、マイクデータをエクセルで開くと最大表示行数の仕様によりデータ全てを見ることはできませんでした（IMP23ABSU_MIC.csv → 300万行以上）。python scriptを使うと問題なく表示できます。マウス操作以外に、オプション（Figure options）による数値入力でもグラフ表示範囲を変更できます。

例2: IMP23ABSU マイクロフォン
表示設定 X-Aix: Min=1, Max=1.001（→ 1秒～1.001秒間を表示）

![435_IMP23ABSU.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/46e61a89-f275-3f88-ba0d-8907db7b3b14.png)





以上、今回はデータの取得と中身の確認までできました。続きは次回へ。