センサーイベント発生!そんな時だけネットワークへ参加できるBLINKモード

SmartMeshには、ある特定のイベントが発生した場合だけネットワークに参加するという機能があります。それが、「Blinkモード」です。今回は、通常のMoteとBlinkモードに設定されたMoteの違いを試してみます。

▼目次

SmartMeshのステートマシン

Blinkモードの説明の前に、SmartMeshのステートマシンを簡単に説明します。SmartMeshのMoteは、内部的にMasterモードとSlaveモードの2つのモードがあります。今回は、Masterモードで動かしています。

SmartMeshの各ステート

SmartMeshは、Masterモードに設定されていると、ネットワークへの接続は自動で行うようにできています。使用する際には、あまり意識する必要はないかもしれないのですが、SmartMeshのMoteがどのような状態であるかを知ることは、実際にノードを設置した時に役に立ちます。ここでは、ネットワークへの接続・切断時におけるMoteの状態について簡単に説明します。

電源投入時

Moteの電源投入時は、「IDLE」という状態にあります。その後、「Search」になり、接続するネットワークを探します。ネットワークを見つけると、下記の3つの状態を遷移しネットワークへ参加します。

  • 「Joining」ネットワークへ参加要求。
  • 「Connect」ネットワークへ接続する。
  • 「Active」ネットワークへ参加する。

ネットワークへ参加すると、「Operational」になり、データ通信を始めることができます(図1)。

図図1:IDLEからOperationalステートへの遷移

電源が切断およびネットワークがリセットされた時

電源が切断された場合や、ネットワークから切り離された場合は、「Lost」になり、「IDLE」に戻ります(図2)。

  • 「Lost」「Operational」から「IDLE」へ移行します。

図図2:OperationalからIDLEへの遷移

Moteのステート確認方法

Moteのステートを確認する方法は、シリアル接続されたCLI(Command Line Interface)を使用します。図3はネットワークに接続する前の状態です。この時点では、まだネットワークへの接続をしている段階です。Moteの状態を見るには、minfoコマンドで確認することができます。

図図3:CLIでSearch, Connect、Activeのログ出力

ネットワークに参加すると、Moteは「Operational」になります。minfoコマンドでは、「Oper」となっています(図4)。

図図4:Operationalとして、ネットワークに参加してます。

「Operational」は、インフラストラクチャーモードとも呼ばれており、Meshネットワークでは常にオンラインのMoteとして動作します。

アプリケーション上のヒント

実際のIoTノードとして運用するには、比較的頻度の高いネットワーク監視が必要なノードとして利用するのに向いています。

Blinkモードとは?

では、Blinkモードについて説明します。Blinkモードは、インフラストラクチャーモードとは違い、ネットワークには参加しているが、必要な場合のみ参加するMoteです。

Blinkモードの特徴

Blinkモードの特徴は4つあります。

  • 低消費電力での運用
  • 極めて低いレイテンシー
  • 最大500,000ノードを設置可能
  • MoteからManagerにのみの片方向通信

そのため、IoTのセンサーアプリケーションでは、突発的な変化を通知するアラーム的な装置や、通信頻度の低い運用に向いています。データ送信量は、通常のMoteと同じです。

Blinkモードのステート

SmartMeshのネットワークにおいて、Blinkモードに設定されたMoteの状態をみてみましょう。電源ON時の初期動作は、Masterモードに設定されています。

「Blink」モードでは、「IDLE」や「Operational」のような状態が変化することはありません。常に「Blink」状態です(図5)。

図図5:CLIでBlinkモードになっていることを確認

Blinkモードでは、JoiningやConnectなどの接続プロセスが不要なので、極めて低いレイテンシーを実現できるようになっています。

Blinkモードを活用する

今回もVManagerの環境で、BlinkモードのMoteがどのようなデータを送信しているのかを、ログ出力で確認してみます。

Blinkモードの状態を確かめてみる

前回同様、VManagerへはSSHでログインして、consoleから確認します。

参加しているMoteを確認するために、smコマンドを入れてみます(図6)。

図図6:smコマンドで、Moteの確認

このログからは、AP Mote(Manager)は1台で、Motesも1台となっています。ですが、有効なMotesがあることを示すLiveが2となっていることが確認できます。そのうちの1台がBlinkに設定されているということが読み取ることができます。

ちなみにもう1台Moteを追加してみた場合のログです(図7)。

図図7:Live:3を確認

Blinkモードのデータ

Blinkモードのデータを確認するには、コンソールのコマンドにtrace data onと入力します。

図図8:Blinkモードのデータ

赤い枠で囲ったところが、Blinkモードからのデータです。緑色の枠で囲ったところにlatencyが記載されています。ここでは、latency: 0msになっていることがわかります。通常のMoteに比べると極めて早い接続でデータを送出していることが読み取れます。

低レイテンシーのしくみ

低いレイテンシーは、Blinkモードは「コネクションプロセスがない」ということが大きな特徴です。その代わりに、ManagerからBlinkモードになっているMoteへのデータはできないプロトコルになっています。

BlinkモードのMoteをビルドする

ここまでは、BlinkモードにしたMoteの動きについて解説してきました。ここからは、Blinkモードにするためのビルド方法について解説します。

ocsdkをダウンロードしよう

MoteをBlinkモードにするためには、ファームウェア(実際には、アプリケーション部分)を書き換える必要があります。まずは、2つのファイルをダウンロードします。

1)ocsdkをダウンロード(@GitHub)

ocsdkのSource code

2)SmartMeshのバイナリ SmartMesh_IP.zip

SmartMeshのバイナリ

ocsdkを展開すると、図9のような構成になっています。

図図9:ocsdkのフォルダ構成

