はじめに
第11回連載「ブラウザーでできる!振動計測ソリューションをクラウドアプリにしてみよう」では、「振動計測ソリューション」で紹介されているMEMS加速度センサー(ADXL1002)とデータ処理を行うARM Cortex M4マイコン(EV-COG-AD4050LZ、以下マイコン開発ボードと記載します)を使用した振動計測アプリケーションをクラウドアプリ化することができました。
今回はさらに応用編として、この振動計測アプリケーションをスマホで遠隔監視もできるようにしてみましょう。スマホアプリの作成も「conect+(コネクトプラス)」を利用して、こちらもブラウザーだけでスマホアプリを用意してみましょう。
今回は2回の記事に分けて紹介します。まず本記事では、第11回記事で用意した内容を改変して、「CANDY RED™」や「CANDY EGG™」を使って「conect+」に接続できるようにします。さらに次回は、「conect+」を操作してIoTスマホアプリを完成させるところまでを紹介します。
本記事は、第11回記事の内容が実現できていることが前提となり、具体的な手順については第11回記事との差分を中心に紹介します。
今回作成するアプリケーションの全体的なイメージは、次の図の通りです。
クラウド側の構成は第11回記事とほぼ同じですが、遠隔監視状態をスマホで表示するアプリを用意するため「conect+」との連携が追加されています。
今回使用するクラウドは2種類あります。1つは、Node-REDベースのフローエディターをクラウドで利用できる「CANDY EGG」です。このサービスでは、Webサイトからの申し込みだけで、環境がセットアップされ利用できるようになります。
今回は、クラウドの申し込みの方法については割愛していますが、第10回記事「ブラウザーでできる!IoTクラウドアプリを作ろう」にて申し込み方法についても言及していますのでご覧ください。また、クラウドサービス「CANDY EGG」では2週間の無償トライアルが可能ですから、本記事を参考に実際に動かしてみてください。
もう1つのクラウドサービスはスマホのIoTアプリをノンプログラミングで作成できる「conect+」です。こちらもAmazon経由で30日無料体験版を購入するといった方法ですぐに始めることができますので、本記事を参考にお試しいただけます(Amazonを利用した30日無料体験版の購入方法は、conect+ Webサイト上の記事「IoTアプリ「conect+」をAmazon SaaSストアで買ってみた」に解説されています)。
クラウドやRaspberry Pi側で動作するアプリケーションを作成する際に使用するツール「CANDY RED」や「CANDY EGG」は、オープンソース製品「Node-RED」をベースにしています。今回の記事でも、Node-REDの詳細がわからなくても読み進められるようにしていますが、もしNode-REDの詳細を知りたい場合は、日本のNode-REDユーザーグループが出している緑の表紙の「はじめてのNode‐RED (I・O BOOKS)【改訂版】」(工学社刊)をオススメします(赤い表紙の書籍は旧版ですので緑の表紙の新版をお探しください)。
準備するもの
ハードウェア
第11回記事と同様ですが、今回はピックアップタイプのリファレンスキットを前提として紹介しています。さらに、遠隔監視アプリを動作させるために専用のスマホを用意してください(iPhoneまたはAndroid)。
- 振動計測ソリューションリファレンスキット(ピックアップタイプ)
(リファレンスキットとして含まれる内容物については本記事発表時点では未確定であり、今後変更されることがあります。)
- 振動センサーピックアップ部分(以下のデバイスが内蔵されています)
- ADXL1002・・・MEMS加速度センサー評価ボード
- 2芯シールドケーブル・・・MEMS加速度センサーとマイコン開発ボードを繋ぐケーブル
- 振動センサー処理マイコンキット
- EV-COG-AD4050LZ・・・データ処理用マイコン開発ボード
- EV-GEAR-EXPANDER1Z・・・GPIOピン用拡張ボード
- USBケーブル(Type A・microUSB)・・・マイコン開発ボードとRaspberry Piの接続用ケーブル(シリアル接続・電源供給用)
- Raspberry Pi 3 Model B・・・ゲートウェイ用デバイス
そのほかのRaspberry Piも利用可能ですが、本記事の手順ではLANケーブルを接続できる機種(Raspberry Pi Model B+、Raspberry Pi2 Model B、Raspberry Pi3 Model B+)を前提とした内容となります。 - CANDY Pi™ Lite+ D・・・Raspberry Pi用3G/4G LTE通信ボード
CANDY Pi Lite LTEやCANDY Pi Lite 3Gあるいは、CANDY Pi Lite+ S、CANDY Pi Lite+ Kでも構いません。それぞれ利用可能なSIMカード(nanoサイズ)をご用意ください。 - nanoサイズのSIMカード
キャリア各社またはMVNO各社の販売するSIMカードをご用意ください - 電源用USBケーブルまたは5VACアダプター
5V ACアダプターをご利用の場合は、3A〜4Aの電流で、DCプラグ・ジャック(内径:φ2.1mm、外径:φ5.5mm、センタープラス)のものをご用意ください。 - microSDカード
耐用性や準備の時間短縮を考慮して、16GB以上で読み書きのデータ転送速度の速いもの(概ねUHSスピードクラス3以上)を推奨します。最低限8GBの容量の物をご利用ください。 - SDカードリーダー
作業用のパソコンからmicroSDカードを読み書きするために使用します。SDカードを差込めるパソコンの場合は、microSDカードを差し込めるアダプターをご用意ください。 - LANケーブル
Raspberry Pi本体と作業用のパソコンを接続するために使用します。 - Ethernet変換アダプター(必要な場合のみ)
LANケーブルを作業用のパソコンに直接差込める場合は不要です。 - 作業用パソコン
Windows、macOS、Linuxのいずれかを利用できるパソコンをご用意ください。LANケーブルを利用でき、インターネットに接続できる必要があります。 - 振動生成用スマートフォン(検証用スマートフォン)
iPhoneやAndroid。任意の周波数の音を発生させるアプリをインストールして、異常振動音を擬似的に発生させる道具として使います。アプリのインストールについては後述します。 - 遠隔監視アプリ用スマートフォン・タブレット
iPhoneまたはAndroid。「conect+」で作成するIoTスマホアプリを動かします。役目が異なるので上記の振動生成用スマートフォンとは別に用意してください。
ソフトウェア
必要なソフトウェアについては、第11回記事と同様ですが、スマホにインストールする遠隔監視アプリ「conect+」が追加で必要となります(アプリの紹介ページは下記参照)。 これらをあらかじめインストールして利用できるような状態にしてください。また、マイコン開発ボード用のファームウェアが含まれたZIPファイルについては、ダウンロードをした後にあらかじめ展開しておいてください。
- balenaEtcher(バレナエッチャー)
SDカードへの書き込みを行うソフトウェアです(元はEtcherでしたが、改名しています)作業用のパソコンで使用しますのであらかじめインストールをしてください。Windows、macOS、Linuxで利用可能です。 - ブラウザー
「CANDY RED」や「CANDY EGG」の操作のため、また「conect+」のスマホアプリ作成のため作業用パソコンで使用します。Chrome、Firefox、Safari、Edgeをご利用ください。Internet Explorerは使用しないでください。 - 振動計測ソリューションソフトウェアパッケージ
「振動計測ソリューション」のページ後半にあ振動計測ソリューション ソフトウェア・ライブラリ ダウンロード」のリンクからダウンロード可能です。センサーデバイスとなるマイコン開発ボード側のファームウェアが入っています。ダウンロードの際には、ユーザー情報の登録が必要となります。なお、ファームウェアを書き込むための特別なソフトウェアやハードウェアは不要です。 - conect+ スマホアプリ
iOS版はこちらのページから、Android版はこちらのページからインストール可能です(それぞれのスマートフォンからアクセスしてください)。
センサーデバイスの準備
第11回記事と同様です。センサーデバイスもファームウェアについても前回と同じものをご利用いただけます。なお、ピックアップタイプのセンサーを取り付けた場合は、外観が以下のような形になります。
【評価ボードタイプ】
センサーのシールドから直接評価ボードのピンに接続するタイプです。
【ピックアップタイプ】
ボトム基板経由でコネクター接続するタイプです。
そのほかの準備
Raspberry Pi側やセンサーデバイス側に関する以下の準備は、基本的に第11回記事と同様です。
- Raspberry Piの準備
第11回記事「Raspberry Piの準備」と同様ですが、新規にmicroSDカードをご用意する場合は、最新のCANDY Pi Lite専用OSイメージをご利用ください。 - センサーデバイスの接続
第11回記事「センサーデバイスの接続」と同様ですので、特に追加で準備することはありません。 - 「CANDY RED」でゲートウェイアプリの作成準備
第11回記事「『CANDY RED』でゲートウェイアプリの作成準備」との違いはありません。 - 「CANDY RED」でセンサーデバイスとクラウドをつなぐ
第11回記事「『CANDY RED』でセンサーデバイスとクラウドをつなぐ」で作成した「CANDY RED」のフローをそのまま使用します。 - 擬似的に振動を検出させるための準備
第11回記事「擬似的に振動を検出させるための準備」と同様ですので、特に追加で準備することはありません。
「CANDY EGG」でクラウドアプリの作成
クラウドアプリについては、第11回記事の「CANDY EGG」フローをベースに少し変更を加えます。具体的には、スマホ監視アプリと連動させるために、「CANDY EGG」から「conect+」のクラウドサービスへ連携させます。
クラウドサービス同士の連携となるため、ゲートウェイ側を変更しなくても、クラウド側の変更だけでスマホの監視アプリを準備できるようになります。このような柔軟性はクラウドならではの利点です。
今回の連携方法は、次のようになります。
左側の「CANDY EGG」クラウドから「conect+」のクラウドへ振動に関するデータや異常・正常のステータス情報をHTTPSを使用して通信するというのが今回の通信に関する概要です。送信するデータは、JSON形式であり、その書式は「conect+」サービスによりそのAPI仕様が決まっています。
今回使用するJSONの書式は次3種類です。
【異常・正常ステータス】
deviceNameは、端末を特定する名前などを指定します。今回はCANDY REDから来る振動データメッセージのトピックに入っている「adxl100x-fft」を使用します。また、keyには「machine1Status」を指定します。
ステータスの情報は、value1に1~4(1: GREAT, 2: GOOD, 3: BETTER, 4: BAD)で指定します。
【ピーク周波数】
keyには「machine1PeakFrq」を指定します。
【ピーク周波数の振幅】
keyには「machine1PeakAmp」を指定します。
これらのデータを「conect+」で受け取る設定は、「conect+」のWebコンソールで行いますが、設定方法などの詳細は次回の記事にて解説します。
それでは、クラウド側のフローを変更しましょう。最初の状態では、以下のように第11回記事で用意した状態が「CANDY EGG」側に残っていると思いますので、その状態から開始します。
今回は、第11回記事と異なり、正常か異常かの状態判定だけでなく、正常な状態であってもピークの周波数や振幅をスマホ側に表示したいので、正常な状態でもそれらの数値を出せるように変更してみましょう。
今の時点では、以下のように「ピーク周波数が10kHz以上の時に異常値を一時保管」するようになっています。
このままでは、正常な値を捨ててしまっていますので、正常な値も一時保管するように新たに「Cache out」ノードを追加します。
この「Cache out」ノードには、既存の「異常値の保管用」とは別のキャッシュ設定を追加します。具体的には、「Cache out」ノードの設定において、以下のように「Add new Cache...」を選択して右隣の鉛筆アイコンをクリックします。これによって新しい保管先を用意することができます。
新しく追加するキャッシュの設定では、正常な値は、異常値の保管時間(15秒)や「一定時間以上残っている異常値を取り出す」タイマー処理の時間(30秒)よりも長い時間にして、一定時間以上異常値が残っていない場合に、正常な値を代わりに取得できるようにします。具体的には、正常値保管用に新たに用意するキャッシュの設定で、Default TTLとCheck Intervalを45秒としておきます。
続いて、この新しく追加した「Cache out」に正常値を保管するために、「周波数が10kHz以上の時」と書かれた「switch」ノードの設定を変更しましょう。具体的には、新しい条件「周波数が10kHz未満の時」を追加します。不等号の種類とその隣のデータ種類選択肢がそれぞれ「<」と「09」となっているか注意してください。数値には「10」を指定します。
「周波数が10kHz以上の時」と書かれた「switch」ノードに新しいポートが追加されているので、正常値を格納するキャッシュに接続します。
今度は、「一定時間以上異常値が残っているかどうか」のタイマー処理について変更を加えます。これまでは、メッセージをダッシュボードに表示するというアプリケーションでしたが、今回はその代わりに異常ステータスを表すデータを含めて「conect+」へ送信するというアプリケーションに変わります。具体的には、「異常を知らせるメッセージを作成」のノードの部分を追加したり変更したりして、「conect+」へ送信するメッセージを用意します。また、「conect+」へHTTPのリクエストを送信します。
それでは、「conect+」へ送信するデータを準備していきます。今回は以下の3点の処理を行います。
- 周波数や振幅の値のまるめ処理(小数第2位までとします)
- 計測日時の追加(「conect+」が指定する書式に沿った値を準備します)
- 異常・正常ステータス、周波数、振幅の3つのデータのJSONオブジェクトの作成
まずは周波数や振幅の値のまるめ処理を行っていきましょう。「異常値が存在するときは」の「switch」ノードの下に新しく「change」ノードを追加します。このノードで値の変更を実施することができます。さらに「異常値が存在するときは」のノードと新しく追加した「change」ノードを接続してください。また、「異常値が存在するときは」のノードから「異常を知らせるメッセージを作成」につながっていた接続は削除します。なお、周囲のノードは重ならないように適宜移動させるようにしてください。
追加した「change」ノードは以下のように値を設定します。Rulesには、2つの条件を設定します。1つは、周波数を扱う条件です。toの右隣は見切れていますが以下の値を指定します。
$floor(payload[0].frequency * 100) / 100 |
値の種類は「JSONata(ジェイソナータ)」の式となりますので入力欄の左側が「J:」となるように変更してください。
もう1つは、振幅を扱う条件です。toの右隣は先ほどと似ていますが少し違いますので注意してください。
$floor(payload[0].amplitude * 100) / 100 |
どちらも値の種類は「JSONata(ジェイソナータ)」の式となりますので入力欄の左側が「J:」となるように変更してください。
このように設定すると、周波数と振幅の値がそれぞれ小数点第2位までの値に切り捨てされます。
次に行うデータの準備は計測日時の追加です。「conect+」は、「YYYY-MM-DD HH:mm:ss」形式の日時データ(UTCタイムゾーン)を要求します。この値をフローの中で用意して、「conect+」に送信するデータに含めるようにします。
先ほど追加した「change」ノードの下に新しく「moment」ノードを追加します。また、これら2つを接続しておきましょう。
このノードでは次のような設定を行います。
- 「Input from」→「timezone」を指定します。
- 「Input Timezone」→「Etc/UTC」または「ETC/GMT」を指定します。
- 「Output format」→「YYYY-MM-DD HH:mm:ss」を指定します。
- 「Output to」→「(msg.)payload[0].sensingAt」を指定します。
- 「Name」→「計測日時の追加」
これで日時を追加することができます。ただし、デバイス側の日時ではなくクラウドで以上または正常を検知した日時となりますので、デバイス側の日時を必要とする場合は、CANDY RED側のフローを変更してデバイス側の日時を追加するような変更が必要となります。今回はクラウド側での日時を基準としてフローを準備していきます。
データ処理の最後は、「conect+」へ送信するメッセージの作成です。今回は、「異常・正常ステータス」、「周波数」、「振幅」の3種類のデータを送ります。まずは、「異常・正常ステータス」のメッセージを準備します。すでにある「異常を知らせるメッセージを作成」ノードを移動させて、「計測日時の追加」ノードの下に置き、その2つを接続しましょう。また、「警告メッセージを表示」ノードは必要ないため削除します。
「異常を知らせるメッセージを作成」ノードの設定を変更して、JSON形式のデータを送れるようにします。「Template」には、次のような内容を指定します。
{ "deviceName": "{{topic}}", "key": "machine1Status", "value1": 4, "sensingAt": "{{payload.0.sensingAt}}" } |
さらに、「Output as」では「Parsed JSON」を選択します。これにより上記の文字列をHTTPリクエスト送信に必要なJSONオブジェクトとしてメッセージを出すことができます。
「周波数」と「振幅」のデータも準備しましょう。先ほどの「異常を知らせるメッセージを作成」ノードを2つ複製して「計測日時の追加」ノードと接続しましょう。
まず真ん中の「異常を知らせるメッセージを作成」ノードを編集して周波数データ用に設定を変更しましょう。「Template」には、次のような内容を指定します。先ほどと少し違いますので注意してください。
{ "deviceName": "{{topic}}", "key": "machine1PeakFrq", "value1": 4, "sensingAt": "{{payload.0.sensingAt}}" } |
また、ノードの名前(Name)も紛らわしいので変更しておきましょう。
もう一つの「異常を知らせるメッセージを作成」ノードも同様に編集して、振幅データ用に変更しましょう。「Template」には、次のような内容を指定します。こちらも先ほどと似ていますが少し違いますので注意してください。
{ "deviceName": "{{topic}}", "key": "machine1PeakAmp", "value1": 4, "sensingAt": "{{payload.0.sensingAt}}" } |
続いて、「conect+」へHTTPS通信するために、「http request」ノードを追加します。このノードへ先ほど用意した3つの以下のノードを接続しておきましょう。また、HTTPS通信した結果を確認するため、「debug」ノードもつなぎます。
- 「異常を知らせるメッセージを作成」ノード
- 「周波数データのメッセージを作成」ノード
- 「振幅データのメッセージを作成」ノード
このノードには、「conect+」への接続先を指定します。URLについては、次回の記事にて紹介しますので、「conect+」側の設定が終わってから正しい値を指定します。それ以外の、MethodとReturnにはそれぞれ「POST」と「a parsed JSON object」を指定しておきます。
ここまでで、異常ステータスとその時の周波数や振幅を「conect+」へ伝える仕組みができました。次は、正常ステータスでも同様に周波数や振幅を送信できるようにしてみましょう。「『警告はありません』を設定」ノードを削除して、代わりに「Cache in」ノードを追加して接続します。
このノードでは、正常値を取得するためCacheには「正常値保管用」を選択しておきます。
次に、正常値が存在する時だけ「conect+」と通信をするように「switch」ノードを追加してこの「Cache in」ノードから接続します。
また、この「switch」ノードの設定では値が存在するときという条件にするため、次のように条件を「is not null」に設定します。
あとは、先ほどの異常値で使用した以下のノードを複製して接続します。似たような処理をもう一度描いていくのは冗長ですが、まずは動かすことが先決ですので複製して使用します。
- 「数値のまるめ処理」ノード
- 「計測日時の追加」ノード
- 「異常を知らせるメッセージの作成」ノード
追加した「異常を知らせるメッセージを作成」ノードは以下のように設定を変更しましょう。これは正常ステータスを知らせるための設定ですので、Nameも変更しましょう。
「Template」には、次のような内容を指定します。
{ "deviceName": "{{topic}}", "key": "machine1Status", "value1": 2, "sensingAt": "{{payload.0.sensingAt}}" } |
以上全てを設定すると次のようなフローになります。ここまで作成したら、忘れずに「Deploy」をクリックしておきましょう。まだ「conect+」への通信設定は行なっていませんが、現時点までの準備を保存しておくためです。
また、フローをExportしてバックアップしておくと良いでしょう。
まとめ
今回は、第11回記事で作ったIoTアプリケーションを改変して、魅力的なIoTスマホアプリを作れるサービスにつなげるための準備をしました。
次回はいよいよ、そのIoTスマホアプリをノンプログラミングで用意してみましょう!