2021年8月8日
図:自作の 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 のファームウェアは、CurieBLE
と CurieIMU
ライブラリを使った標準的な Arduino コードで記述されています。このボードは BLE ペリフェラルとして機能し、7つのキャラクタリスティックを持つ 1つのサービスを公開します:
ax
, ay
, az
) および ジャイロスコープ (gx
, gy
, gz
) ts
)各キャラクタリスティックには UUID が割り当てられており、クライアントは購読、読み取り、書き込み、通知の受信が可能です。
クライアント側の Node.js スクリプトは Noble ライブラリを使って BLE 経由で Arduino 101 を検出・接続します。接続後、7つのキャラクタリスティックすべてに対して通知を有効にし、サービスを購読します。
Socket.io を使って、センサーデータとサンプリング周波数の変更をリアルタイムで Node.js サーバーへ送信します。
なぜ WebSockets ではなく Socket.io を使用?
Socket.io はマルチプレクシング(複数のイベントストリームを1つの接続で処理)をシンプルに実装できるため選ばれました。WebSocket よりもオーバーヘッドが少なく、API も扱いやすいです。
Node.js と Express で構築されたサーバーは、Socket.io を通じてクライアントからセンサーデータを受け取り、MongoDB に保存します。同時に、Socket.io を使ってデータをウェブフロントエンドにブロードキャストします。
フロントエンドは AngularJS で構築され、Bootstrap によりスタイリングされています。センサーデータは Google Charts を用いてリアルタイムグラフで表示され、ユーザーはインターフェースから Arduino 101 のサンプリング周波数を変更できます。この変更は即座にシステム全体へ反映され、リアルタイムデータとして視覚化されます。