小型IoT端末開発キット「SensorTile.box」 をセンサ･アプリで使ってみた②　サンプル･アプリで試す

今回は、STのセンサ･デバイス用の汎用スマートフォン･アプリ「ST BLE Sensor」で使えるサンプル･アプリの紹介です。モーション系のセンサのアプリに焦点を当て、実際にいくつか試してみます。


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

## 1．サンプル･アプリ（Example App）全体

サンプル･アプリは以下5つのカテゴリに分けられており、各カテゴリの下にいくつかのアプリが用意されています。

+ Motion: モーション系（加速度センサ）アプリ x5
+ Environment: 環境系（温湿度 / 大気圧センサ）アプリ x1
+ Log: ログ記録アプリ x1
+ AI & MLC: AIおよび機械学習コア（MLC）アプリ x3
+ Vibration Monitor: 振動モニタ（加速度センサ＋FFT処理）アプリ x2

ST BLE Sensorアプリの最初のページから、“Create a new Application”をクリックすると、サンプル･アプリの選択ページに移動できます。

![1_examples(1)_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/f62adfff-d74d-ecb4-54df-b34f957cfc04.jpeg)

![2_examples(2)_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/b2811e40-bf1b-fe0b-f3cf-ad64acedfcf1.jpeg)




|サンプル･アプリ名             |使用センサ          |機能       |
|:---------:|:------------:|:---------:|
|Compass         |加速度 / ジャイロ / 地磁気      |コンパス（方位計）|
|Level           |加速度       |傾斜計（傾き角度を測定）|
|Pedometer        |加速度       |歩数計（身体に取り付けることで歩数を計測）|
|Sensor Fusion - Quaternion        |加速度 / ジャイロ / 地磁気 |3次元空間での向き･姿勢をクォータニオン値としてリアルタイムに出力  |
|Barometer        |温湿度 / 大気圧    |温湿度 / 大気圧を計測   |
|Data Recorder        |全て      |加速度 / ジャイロ / 地磁気 / 温湿度 / 大気圧データを本体内SDカードに記録
|Baby crying detector |マイクロフォン|音声周波数データから、組込みAIを用いて赤ちゃんの泣き声を検知|
|Human Activity recognition        |加速度     |加速度データと機械学習コア（MLC）を用いて、人間のアクティビティ（静止･走行など）を検知|
|In-Vehicle Baby Alarm        |マイクロフォン / 加速度    |泣き声検知とアクティビティ検知のコンビネーション  →  車内に赤ちゃんが置き去りにされた場合のアラーム用|
|Vibration Monitor        |加速度       |振動状態をFFTで比較|

## 2．モーション系アプリ

現在用意されているモーション系のサンプル･アプリは以下の4つです。順番に試してみましょう。

|サンプル･アプリ名 |使用センサ        |機能    |使用ライブラリ（ソフトウェア）|
|:------------:|:---------:|:--------:|:--------:|
| Compass         | 加速度 / ジャイロ / 地磁気     |コンパス      |センサ･フュージョン･ライブラリ （MotionFX）|
| Level        | 加速度      |傾斜計        |ティルト･ライブラリ（MotionTL）|
| Pedometer        | 加速度      | 歩数計        |ペドメータ･ライブラリ　（MotionPM）|
| Sensor Fusion - Quaternion  |加速度 / ジャイロ / 地磁気    |クォータニオン      |センサ･フュージョン･ライブラリ （MotionFX）|


