Arduino 101 と MEAN スタックを用いたリアルタイム IoT データ可視化

2021年8月8日

IoT BLE Arduino101 Intel Edison MEANスタック Nodejs WebSockets センサーデータ リアルタイム可視化

arduino101 図:自作の Arduino 101 の写真


概要

このプロジェクトでは、Intel Curie モジュールを搭載した Arduino 101 を使用し、MEANスタック(MongoDB, Express, AngularJS, Node.js)と連携したリアルタイム IoT システムを構築しています。Arduino 101 は加速度およびジャイロスコープのデータを収集し、BLE(Bluetooth Low Energy を通じてブロードキャストします。

クライアント端末は BLE 経由で Arduino 101 に接続し、データを取得して Wi-Fi 経由で Node.js サーバーへ転送します。サーバーは受信したデータを MongoDB に保存しつつ、同時にウェブフロントエンドにプッシュしてリアルタイムで可視化を行います。また、ウェブページからは Arduino 101 のサンプリング周波数をリモートで変更可能で、その変更は BLE の遅延・Wi-Fi 転送・Arduino の処理時間を加味して、即座にデータフローとグラフに反映されます。

以下はシステム構成図です:

システム構成図


仕組み

Arduino 101

Arduino 101 のファームウェアは、CurieBLECurieIMU ライブラリを使った標準的な Arduino コードで記述されています。このボードは BLE ペリフェラルとして機能し、7つのキャラクタリスティックを持つ 1つのサービスを公開します:

  • 読み取り専用(6つ):加速度 (ax, ay, az) および ジャイロスコープ (gx, gy, gz)
  • 書き込み可能(1つ):サンプリング周波数 (ts)

各キャラクタリスティックには UUID が割り当てられており、クライアントは購読、読み取り、書き込み、通知の受信が可能です。


クライアント端末

クライアント側の Node.js スクリプトは Noble ライブラリを使って BLE 経由で Arduino 101 を検出・接続します。接続後、7つのキャラクタリスティックすべてに対して通知を有効にし、サービスを購読します。

Socket.io を使って、センサーデータとサンプリング周波数の変更をリアルタイムで Node.js サーバーへ送信します。

なぜ WebSockets ではなく Socket.io を使用?
Socket.io はマルチプレクシング(複数のイベントストリームを1つの接続で処理)をシンプルに実装できるため選ばれました。WebSocket よりもオーバーヘッドが少なく、API も扱いやすいです。


サーバー & Webインターフェース

Node.jsExpress で構築されたサーバーは、Socket.io を通じてクライアントからセンサーデータを受け取り、MongoDB に保存します。同時に、Socket.io を使ってデータをウェブフロントエンドにブロードキャストします。

フロントエンドは AngularJS で構築され、Bootstrap によりスタイリングされています。センサーデータは Google Charts を用いてリアルタイムグラフで表示され、ユーザーはインターフェースから Arduino 101 のサンプリング周波数を変更できます。この変更は即座にシステム全体へ反映され、リアルタイムデータとして視覚化されます。


デモ & ソースコード

📁 GitHubでソースを見る