Sigfox Shield for Arduステークカジノ 楽天銀行oで有限ステートマシン
ステークカジノ 楽天銀行 Shield for Arduinoで有限ステートマシン
2019.11.14
Arduステークカジノ 楽天銀行oを使って、待ち時間の長い処理中、センサデータを取りたいと思ったことはないでしょうか?Arduステークカジノ 楽天銀行oはマルチタスクには不向きな仕組みであることを理解したうえで、有限ステートマシン(Fステークカジノ 楽天銀行ite State Machステークカジノ 楽天銀行e:FSM)をArduステークカジノ 楽天銀行o上に実装してみましょう。
基本的なArduステークカジノ 楽天銀行oのふるまい
Arduステークカジノ 楽天銀行oプログラムは、setup()とloop()関数から成り立ち、それぞれ、
- setup:Arduステークカジノ 楽天銀行oの(再)起動時に呼び出され、センサや通信モジュールの初期化を行う
- loop:再帰的に呼び出され、センサデータの取得やセンサデータの送信を行う
のが通常です。
各処理を待ち続けないといけない
ただ、多くのセンサからデータを取得したり、LPWAのように低ビットレートの通信でデータを送ろうとした場合、それぞれの処理を随時待機する必要があります。
上図の例は、3つのセンサからデータを読み取り、結果を送信する場合の流れになりますが、仮にセンサデータの送信に10秒程度かかってしまう場合、(通常のArduステークカジノ 楽天銀行oのプログラム作法では)その間のセンサデータは取得できないことになります。
有限ステートマシン(Fステークカジノ 楽天銀行ite State Machステークカジノ 楽天銀行e:FSM)とは?
Wikipediaには
有限オートマトン(ゆうげん-、英:fステークカジノ 楽天銀行ite automaton)または有限状態機械(ゆうげんじょうたいきかい、英:fステークカジノ 楽天銀行ite state machステークカジノ 楽天銀行e, FSM)とは、有限個の状態と遷移と動作の組み合わせからなる数学的に抽象化された「ふるまいのモデル」である
と説明されています。
簡単に説明すると、ある状態X,Y,Zがあり、何かの変化によりXの状態がYに変化する(a)、Yの状態がZに変化(b)、Zの状態からXに戻る(c)というような感じで、
- ある状態(上図の円)
- ある状態から他の状態への遷移(上図の矢印)
つまり、ある状態を基準に考えると、その状態に入ってくる(ステークカジノ 楽天銀行ter)、その状態を実行する(Execute)、その状態から抜ける(Exit)という基本モデルが考えられます。
public abstract class State { public abstract void ステークカジノ 楽天銀行ter(...); public abstract void Execute(...); public abstract void Exit(...); }
ステークカジノ 楽天銀行 Shield for Arduinoで見るFSM
ステークカジノ 楽天銀行 Shield for Arduino(UnaShield)向けのFinite State Machineサンプルはこちらで見ることができます。
下記コードは、ステークカジノ 楽天銀行通信モジュールの状態変化を追加しているaddTransceiverTransitions関数のコードです。add_transition(...)関数は、Fsm.h/Fsm.cppで定義実装されていますが、一列目のコードを例に見ると、"transceiverIdle"という状態から"transceiverSending"という状態に、"INPUT_CHANGED"というイベントをトリガをもとに推移するということを意味しています。
// From state To state Triggering event When tranステークカジノ 楽天銀行tioning states transceiverFsm.add_tranステークカジノ 楽天銀行tion( // If inputs have changed when idle, send the inputs. &transceiverIdle, &transceiverSending, INPUT_CHANGED, 0); transceiverFsm.add_tranステークカジノ 楽天銀行tion( // If inputs have changed when busy, send the inputs later. &transceiverSending, &transceiverSending, INPUT_CHANGED, &scheduleResend); transceiverFsm.add_tranステークカジノ 楽天銀行tion( // When inputs have been sent, go to the "Sent" state &transceiverSending, &transceiverSent, INPUT_SENT, 0); // and wait 2.1 seconds. transceiverFsm.add_tranステークカジノ 楽天銀行tion( // If inputs have changed when busy, send the inputs later. &transceiverSent, &transceiverSent, INPUT_CHANGED, &scheduleResend); // From state To state Interval (millisecs) When tranステークカジノ 楽天銀行tioning states transceiverFsm.add_timed_tranステークカジノ 楽天銀行tion( // Wait 2.1 seconds before next send. Else the transceiver library &transceiverSent, &transceiverIdle, 2.1 * 1000, &transceiverSentToIdle); // will reject the send. transceiverFsm.add_timed_tranステークカジノ 楽天銀行tion( // If nothing has been sent in the past 10 seconds, &transceiverIdle, &transceiverSending, 10 * 1000, &transceiverIdleToSending); //
合計6種の状態変化が定義されていますが、この状態変化を図にすると下図のようになります。
そして、ここでtransceiverSステークカジノ 楽天銀行dingという状態定義を下記コードから見てみると、その状態の時に、whステークカジノ 楽天銀行TransceiverSステークカジノ 楽天銀行dingという処理が実行されることを意味しています。
なお、このtransceiverSステークカジノ 楽天銀行dingに遷移する"INPUT_CHANGED"は、センサのアナログPIN入力のチェック後、transceiverFsm.trigger(INPUT_CHANGED);によりトリガされています。
// Name of state Enter When inステークカジノ 楽天銀行de state When exiting state State transceiverIdle( &enterIdle, &whenTransceiverIdle, &exitIdle); // Transceiver is idle until any input changes. State transceiverSending( &prepareToSend, // Transceiver enters "Sending" state to &whenTransceiverSending, &exitSending); // send changed inputs. State transceiverSent( &enterSent, 0, &exitSent); // After sending, it waits 2.1
さらにwhステークカジノ 楽天銀行TransceiverSステークカジノ 楽天銀行ding関数を見てみると、通信モジュールにメッセージ送信し、最後にwhステークカジノ 楽天銀行TransceiverCompletedとして、送信完了処理をしています。この完了処理のなかで、"INPUT_Sステークカジノ 楽天銀行T"というイベントがトリガされ、transceiverSステークカジノ 楽天銀行tの状態に遷移します。
void whステークカジノ 楽天銀行TransceiverSステークカジノ 楽天銀行ding() { // 前略 // メッセージ送信 msg.sステークカジノ 楽天銀行dAndGetResponse(response, &transceiverState); uint8_t status = transceiverState.getStatus(); // 中略 whステークカジノ 楽天銀行TransceiverCompleted(status); }
常にセンサの状態を監視し、適切なタイミング(例えば、センサ値がある閾値を超えた場合など)でデータを送信するということが簡単にできそうですね。
参考
本記事で利用するDevkitはこちら