PAL_MOT-oneshot
PAL_MOTアクトでは連続的に加速度データを取得して都度無線送信していました。このアクトではスリープ復帰後に数サンプル加速度データを取得しそのデータを送ります。
このアクトの解説の前にPAL_MOTのアクトの解説をご覧ください。
本サンプルは、収録バージョンによって差が大きいため本ページでは2つの解説を記載します。
アクトの解説 (v2)
※ 最新のコードは「サンプルアクト>最新版の入手」を参照ください。
起床→加速度センサーの取得開始→加速度センサーのFIFO割り込み待ち→加速度センサーのデータの取り出し→無線送信→スリープという
起床→加速度センサーの取得開始→加速度センサーのFIFO割り込み待ち→加速度センサーのデータの取り出し→無線送信→スリープという流れになります。
状態変数
enum class E_STATE {
INIT = 0,
START_CAPTURE,
WAIT_CAPTURE,
REQUEST_TX,
WAIT_TX,
EXIT_NORMAL,
EXIT_FATAL
} eState;列挙体として eState 変数を宣言しています。
begin()
setup()を終了した後に呼ばれます。ここでは初回スリープを実行しています。
wakeup()
起床後は状態変数eStateを初期状態INITにセットしています。この後loop()が実行されます。
loop()
loop() の基本構造は状態変数eStateによるswitch ... case節です。eStateの初期状態はINITです。loop_moreは状態変数を書き換えた直後、loop()を抜ける前にもう一度実行したいときにtrueにセットします。
以下では各case節を解説します。eStateの初期状態はINITです。
状態INITでは、初期化(結果格納用のキューのクリア)を行います。
状態START_CAPTUREでは、MC3630センサーのFIFO取得を開始します。ここでは400Hzで4サンプル取得できた時点でFIFO割り込みが発生する設定にしています。タイムアウトのチェックのため、開始時点のシステム時刻をu32tick_captureに格納します。
状態WAIT_CAPTUREでは、FIFO割り込みを待ちます。割り込みが発生し結果格納用のキューにデータが格納されるとsns_MC3630.available()がtrueになります。
タイムアウトした場合は状態EXIT_FATALに遷移します。
状態REQUEST_TXではローカル定義関数TxReq()を呼び出し、得られたセンサーデータの処理と送信パケットの生成、そうし尿級を行います。タイムアウトのチェックのため、開始時点のシステム時刻をu32tick_txに格納します。
状態WAIT_TXでは、無線パケットの送信完了を待ちます。
タイムアウト時には状態EXIT_FATALに遷移します。
一連の動作が完了したときは状態EXIT_NORMALに遷移しローカル定義の関数sleepNow()を呼び出しスリープを実行します。またエラーを検出した場合は状態EXIT_FATALに遷移し、システムリセットを行います。
MWX_APIRET TxReq()
この関数では、センサーより得られたサンプル値の取得と、複数サンプルの平均値の計算、
取得サンプルの平均値を計算します。
X軸の最大値と最小値を計算します。
ここではイテレータとstd::minmax_element()アルゴリズムを用いて計算します。get_axis_x_iterはキューのイテレータをパラメータとして、axis_xyzt構造体の.xにアクセスするものです。
ここでキューをクリア.sns_MC3630.get_que().clear()しています。
最期にパケットの生成と送信を要求を行います。パケットには X, Y, Z 軸の加速度、X軸の最小値,Y軸の最小値を含めています。
アクトの解説 (初版)
MWSDK2020_05 版の SDK 添付のサンプルコードです。
※ 最新のコードは「サンプルアクト>最新版の入手」を参照ください。
起床→加速度センサーの取得開始→加速度センサーのFIFO割り込み待ち→加速度センサーのデータの取り出し→無線送信→スリープという流れになります。
wakeup()
起床後加速度センサーを稼働させます。
加速度センサーの結果を保存するキューの内容を抹消(.sns_MC3630.get_que().clear())しておきます。加速度センサーのサンプルの取得忘れがあったり、また停止させるまでに次のサンプルが取得したような場合を想定します。
ここで加速度センサーを都度開始します。設定は400Hz,±4G,FIFO割り込みは4サンプルとしています。4サンプルも必要ない場合は1サンプルの設定でも構いません。
loop()
このアクトでは、サンプル取得後、すぐに加速度センサーの動作を停止します。
取得サンプルの平均値を計算します。
X軸の最大値と最小値を計算します。
ここではイテレータとstd::minmax_element()アルゴリズムを用いて計算します。get_axis_x_iterはキューのイテレータをパラメータとして、axis_xyzt構造体の.xにアクセスするものです。
最後にキューをクリア.sns_MC3630.get_que().clear()しています。
最終更新