開発環境は、EWARM

開発環境は、IAR Systems社の「Embedded Workbench for Arm」を使用します。ocsdkのコードサイズが大きいので、実験するのであれば30日限定バージョンがオススメです。

IAR Systems Embedded Workbench for Arm

SmartMeshのライブラリをコピーする

SmartMesh IPのファイルには、ocsdkで必要となるinclibが含まれています。このファイルをocsdkのsrcフォルダにコピーする必要があります(図10)。

図図10:incとlibをsrc下のディレクトリへコピー

SmartMeshのblinkサンプルコードを読み込む

ocsdkのファイルには、30種類を超えるサンプルが用意されています。その中で、all_projects.ewwというファイルを選択します。プロジェクトサンプルを選択します。

図図11:all_projects.ewwをダブルクリック

IAR Embedded Workbench for Arm上に、SmartMeshの全プロジェクトサンプルが読み込まれたところ。

図図12:all_projects.ewwを読み込んだ状態

一覧のタブから01-blinkのタブをクリックすると、Blinkプロジェクトファイルにフォーカスされます。

図図13:Blinkプロジェクトファイルを選択

ファイルをちょっと改造してみる

図13にBlinkプロジェクトのファイル中にあるpayload部分は、少し手を入れた箇所になります(図14)。元々は、1からインクリメントした値がpayloadに入っているんですが、データを書き換えています。

図図14:payload部分の書き換え

また、dnm_loc_blinkPayload関数にpayload[]が書き込まれています。あくまでも、データ部分を書き換えているだけなので、大きな変更はしていませんが、VManagerのログ画面にもそれは表示されている様子がわかります。見つけられますか?

図図15:書き換えたpayloadのログ出力

ビルドしたデータをバイナリ変換

IAR Embedded Workbench for Armでビルドが成功すると、01-blink¥Debug¥Exeディレクトリに、ocfdk_01_blink.outファイルが出来上がります。

図図16:ビルドしたBlinkモードのElfファイル(拡張子は.outです)

ビルドした後は、バイナリ変換する必要があります。

ツール内に、バイナリ変換んするメニューはありますが、そのままではSmartMeshで使うことができません。バイナリのヘッダ部分のCRCチェックアルゴリズムが異なるためです。そこで、ocsdkには、バイナリ変換を行うためのPython scriptdustElfToBon.pyが用意されています。

dustElfToBin.pyを使う

dustElfToBin.pyを使うには、事前にPython2.7.x系のインストールが必要です。プロジェクトファイルには、ビルドが終わった後に、dustElfToBin.pyを実行するように組み込まれています。

Pythonのインストール関係は、こちらを参考にしてください。

dustElfToBinを実行すると、SmartMesh用のバイナリファイルができます(図17)。

図図17:SmartMesh用のBINファイルが生成された

変換されたバイナリファイルocfdk_01_blink.binができました。

Pythonスクリプトがうまく動かせない場合

Pythonスクリプトがうまく動かせないケースもあるかもしれません。そんな時は、使用環境のパスや環境変数を見直してみてください。

参考資料

Moteにファームウェアを書き込む

ファームウェアの書き換え方法は、前回AP Moteに変更した時と同じ手順で実行することができます。espフォルダに集めておくと簡単です。

書き込むファイル

Moteに書き込むファイルは、以下の4つです。

FuseTables

MoteのFuseTableは、WO_D603679_内のFT-LTP5902-IPMA-M4-115K-680-0241-003REV1.binを使用します。Eternaフォルダ内のFuseTablesからコピーしてきてください。

Mote

Moteのパーティション情報は、rev_1_4_1内のmote_part_r52074.binを使用します。Eternaフォルダ内のMoteからコピーしてきてください。

loader

Moteのローダ情報は、loader_1_0_6_4_oski.binを使用します。同じくEternaフォルダ内のMoteにあります。

Application

Applicationは、今回作成したocfdk_01_blink.binを使用します。今回は、Moteのアプリケーション部分を書き換えるため、このようなバッチファイルを使って、ファームウェアを更新するといいでしょう。

実際に書き換える部分は、esp -P ocfdk_01_blink.bin 1000です。

Moteのアプリケーションを書き込むバッチファイルの記述例

echo off

echo " ========== Erasing AP Mote"
esp -E

echo " ==========  Programming Fuse Table"
echo " "
esp -P FT-LTP5902-IPMA-M4-115K-680-0241-0003REV1.bin 0

echo " "
echo " ==========  Programming Partition Table"
echo " "
esp -P mote_part_r52074.bin 800

echo " ==========  Programming AP Mote code"
echo " "
esp -P ocfdk_01_blink.bin 1000

echo " ==========  Programming Loader"
echo " "
esp -P loader_1_0_6_4_oski.bin 77800
					

Moteを戻したい場合

Moteに入っていたアプリケーションに戻したい場合は、Moteフォルダのmote_ip_1_4_1_8_oski.binをアプリケーションのセクションで使用してください。

まとめ

いかがでしたか?細かい手順などいろいろ解説しましたが、Moteの状態やアプリケーション部のビルド方法など、どれも実用的な内容で解説しました。Blinkモードは、SmartMeshとしての難しい動作は特にないですが、アラート通知のようなセンサーや、データの書き換え部分など、どのように実装していけばいいか理解できれば、様々なセンサーに応用できます。低消費電力で動かせるSmartMeshを是非お試しください。

SmartMeshの評価キットDC9021Bは、すぐにIoTセンサーネットワークが構築できます。今回紹介したSmartMeshのBLINKモードは、5Gのグラントフリーと同じコンセプト。アナログ・デバイセズのSmartMeshで、簡単IoTセンサーネットワークを構築してください!