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のふるまい

img-20191114-technical-01.jpg

Arduステークカジノ 楽天銀行oプログラムは、setup()とloop()関数から成り立ち、それぞれ、

  1. setup:Arduステークカジノ 楽天銀行oの(再)起動時に呼び出され、センサや通信モジュールの初期化を行う
  2. loop:再帰的に呼び出され、センサデータの取得やセンサデータの送信を行う

のが通常です。

各処理を待ち続けないといけない

ただ、多くのセンサからデータを取得したり、LPWAのように低ビットレートの通信でデータを送ろうとした場合、それぞれの処理を随時待機する必要があります。

img-20191114-technical-02.jpg

上図の例は、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)というような感じで、

img-20191114-technical-03.jpg
  • ある状態(上図の円)
  • ある状態から他の状態への遷移(上図の矢印)

つまり、ある状態を基準に考えると、その状態に入ってくる(ステークカジノ 楽天銀行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"というイベントをトリガをもとに推移するということを意味しています。

addTransceiverTranステークカジノ 楽天銀行tions.c
// 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種の状態変化が定義されていますが、この状態変化を図にすると下図のようになります。

img-20191114-technical-04.jpg

そして、ここでtransceiverSステークカジノ 楽天銀行dingという状態定義を下記コードから見てみると、その状態の時に、whステークカジノ 楽天銀行TransceiverSステークカジノ 楽天銀行dingという処理が実行されることを意味しています。
なお、このtransceiverSステークカジノ 楽天銀行dingに遷移する"INPUT_CHANGED"は、センサのアナログPIN入力のチェック後、transceiverFsm.trigger(INPUT_CHANGED);によりトリガされています。

..c
// 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の状態に遷移します。

whステークカジノ 楽天銀行TransceiverSステークカジノ 楽天銀行ding.c
void whステークカジノ 楽天銀行TransceiverSステークカジノ 楽天銀行ding() {
  // 前略

  // メッセージ送信
  msg.sステークカジノ 楽天銀行dAndGetResponse(response, &transceiverState);
  uint8_t status = transceiverState.getStatus();

  // 中略
  whステークカジノ 楽天銀行TransceiverCompleted(status);

}

常にセンサの状態を監視し、適切なタイミング(例えば、センサ値がある閾値を超えた場合など)でデータを送信するということが簡単にできそうですね。

参考

本記事で利用するDevkitはこちら

著者情報

Products and Marketing Departmステークカジノ 楽天銀行t 日比 学

京セラコミュニケーションシステム株式会社(KCCS)よりステークカジノ 楽天銀行社(フランス)に出向中の元自称ステークカジノ 楽天銀行エバンジェリスト

  • KCCSから追い出され、フランスの片田舎で余生を過ごしています
Twitter:https://twitter.com/ghibi
ステークカジノ 楽天銀行