「使用ライブラリ」列の **“MotionXX”** は、STM32マイクロコントローラ（マイコン）用に用意されている加速度センサ向けのソフトウェア･ライブラリ群です。これらを呼び出すことで簡単にアプリケーション側に近いデータを得ることができます。
MotionXXライブラリについてのドキュメント類は[「X-CUBE-MEMS1」](https://www.st.com/ja/embedded-software/x-cube-mems1.html)のページからダウンロードできます。



### 2-1．Compass（方位計）

使用センサ & ソフトウェア:

+ 加速度センサ & ジャイロセンサ: [LSM6DSOX](https://www.st.com/ja/mems-and-sensors/lsm6dsox.html)（機械学習コア内蔵MEMSモーション･センサ）
+ 地磁気センサ: [LIS2MDL](https://www.st.com/ja/mems-and-sensors/lis2mdl.html)　（補正値）
+ センサ･フュージョン･ライブラリ: [X-CUBE-MEMS1 --> MotionFX](https://www.st.com/ja/embedded-software/x-cube-mems1.html)　MotionFXを利用することで3次元空間内での向き･姿勢データを取得できます。ここではコンパスとして利用します。

SensorTile.boxがどのような姿勢に置かれていたとしても、水平面（地上面）に対する方位を算出できるように3D座標変換をしています。MotionFXを使用する際は、少なくとも3軸地磁気＋3軸加速度データ（重力方向検知用）が必要です。

用語解説
センサ･フュージョン: 
一般的に、「複数のセンサ･データを統合的に処理することで、単一のセンサからは得られない高度なデータを取得する手法」を指します。
ここでは、加速度およびジャイロセンサ、地磁気センサから収集された個別のセンサ･データをまとめて統合的に処理するアルゴリズムを指し、結果としてオリエンテーション（3次元空間での向き / 姿勢）値を得ることができます。STM32マイコン用に「MotionFX」ライブラリが用意されているので、これをプログラム内で呼び出すことで誰でも利用可能です。つまり、STM32マイコン内のソフトウェア処理によって実現しています。




#### セットアップ

以下手順でコンパス･アプリをアップロードします。

![10_compass_upload1_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/b99642f2-1713-e1f5-c1ad-ca5415b6f6ea.jpeg)


アップロード完了後に再接続するとコンパス･アプリが起動し、コンパス画像とグラフによる表示が確認できます。

![11_compass_upload2_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/d3272ca0-bfbd-1d05-2d8f-99fda9125ccf.jpeg)


#### 動作確認

SensorTile.boxを水平なテーブルに置き、1回転させた時のデータがこちら。
FDアイコンをクリックしてスマートフォン内に保存したcsvファイルを、エクセルで開いてグラフ化しています。

![12_1_compass_data_b_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/61c3ec4c-2cce-85ff-43b3-68f04d556d6d.jpeg)


この試行では、1回転に約0.8秒かかったことがわかります。
時間軸（横軸）はNode Time（SensorTile.box側のタイムスタンプ）です。

![12_2_compass_graph_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/0a90dab5-9dd9-380f-717a-4faca7b2b50a.jpeg)




##### 出力レート


実際の使用時においてコンパスを高速で動かすことはあまりないですが、csvファイル記録データから出力レートを見積もると、約50Hz（スマホがBluetooth®データを受け取った時刻 ＝ csvファイルの左列“Date”の時刻データで確認）程度になります。このレートは、アプリ編集モードでも変更できません。Node Timeは、STM32マイコンのタイマから取り出しています。このタイムスタンプと受取り時刻（Date列）を比較してみると、約125カウント＝1秒でしたので、1カウントあたり約8msと推察することができます。つまり、上記グラフの横軸（時間）は“115xxx～”となっていますが、1あたり約8msです。

またこのアプリに限らず、出力先設定が“Bluetooth経由でスマホへ”の場合（サンプル･アプリの多くはこの設定）、最終的な出力データ･レートは上限52Hzまでとしてください。FFT演算や値判定など（2次データ）を出力する場合はこの限りではないですが、センサ･データをそのまま、あるいは最大･最小値などの単純データをBluetoothで渡すような場合は注意が必要です。

入力の“vibrometer”加速度センサの設定を見てみると（EDITクリック→入力センサのギアボタンをクリック）、ODR（Output Data Rate）はデフォルトで52Hzとなっています。これは、ライブラリに入力するセンサ･データのレートです。最終的にソフトウェア処理後に出てくる“Angleデータ”の出力レートは約50Hzだったので、妥当なところでしょう。なお、入力センサのODRをデフォルト値より上げても特に変化はありませんが、入力を例えば12.5Hzに下げると、早い動きには若干追従できなくなるようです。


![13_compass_accODR_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/c876df4e-e922-3038-5176-768b8b2530e2.jpeg)




##### MotionFXライブラリのユーザ･マニュアルをチェック


マニュアルを見ると、ライブラリとしての出力レートは「100Hz推奨」と記載されています。また、入力の加速度およびジャイロセンサのデータ･レート（ODR）はこの出力レートと同じ程度（もしくはそれ以上）にする必要があります。一方、ST BLE Sensorアプリで“vibrometer”加速度センサの設定を見てみるとデフォルトで52Hzとなっているので、先ほどcsvファイルでチェックした出力レート（約50Hz）は妥当なところでしょう。将来的にソース･コードが公開されれば、詳細を確認できると思います。ちなみに、地磁気センサ「LIS2MDL」側の設定データレートは公開されていませんが、こちらは20Hz~40Hzで十分です。

##### ケースの向きと方角

SensorTile.boxが下図の向き / 方角で置かれている時、0°もしくは360°となり、角度は右回りでプラス方向に動きます。


![14_compass_direction_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/a423e78e-9356-b329-8301-3687f8a6f1fc.jpeg)


基板内のセンサ設置方向およびケース内の基板の向きを考慮すると、地磁気センサのXYZ軸はケースに対して以下のようになります。


![15_LIS2MDL_direction_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/0bed9c1a-1b09-764c-f9f1-5afb12d4ff5a.jpeg)


MotionFXは、地磁気センサの他に加速度 / ジャイロセンサも使っています。こちらの各軸については**2.4 クォータニオン**の章を参照してください。




#### 地磁気センサのCompensation（補正）

コンパス･アプリのEditページで入力項目をよく見ると、”Compensated Magnetometer”というものがあります。

Hard Iron Distortion（ハードアイアン歪み: 磁化された鉄素材材料がセンサを含む製品ユニットに使われている場合、センサの地磁気データに対してオフセットを発生させる）を補正する必要があるため、MotionFXライブラリにはこの補正機能が搭載されています。
ここでの補正対象は周辺環境の磁界ではなく、センサ自身が入っているユニット･筐体内での影響を補正するものです。8の字に回すことで、地磁気センサと一緒に回転する磁性体による影響を補正します。

MotionFXを使用する場合、地磁気データについてはそのまま“Magnetic field sensor”を入れるのではなく、この”Compensated Magnetometer”を選択する必要があります（ソフトウェア設計上の仕様）。しかし、デフォルトではユーザ側で”Compensated Magnetometer”を入力センサとして選択できない（今のところ選択肢の中に用意されていない）ため、使いたい場合は自分で作成する必要があります。作り方の詳細については、次回以降のカスタム･アプリ作成記事で解説する予定です。


![16_magcomp_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/baa33771-4c44-4b53-aafe-a6aae6f4ecb7.jpeg)


最後に入出力と使用関数を見てみます。


![17_compass_edit_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/53b8dc61-bfa8-3a4f-88f8-ca4a30fd6255.jpeg)

　



### 2-2．Level（傾斜計）


使用センサ & ソフトウェア:
　加速度センサ: [LIS3DHH](https://www.st.com/ja/mems-and-sensors/lis3dhh.html)
　ティルト･ライブラリ: [X-CUBE-MEMS1 --> MotionTL](https://www.st.com/ja/embedded-software/x-cube-mems1.html)


#### セットアップ

以下手順でレベル･アプリをアップロードします。

![20_level_upload_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/c313a42f-92a9-5aee-8cf5-c4d8b0971fdf.jpeg)

#### 動作確認


アップロード完了後に再接続するとレベル･アプリが起動し、画像とグラフによる表示が確認できます。
グラフを見るとgreen（Roll）とred（Pitch）のプロットが有効になっているため、2軸での測定です。
重力方向軸に対しての回転を示すBlue（Yaw）は無効になっています（ゼロ値）。

![21_level_run_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/23640b2e-d76b-f5ee-31a1-e7c02744bfbe.jpeg)

![22_level_run_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/160049da-0408-a5e1-5dcc-540d30477450.jpeg)


記録データの出力レートを見ると、コンパスと同様に約50Hz（Node Time = “SensorTile.box側のタイムスタンプ”で確認）。このレートは、アプリ編集モードでも変更できません。


![23_level_csv_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/2eed74da-0f99-4981-fe32-35743f9ebdf5.jpeg)


csvファイルをグラフ化すると、以下のようになります。
グラフを見ると0.05度程度の分解能データが出力されており、わずかな傾きでも検出できることがわかります。


![24_yaw_roll_pitch_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/2d56b5bb-b539-46de-c394-a3ce0067558b.jpeg)



基板内のセンサ設置方向およびケース内の基板の向きを考慮すると、加速度センサのXYZ軸はケースに対して下図のようになります。レベル･アプリを使う際には、それぞれX軸 = Roll、Y軸 = Pitch、Z軸 = Yawになります。
温度特性の改善と実装ストレスの影響低減のため、大きなセラミック･パッケージ（5mm x 5mm）に封止されています。




![25_level_device_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/76bef5a5-a051-ff1b-73c1-f40e25730665.jpeg)



（参考情報）
MotionTLのアプリケーション･ノートを見ると、加速度センサの設定フル･スケールが小さいほど（1g以上）、より細かい分解能を得られることがわかります。レベル･アプリで使われている加速度センサ[「LIS3DHH」](https://www.st.com/ja/mems-and-sensors/lis2dw12.html)のフル･スケールは± 2.5gで固定されていますが、一般的に± 2g～± 100g以上まで選択できる加速度センサも存在します。細かい分解能が必要な場合には、小さいフル･スケール幅のデバイスを選択することをおすすめします。また、LIS3DHHの出力データは16bitです。12bitや10bitの製品と比べると1digitあたりの加速度データはより細かいため、高精度の角度検出に適しています。

試しに、SensorTile.boxの端に紙片を挟んでみました。出力データを調べると、Roll角が約0.2度変化していたので、外観ではほとんど判別できない差分も検知できるようです。




![26_Graph_wPaper_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/9aaf742f-6c93-9336-5a6e-be4c4e2ce1be.jpeg)



最後に入出力と使用関数を見てみます。



![27_level_edit_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/34ec2bf6-9cc2-0025-6c5b-6b7332553a0e.jpeg)







### 2-3．Pedometer（歩数計）

使用センサ & ソフトウェア:
　加速度センサ: [LSM6DSOX](https://www.st.com/ja/mems-and-sensors/lsm6dsox.html)
　ペドメータ･ライブラリ: [X-CUBE-MEMS1 --> MotionPM](https://www.st.com/ja/embedded-software/x-cube-mems1.html)


#### セットアップ

以下手順でペドメータ･アプリをアップロードします。


![30_pedo_upload_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/734ca097-6c42-8b98-f91e-f8e5470e6eaa.jpeg)


取り付けるポジションは、デフォルト設定では腰ベルトあたり。Function編集モードで“Wrist”を選ぶと、手首に取り付けて計測することもできます。

#### 動作確認

アプリからSensorTile.boxへBluetooth接続すると、すぐにカウント状態になります。
接続中はカウント数を保持し、接続を解除するとクリアされます。



![31_pedo_run_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/da188a46-3cc2-66a8-e09d-e0481dd65d9c.jpeg)

データを見ると、1秒ごとに合計歩数とペースがログされています。


![32_pedo_graph_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/5d6a57f6-ea69-e397-6cdd-e7398bbe9899.jpeg)


入出力と使用関数を見てみます。LSM6DSOXを入力として使用していますが、加速度データのみを利用しています。




![33_pedo_edit_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/aeb4bd78-e854-b389-2a71-60b71ea2faae.jpeg)



### 2-4．クォータニオン（オリエンテーション）
使用センサ & ソフトウェア:
　加速度センサ & ジャイロセンサ: [LSM6DSOX](https://www.st.com/ja/mems-and-sensors/lsm6dsox.html)
　地磁気センサ: [LIS2MDL](https://www.st.com/ja/mems-and-sensors/lis2mdl.html)　（補正値）
　センサ･フュージョン･ライブラリ: [X-CUBE-MEMS1 --> MotionFX](https://www.st.com/ja/embedded-software/x-cube-mems1.html)

3次元空間での姿勢･向きをクォータニオン（4元数）で出力します。
アプリ画面では、サイコロ図でどの向きを向いているかを示します。


#### セットアップ

以下の手順でクォータニオン･アプリをアップロードします。


![40_SFusion_upload_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/3c7766f2-a78f-9a51-35b5-57f01f60e3fc.jpeg)

#### 動作確認

アプリからSensorTile.boxへBluetooth接続すると、すぐに動作状態になります。
動作前にまずは地磁気センサ･データへの補正を行います。


![41_SFusion_calibration_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/ebc020bf-7294-48c6-4160-9640aea4e2f2.jpeg)


必要に応じてRESETをクリックすると、初期画面状態をリセットできます。
SensorTile.boxを3次元的にクルクル動かすと、スマホ画面上のサイコロ図も動きに連動して回転します。画面スワイプでグラフ表示も見ることができます。


![42_SFusion_run_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/955b2610-6b80-09bb-4490-0967db0d90e1.jpeg)


基板内のセンサ設置方向およびケース内の基板の向きを考慮すると、加速度センサの各XYZ軸はケースに対して以下ようになります。


![43_SFusion_LSM6DSOX_direction_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/f5619425-5a67-8ac0-86db-84592f74db02.jpeg)


入出力と使用関数を見てみます。コンパス･アプリと同じくMotionFXを使っているので、入力設定は同じです。


![44_SFusion_edit_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/43d258d6-19f6-9912-9dad-9dd5aa64e51f.jpeg)




#### 入力センサの設定変更

これまでの説明にでてきたアプリ編集ページ（EDITクリック）では、各入力センサの設定変更が可能です。右横にギアボタンがある場合、クリックすると各設定ページに移動できます。LSM6DSOXの場合、ODR（Output Data Rate）などの設定を変更できますが、これまでに紹介したサンプル･アプリでは基本的に変更不要です。



（参考情報）
IMU ACCELERTOMETERの設定ページでは、パワー･モードとして“Low power”と“High performance”を選べます。このモード設定は、ODRの選択範囲、消費電流、およびデータに含まれるノイズ量に影響します。“Low power”の場合、ODRは1.6Hz~208Hzまで、“High performance”の場合12.5Hz~6.6kHzまでそれぞれ選択可能です。当然ODRが低い方が低消費電力で動作するので、バッテリ駆動の場合は出来る限り低ODRで動作させた方がいいでしょう。ちなみに、センサの出力データ･レートを上げたとしても（EDIT→編集モードから変更可能）、アプリ側の出力レート（スマホが受け取る時のデータレート）は固定になっているので、今回のアプリを使う限りでは特に影響しません。また、データに含まれるノイズ量は消費電流とトレードオフの関係になっており、“High performance”で動作させた方がノイズ量は少なくなります。詳細についてはデータシートを確認してみてください。







## 3．その他のサンプル･アプリ

その他のサンプル･アプリを簡単に紹介します。

### 3-1．Data recorder

内蔵SD Flashメモリに主なセンサ･データを保存したい時に使用します。スマートフォン側にはデータ送信されません。
加速度データとジャイロデータ、温湿度 / 大気圧データが記録されます。記録後、SD Loggingアプリを一度終了してBluetooth接続を解除してください。SensorTile.boxをPCに接続（USBメモリとして認識）するとデータ･ファイルを確認できます。

ログファイル名は”output.csv”です。



![50_SDlog_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360475/d4e82ee0-9880-4686-9050-f093027a7585.jpeg)


データのタイムスタンプを見ると、1秒間に104個程度記録されていました。デフォルトでは、加速度センサとジャイロセンサの設定ODRが104Hzで一番速いので、全体がこの出力レートになっています。温湿度や大気圧データについては、このレートで記録してもあまり意味がないので、実際に使う場合は入力項目を目的に応じて選択しましょう。その際ODRも適切に設定してください。
なお、加速度センサとジャイロセンサのODRが異なる場合、csvファイル作成時のデータフォーマットが崩れる可能性があるため、同じODRを設定してください。


### 3-2．Vibration Monitor

振動状態をFFTで比較します。例えば、ある正常時の振動をFFT記録してこれをマスタとして保存し、次に運用時の状態をFFT演算して比較します。各周波数ポイントでスレッショルド（しきい値）を越えているかどうかをチェックします。
ひととおり試してみたところ私の方では正しい使用方法がつかめませんでした。振動FFTについては別の記事でまたチャレンジしますので、ここでは簡単に概要のみ説明します。

+ Vibration Monitor Training: マスタ状態記録
+ Vibration Monitor Compare: 比較実行

2つのアプリが用意されており、最初にVibration Monitor Trainingアプリを使ってマスタ･データ（基準用データ）を保存し、次にVibration Monitor Compareアプリで比較します。
ここでの加速度センサのデフォルトODRは6666Hzなので、約3kHz程度までの振動FFTが対象になります。
Trainingアプリで記録後、以下ファイルがSDカード内に保存されます。

“gold_vibration_pattern.csv”

Compareアプリは、この名前のファイルが本体SDカード内に入っていないと正しく動きません。複数回記録するとファイル名にSafixを自動追加して保存されるので、パソコンでファイル名をRenameなどして比較対象のファイルを必ず“gold_vibration_pattern.csv”にしておく必要があります。




以上、今回の記事ではサンプル･アプリを紹介しました。
長くなりましたので続きは次回へ。
[小型IoT端末開発キット「SensorTile.box」 をセンサ･アプリで使ってみた③　振動FFT](https://qiita.com/ykawano/items/e45390b235e9f54d4ea8)