すべてのモノが「つながる」新たな未来へ。FSM)をArduino上に実装してみましょう。基本的なArduinoのふるまいArduinoプログラムは、setup()とloop()関数から成り立ち、それぞれ、setup:Arduinoの(再)起動時に呼び出され、センサや通信モジュールの初期化を行うloop:再帰的に呼び出され、センサデータの取得やセンサデータの送信を行うのが通常です。各処理を待ち続けないといけないただ、多くのセンサからデータを取得したり、LPWAのように低ビットレートの通信でデータを送ろうとした場合、それぞれの処理を随時待機する必要があります。上図の例は、3つのセンサからデータを読み取り、結果を送信する場合の流れになりますが、仮にセンサデータの送信に10秒程度かかってしまう場合、(通常のArduinoのプログラム作法では)その間のセンサデータは取得できないことになります。FSM)とは、有限個の状態と遷移と動作の組み合わせからなる数学的に抽象化された「ふるまいのモデル」であると説明されています。簡単に説明すると、ある状態X,Y,Zがあり、何かの変化によりXの状態がYに変化する(a)、Yの状態がZに変化(b)、Zの状態からXに戻る(c)というような感じで、ある状態(上図の円)ある状態から他の状態への遷移(上図の矢印)つまり、ある状態を基準に考えると、その状態に入ってくる(Enter)、その状態を実行する(Execute)、その状態から抜ける(Exit)という基本モデルが考えられます。Machineサンプルはこちらで見ることができます。下記コードは、Sigfox通信モジュールの状態変化を追加しているaddTransceiverTransitions関数のコードです。add_transition(...)関数は、Fsm.h/Fsm.cppで定義実装されていますが、一列目のコードを例に見ると、"transceiverIdle"という状態から"transceiverSending"という状態に、"INPUT_CHANGED"というイベントをトリガをもとに推移するということを意味しています。//合計6種の状態変化が定義されていますが、この状態変化を図にすると下図のようになります。ここでtransceiverSendingという状態定義を下記コードから見てみると、その状態の時に、whenTransceiverSendingという処理が実行されることを意味しています。このtransceiverSendingに遷移する"INPUT_CHANGED"は、センサのアナログPIN入力のチェック後、transceiverFsm.trigger(INPUT_CHANGED);によりトリガされています。2.1さらにwhenTransceiverSending関数を見てみると、通信モジュールにメッセージ送信し、最後にwhenTransceiverCompletedとして、送信完了処理をしています。この完了処理のなかで、"INPUT_SENT"というイベントがトリガされ、transceiverSentの状態に遷移します。whenTransceiverCompleted(status);}常にセンサの状態を監視し、適切なタイミング(例えば、センサ値がある閾値を超えた場合など)でデータを送信するということが簡単にできそうですね。サイトマップ当サイトについてJPENKCCSは京セラコミュニケーションシステム株式会社の略称です。記載の会社名および製品名・サービス名は、それぞれ各社の商標または登録商標です。