Helium、Azure IoT Hub、Power BIを用いたリアルタイムGPSトラッキング
必要なコンポーネントと用品
| パーツ | 数量 |
|---|---|
| Helium Atom プロトタイピングモジュール | 1 |
| Arduino Zero | 1 |
| Adafruit Ultimate GPS Breakout | 1 |
| ブレッドボード(汎用) | 1 |
アプリとオンラインサービス
- Microsoft Azure
- Arduino IDE
プロジェクト概要
Heliumは、開発者が低消費電力、セキュア、長距離通信が可能なデバイスを構築するのを支援するプラットフォームです。このプロジェクトでは、Helium AtomプロトタイピングモジュールをArduino ZeroとAdafruit Ultimate GPS Breakoutと組み合わせ、GPSデータをAzure IoT Hubへシームレスに送信し、Power BIレポートで可視化する手順を解説します。
Heliumの低消費電力、セキュア、長距離ワイヤレス製品の詳細や必要なハードウェアの購入は helium.com/store で確認できます。
ハードウェアの準備
Helium AtomとArduinoの接続
まず、Helium AtomプロトタイピングモジュールをHelium Atom Arduinoアダプタに取り付け、Arduinoに接続します。このガイドではArduino Zeroを使用していますが、Uno、Due、M0、またはその他のArduinoボードでも動作します。
GPSブレークアウトの配線
次に、Adafruit Ultimate GPS BreakoutをArduinoに接続します。ブレッドボードを使用すると配線が分かりやすくなりますが、直接Arduinoに配線しても構いません。配線は以下の通りです。
- Arduino 5V → GPS VIN
- Arduino GND → GPS GND
- Arduino D12 → GPS TX
- Arduino D10 → GPS RX
Helium Elementのセットアップ
Cellular Elementを使用する場合は、電源を入れて前面のライトがティール色(青緑色)になるまで待つだけです。Ethernet Elementの場合、またはCellular Elementで有線接続を好む場合は、ElementのEthernetポートをケーブルモデムや無線ルーターの背面など、DHCPが有効なポートに接続します。Elementの電源を入れ、前面のライトが緑色になれば準備完了です。
Heliumダッシュボードとチャネルの設定
ElementとAtomのアクティベーション
Heliumダッシュボードにログインし、左メニューの「Elements」→「Add New」からElementをアクティベートします。Element背面のラベルにあるMACアドレスの下4桁とHVVを入力し、名前とタグ(任意)を追加して「Activate Element」をクリックします。
同様に、「Atoms」→「Add New」からAtomをアクティベートします。AtomのラベルにあるMACとHVVを入力し、「Activate Atom」をクリックします。
Azure IoT Hubの作成
Azureポータルで「+」→「Internet of Things」→「IoT Hub」を選択し、IoT Hubを作成します。ダッシュボードにピン留めしておくと後で見つけやすくなります。
デプロイ完了後、IoT Hubを開き、「Shared access policies」→「RegistryReadWrite」→「Connection string—primary key」のコピーアイコンをクリックして接続文字列をコピーします。この文字列は機密情報なので、信頼できない相手とは共有しないでください。
Heliumチャネルの作成
Heliumダッシュボードに戻り、「Channels」→「Azure IoT Hub」を選択し、先ほどコピーした接続文字列を貼り付けてチャネルを作成します。チャネル名は後でArduinoスケッチで使用するため、控えておいてください。
Arduinoスケッチ
Azure IoT Hubの設定とHeliumチャネルの作成が完了したら、Helium ArduinoライブラリとAdafruit GPSライブラリを使用してGPS位置情報をHelium経由でAzureへ送信するスケッチを作成します。
Arduino IDEの「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理」から「Helium」と「Adafruit GPS」を検索してインストールします。
スケッチの概要
以下のスケッチは、Atomの初期化、Heliumダッシュボードで作成したチャネルとの接続、GPSデータの取得、JSON形式への整形、Heliumネットワーク経由での送信を行います。詳細なライブラリの使い方は Helium Atom Arduinoライブラリのガイド を参照してください。
/*
* Copyright 2017, Helium Systems, Inc.
* All Rights Reserved. See LICENCE.txt for license information
*/
#include "Arduino.h"
#include "avr/dtostrf.h"
#include "Helium.h"
#include
#include
#include "wiring_private.h" // pinPeripheral() function
#define atom_serial Serial1
#define PIN_SERIAL2_RX (34ul)
#define PIN_SERIAL2_TX (36ul)
#define PAD_SERIAL2_TX (UART_TX_PAD_2)
#define PAD_SERIAL2_RX (SERCOM_RX_PAD_3)
Uart Serial2(&sercom1, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX, PAD_SERIAL2_TX);
void SERCOM1_Handler() {
Serial2.IrqHandler();
}
Helium helium(&atom_serial);
Channel channel(&helium);
#define gps_serial Serial2
Adafruit_GPS GPS(&gps_serial);
void setup() {
pinPeripheral(10, PIO_SERCOM);
pinPeripheral(12, PIO_SERCOM);
Serial.begin(115200);
Serial.println("Starting");
helium.begin(helium_baud_b115200);
Serial.print("Connecting - ");
int status = helium.connect();
while (status != helium_status_OK) {
status = helium.connect();
}
Serial.println("Succeeded");
int8_t result;
Serial.print("Creating Channel - ");
status = channel.begin("Hackster Guide", &result);
if (helium_status_OK == status && result == 0) {
Serial.println("Succeeded");
} else {
Serial.println("Failed");
}
delay(1000);
GPS.begin(9600);
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
GPS.sendCommand(PGCMD_NOANTENNA);
delay(2000);
}
uint32_t timer = millis();
void loop() {
char c = GPS.read();
if (GPS.newNMEAreceived()) {
if (!GPS.parse(GPS.lastNMEA())) return;
}
if (timer > millis()) timer = millis();
if (millis() - timer > 2000) {
timer = millis();
if (GPS.fix) {
char lat[10];
char lon[10];
char data[100];
dtostrf(GPS.latitudeDegrees, 4, 4, lat);
dtostrf(GPS.longitudeDegrees, 4, 4, lon);
sprintf(data, "{\"lat\": \"%s\", \"lon\": \"%s\"}", lat, lon);
int8_t result;
Serial.print("Sending - ");
int status = channel.send(data, strlen(data), &result);
if (helium_status_OK == status && result == 0) {
Serial.print("Successfully sent ");
Serial.println(data);
} else {
Serial.println("Failed");
}
} else {
Serial.println("No GPS fix!");
}
}
}
ライブラリをインストールしたら、Arduino IDEで「ファイル」→「新規作成」し、上記コードを貼り付けます。Arduino/AtomをUSBで接続し、右向き矢印の「アップロード」ボタンをクリックします。
数秒後、Atomのライトが赤と青に点滅し、その後一定の赤点滅パターンになればHeliumネットワークへの接続成功です。GPSのFIXライトも赤くゆっくり点滅し、停止すれば衛星捕捉完了です。GPSは窓際や屋外に置くと捕捉しやすくなります。
Arduino IDEの「ツール」→「シリアルモニタ」を開くと、接続、チャネル作成、GPS捕捉までのデバッグ出力が確認できます。
データ送信の確認
Heliumダッシュボードの「Channels」から作成したAzureチャネルを選択し、詳細ビューの「Event Log」を見ると、タイムスタンプ、データサイズ、Azureへのルーティング成功/失敗が表示されます。
Azure IoT Hubの「Device Explorer」でも、Helium AtomデバイスがMACアドレスで登録され、ハードウェア署名付きX.509証明書で自動的にセキュア化されていることが確認できます。
Power BIへのデータ取り込み
Power BIアカウントとワークスペースが既にあるものとします(なければ powerbi.com で作成)。Azure Stream Analyticsジョブを作成し、IoT HubからPower BIへデータを流します。
- Azureポータルで「New」→「Stream Analytics Job」を検索・作成。
- ジョブの「Inputs」→「Add」で、エイリアス名を入力し、ソースに「IoT Hub」を選択、対象のIoT Hubを指定。
- 「Outputs」→「Add」で、シンクに「Power BI」を選択、Power BIアカウントを認証し、ワークスペースとテーブル名を指定。
- 「Query」で入力を出力に接続するクエリを作成(例:
SELECT * INTO [PowerBI出力] FROM [IoT Hub入力])。 - 「Save」後、概要ページの「Start」をクリックしてジョブを開始。数分でPower BIにデータがストリーミングされます。
Power BIでの可視化
Power BIワークスペースで「+ Create」→「Report」を選択し、Stream Analyticsで作成したデータセットを選びます。右ペインの地図ビジュアル(白い地球儀アイコン)を選び、latをLatitude、lonをLongitudeにドラッグします。ツールチップにEventProcessedUTCTimeを追加すると、マウスオーバーで送信時刻が表示されます。保存すれば、Helium Atomの位置を示すマップが完成です。
製造プロセス
- Python連携で信頼性向上: Arduino RFID勤怠管理システム
- GPSデータロガー構築と Azure IoT Hub での空間分析
- Arduinoと1Sheeldで作る万能Androidリモコン──IR制御で家電を一括操作
- Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト
- ArduinoとMAX30100で作るリアルタイムIoT心拍数モニター
- IoTで遠隔操作する自作ロボットアーム:Arduino MKR1000とSimulink、ThingSpeak活用
- ESP8266・Arduino・超音波センサーで作るスマートIoTジャー:リアルタイム中身監視
- Arduino UNOで周波数とデューティサイクルを高精度測定
- Arduino超音波センサーとProcessingで作るリアルタイム距離測定ソナー
- Bolt IoTとArduino UNOでLED輝度をシームレス制御
- Azure IoT対応スマートプール制御システム:水温・気温監視と遠隔ポンプ制御