小型IoT端末開発キット「SensorTile.box」 をセンサ･アプリで使ってみた③　振動FFT

今回は、STのセンサ･デバイス用の汎用スマートフォン･アプリ「ST BLE Sensor」をカスタマイズして、振動FFTデータを取得してみます。カスタム･アプリはExpert modeで作成可能です。


SensorTile.boxのセットアップ方法や基本情報については、こちらの記事を参照してください。
[小型IoT端末開発キット「SensorTile.box」 をセンサ･アプリで使ってみた①　セットアップと使い方](https://qiita.com/ykawano/items/9aed0be1ca919ad4551d)


![10_overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/0e390126-5b7b-d488-c71b-2a109767853c.png)



## 1．Expert mode
SensorTile.boxは、ST BLE Sensorアプリ上で使用機能をカスタマイズすることができます。設定内容をBluetooth®経由で随時アップロードすることで、使用目的に応じた使い方が可能です。機能を変更する場合は、その都度アプリからスマホへ設定情報のアップロードが必要です。

この章では、操作方法などを含めExpert mode全体の概要を説明します。すぐに振動FFTのアプリを作成したい場合には、「2．加速度データ & 振動FFT」へと進んでいただいても大丈夫です。

#### 手順
1．Expert modeに入る
2．以下3つの項目を設定
　　・**入力**: どのセンサ･データを使うのか
　　・**ファンクション**（Function）: 処理内容
　　・**出力**: データの出力先を選択
3．Bluetooth再接続後、アプリ使用開始（設定された機能に応じたアプリ画面ページが表示）




#### 操作方法
ST BLE Sensorアプリの中でExpert modeに入ると、以下のようなカスタム･アプリ作成用のページに移動できます。

![11_Expertmode_overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/55b1221d-78b6-d849-d52c-84f6abd6dadb.png)





#### 選択可能な入力センサ（SensorTile.box内搭載センサ）および基本ファンクション

|アプリ内入力センサ名   |デバイス型番    |センシング対象   |設定可能なファンクション（Primary Function）|
|:------------:|:---------:|:--------:|:--------|
| Temperature sensor       |STTS751      |気温     |ARMA, ., ., ., Max, Min, Norm, Avg, Std, Threshold |
| Humidity sensor|HTS221|湿度|ARMA, ., ., ., Max, Min, Norm, Avg, Std, Threshold |
| Pressure sensor        |LPS22HH        |大気圧       | ARMA, ., ., ., Max, Min, Norm, Avg, Std, Threshold|
| Low power Accelerometer sensor       |[LIS2DW12](https://www.st.com/ja/mems-and-sensors/lis2dw12.html)       |加速度       |ARMA, FFT, Pedometer, RMS, Max, Min, Norm, Avg, Std, Threshold |
| Vibrometer Accelerometer sensor        |[LSM6DSOX](https://www.st.com/ja/mems-and-sensors/lsm6dsox.html)        |加速度       |ARMA, FFT, Pedometer, RMS, Max, Min, Norm, Avg, Std, Threshold |
| IMU Accelerometer sensor        |[LSM6DSOX](https://www.st.com/ja/mems-and-sensors/lsm6dsox.html)        |加速度       | 同上 |
| IMU Gyroscope sensor        |LSM6DSOX        |ジャイロ      |ARMA, FFT, ., RMS, Max, Min, Norm, Avg, Std, Threshold |
| Inclinometer sensor        |[LIS3DHH](https://www.st.com/ja/mems-and-sensors/lis3dhh.html)        |加速度       |ARMA, FFT, Level, RMS, Max, Min, Norm, Avg, Std, Threshold |
| Magnetic field sensor        |LISMDL        |地磁気      |ARMA, FFT, H I Comp, RMS, Max, Min, Norm, Avg, Std, Threshold |
| Microphone       |MP23ABS1        |音響       |ARMA, FFT, ., ., ., ., ., Avg, ., . |


“Vibrometer Accelerometer sensor”と“IMU Accelerometer sensor”はどちらも「LSM6DSOXを使用して加速度をセンシングする」となっていますが、現時点の仕様では同じセンサとして認識されるため、どちらを選んでもOKです。将来的に変更が加わる可能性はありますが、今は同じ入力項目という扱いで問題ありません。

各入力センサに対して設定できるファンクションは決まっています。ここに挙げたものは「主要なファンクション」ということで、“Primary Function”と呼びます。Primary Functionによる演算結果から設定スレッショルド（しきい値）越えの判定をしたい場合などは、さらにカスケード的にファンクションを追加します。また、複数のセンサを選択することでアクティブになるファンクションも存在します。

試しに加速度センサを入力に設定し、簡単そうなファンクションをいくつか試してみました。MAX（最大値）やMIN（最小値）、RMS（2乗平均平方根）、Std（Standard deviation: 標準偏差）などは画面上でグラフプロット確認できました。ただ、AVG（平均値）はうまく表示されなかったので、何らかの不備がある可能性があります。センサ･データに対して1次的に（Primary Functionとして）Thresholdファンクションを設定することもできますが、この結果はスマホなどへ直接出力することができません。別途作成するカスタム･アプリの入力用として利用できます。

ARMA（Auto Regressive Moving Average: 自己回帰移動平均モデル）はフィルタらしいですが、係数を直接入力する必要があり難しそうです。このあたりの説明は、私自身があまり活用できなかったので省略します。
今回の記事では、加速度データを使ったFFTを試してみます。


#### 出力

この記事シリーズでは、主にStream to BluetoothもしくはFile to SD cardを使います。なお、Stream to USBについては、現時点で動作確認できていません。
出力先がStream to Bluetoothで、かつファンクション無しあるいはRMSやMAXなどの単純データ送信の場合、センサのODR（Output Data Rate: 出力データレート）は52Hz以下にしてください。これ以上に設定してもアプリの作成自体は可能ですが、スマホへのアップロード時にエラーが表示されます。Bluetooth転送上限レートによる制約です。


|出力先   |設定    |内容･制限事項   |
|:------------:|:---------:|:--------|
| File to SD card       |ファイル名 & バッファサイズ     |内蔵SDカードへ記録   |
| Stream to USB       |無し     |USB接続し、VCOM port経由でPCへデータ/結果送信。File to SD cardとの併用は不可。    |
| Stream to Bluetooth      |無し     |スマホへデータ/結果送信。データレートは最大52Hz。加速度センサは1個まで選択可能。     |
| Save as Input      |無し     |別のアプリ用に入力項目として使用可能。 |
| Save as EXP (Expression)     |緑LED点灯     |真偽式（True or False）のフラグ。“IF”アプリステートメントで使用。    |




## 2．加速度データ & 振動FFT

それでは実際に、加速度センサを使った振動FFTデータを取得するアプリを作成していきましょう。

### 2-1．加速度センサ

今回は加速度センサとしてVibrometer Accelerometer（LSM6DSOX）を選択しますが、SensorTile.boxに搭載された別の加速度センサを選択することもできます。


![20_ACCsensors.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/1ee197e6-e15c-a520-b234-698fb0693f20.png)



前回記事でも紹介しましたが、SensorTile.boxには以下3種類の加速度センサが搭載されています。

+ LSM6DSOX: LSM6DSOX: 加速度センサとジャイロセンサを搭載したモーション・センサ｡姿勢検出向け｡各センサはそれぞれ単独でも使用可能｡
+ LIS2DW12: 超低消費電力加速度センサ｡
+ LIS3DHH: 高精度加速度センサ｡温度補償もあり、傾斜計向け｡




### 2-2．セットアップ

以下内容でカスタム･アプリをセットアップしてみます。
　　・入力センサ: 加速度センサ **Vibrometer Accelerometer（LSM6DSOX）**
　　・ファンクション: **FFT**
　　・出力データ先: **Bluetooth**経由でスマホへ
スマホのST BLE Sensorアプリを起動して以下手順でExpert modeに入り、新規アプリ作成用のページに移動します。


![21_setup_start.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/bee7018e-9a98-79da-e271-fb400ec24726.png)


##### 入力センサ: Vibrometer Accelerometer

まずは入力センサを設定していきます。Vibrometer Accelerometer（=LSM6DSOX）を選択後、詳細設定ページにてODRを208Hzに設定してみます。
ODRは、取り込めるデータの周波数上限に影響します。208Hzに設定した場合、ODRの1/2以下、つまり104Hz以下の振動周波数データを取り込むことができます。


![22_setup_input.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/915316b1-c791-5d4f-3e54-15d8fedbe144.png)

##### ファンクション: FFT

次にFFTファンクションの設定です。パラメータとしては、「全帯域に対する分割数･周波数ステップ」を意味するFrequencies to produceを設定することができます。本記事ではデフォルトの”256”で行うため、そのまま進んでもOKです。

![23_setup_function.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/83306a18-efba-8d12-fe37-69d7f55789f2.png)

|Function            |Frequencies to produce        | 意味  |
|:------------:|:---------:|:--------|
|FFT  |16 / 64 / 256 / 1024|全帯域に対する分割数･周波数ステップ|

FFTファンクションでは、入力センサから渡されてくる時系列データを周波数ドメイン･データに変換します。Frequencies to produceパラメータは「分割数」で、全体の周波数をどの程度の間隔（step）で計算するかを決定します。仮にODR = 208HzでFrequencies to produce = 256の場合、208/256 = 0.8125Hz step毎に算出します。実際にデータとして出てくるのはFrequencies to produce/2 = 128箇所の周波数ポイント分までです。この個数は0Hzも含むので最大は0.8125*127 = 103.1875Hz、つまり範囲としては0Hz～103.1875Hzの周波数レンジとなります。
イメージを実際のグラフ例上（保存csvファイル→エクセル上でグラフ化）に図示します。


![24_calcExanple.png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/bba2ea1d-b950-14bc-73c0-f237c232a7e3.png)





##### 出力: Bluetoothでスマホへ

最後に出力先の設定です。今回はスマホ側でデータを受信するようにします。


![24_setup_output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/f0975f69-f299-1ec6-27a6-e345d4b33df8.png)


アプリをアップロード後、スマホとBluetooth接続します。



![25_setup_upload.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/b10fc258-23f4-e423-e7a4-f907033b81d7.png)


#### 設定まとめ


|            |選択アイテム        | 設定内容  |
|:------------:|:---------:|:--------:|
|Input  |Vibrometer ACC（LSM6DSOX）|Low power mode, ODR=208Hz|
|Function  |FFT|Frequencies to produce=256|
|Output  |Stream to Bluetooth|Bluetooth経由でスマホへ演算結果送信|


### 2-3．動作確認

#### 基本動作

Bluetooth接続後すぐに、FFT結果が一定の時間間隔で送信されてきます。周波数間隔（Step）が短いほど送信データ量が多いので、送信間隔は長くなります（データ更新間隔が長くなる）。
以前のバージョンでは、ログ記録用のアイコンが右上にあったのですが、最新のバージョンでは削除されており、代わりにメニューから操作するようになっています。このあたりの操作方法は今後のバージョンアップで再度変更があるかもしれません（記事執筆時点のバージョンは4.11.0）。


![30_App_output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/b3d0ec46-3bf9-50db-c239-417cb9956211.png)


スマホ内のSTMicroelectronicsフォルダ以下を見ると、送られてきたデータが2種類保存されていました。ひとつは受け取った直後の整理前データ（RAW Data）で、もうひとつは整理後のデータです。両方ともcsvフォーマットなので、エクセルなどで確認できます。加速度データの単位はmgです（gは重力加速度。“ミリグラム”ではない）。
1000mg = 1g= 9.8$m/s^2$

![31_files.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/7752e5c1-333f-d6c5-0379-9148ef0440f9.png)


FFT結果が見やすいように整理済みファイルの方を開きます。
各XYZ軸の加速度FFTデータが確認できます。

![32_excel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/f5c1a821-6a4e-1838-625c-3d95557cccc7.png)



#### 設定変更1　Frequencies to produce


次に、Steps数を粗くしてみます。ODR = 208をFFT設定のところのFrequencies to produceで分割したものが周波数間隔になります。
デフォルトの256から16に変えてみます。つまり、208/16 = 13Hz。13Hz間隔でFFTが算出されます。
実際には、ODRの1/2以下の周波数まで有効になるので、”Frequencies to produce数\*1/2 – 1”が最大値ということになります。計算すると16\*1/2-1 = 7、つまり7個目までのstep = 91Hz、これが最大周波数となります。（13Hz, 26Hz, 39Hz, 52Hz, ... 91Hz（13x7））

変更方法は、以下の通りです。



![40_setup2_input.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/bb08f5ab-5afb-5946-a50b-54c7fce2d820.png)


全体をセーブ後、アップロードします。



![41_setup2_upload.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/2d913632-6fad-d3fb-349f-50a8b171cb7c.png)


最初のデータと比べて1変換分のデータが激減しているので、データ更新間隔が短くなって、よりリアルタイムで観察することができます。



![42_excel_graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/d37aaba7-f0a7-40ea-f39e-3c3896519593.png)


#### 設定変更2　High performance mode


LSM6DSOXをHigh Performance mode（高速ODRが選択でき、データも高精度になるが、その分消費電流も大きくなる）にすると、ODR = 6666Hzまで設定できるようになります。この場合、標本化定理に基づいて、理論上は約半分の3kHz程度の振動周波数まで取り込めることになります。ただ、LSM6DSOXに内蔵されている加速度センサの帯域は標準的なものなので、1.5kHz程度が上限のようです（メカニカル特性に依存）。実使用で高速振動物を対象とする場合、“広帯域”と謳っている製品を選択した方が良いでしょう。SensorTile.boxには搭載されていませんが、[LIS25BA（2.4kHz）](https://www.st.com/ja/mems-and-sensors/lis25ba.html)や[IIS3DWB（6kHz）](https://www.st.com/ja/mems-and-sensors/iis3dwb.html)などの方が広帯域用途としては適しています。




![50_setup2_function.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/3c39fd8b-fb09-9cb9-0223-a811e39b7fb8.png)


以下は取得データとグラフです。手でブルブル動かした程度の振動だと、高周波領域のデータはほとんど取得できませんでした。


![51_excel_graph_bar2xy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/45000f60-38ee-479a-3ba0-b1c8bf78c544.png)

![51_excel_graph_bar2z.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/8d143caf-a70c-0157-cf1f-4b9f0ebf7161.png)


#### 補足


ここまで、実際のFFT演算の中身については全く触れてきませんでしたが、こちらは[“MotionXX”ライブラリ･グループ](https://www.st.com/ja/embedded-software/x-cube-mems1.html)（STM32マイクロコントローラ用に用意されている加速度センサ向けのソフトウェア･ライブラリ群）に入っている**MotionSP（Signal Processing）ライブラリ**を利用しています。MotionSPについての技術資料はあまり充実していないので、現時点で利用するのは少し難しいと感じる方もいるかもしれません。公開されているサンプル･プログラムの中にMotionSPを使っているProjectファイルもありますので、プログラミングに詳しい方はそのソースコードを見て参照･活用してみてください。

例
[X-CUBE-MEMS1](https://www.st.com/ja/embedded-software/x-cube-mems1.html#get-software)の中のVibrationMonitoringデモ
[FP-IND-PREDMNT1](https://www.st.com/ja/embedded-software/fp-ind-predmnt1.html)の中のCondition_Monitoring、Predictive_Maintenanceデモ

## 3．入力加速度センサの設定

最後に、各加速度センサの設定についてまとめてみました。
より詳細な情報を確認したい場合、各センサのデータシートを参照してください。
通常、FFT計算をする前に入力データに対してローパスフィルタをかけるべきですが、今回は省略しています。フィルタは入力のところで設定できますので、興味のある方はトライしてみてください。



|Vibrometer ACC: LSM6DSOX  |Low power mode         |High performance mode   |
|:------------:|:---------:|:--------:|
| ODR        | 1.6 / 12.5 / 52 / 104 / 208 Hz    |12.5 / 26 / 52 / 104 / 208 / 416 / 833 / 1666 / 3333 / 6666 Hz  |
| Low pass filter |No filter, 700, ODR/4, ODR/10, ..., ODR/800|No filter, ODR/2, ODR/4,..., ODR/800 |
| High pass filter  |No filter, 700, ODR/4, ODR/10,... ,ODR/800       |No filter, ODR/4, ODR/10,..., ODR/800    |
| Full scale       | 2 / 4 / 8 / 16 g         | 2 / 4 / 8 / 16 g         |


|Low power ACC: LIS2DW12          |Low power mode 1~4          |High performance mode    |
|:------------:|:---------:|:--------:|
| ODR        | 1.6 / 12.5 / 25 / 50 / 100 / 200 Hz       |12.5 / 25 / 50 / 100 / 200 / 400 / 800 / 1600 Hz   |
| Low pass filter |No filter, 3200, ODR/4, ODR/10, ODR/20|No filter, ODR/2, ODR/4, ODR/10, ODR/20|
| High pass filter     |No filter, ODR/4, ODR/10, ODR/20       |No filter, ODR/4, ODR/10, ODR/20      |
| Full scale       | 2 / 4 / 8 / 16 g         | 2 / 4 / 8 / 16 g         |

|Inclinometer ACC: LIS3DHH          |Normal mode          |
|:------------:|:---------:|
| ODR        | 1100 Hz       |
| Low pass filter |235 / 440 Hz|
| High pass filter     |None    |
| Full scale       | 2.5 g         |


以上、この記事ではカスタム･アプリを作成して振動状態FFTデータを取得してみました。
次回は音声FFTを調べてみます。
[小型IoT端末開発キット「SensorTile.box」 をセンサ・アプリで使ってみた④　音声FFT](https://qiita.com/ykawano/items/b302715ab3b7edee8036)