LoRaWANハンズオン - soracom/handson GitHub Wiki
Arduino で LoRaWAN 通信を可能にする LoRa Arduino 開発シールド AL-050 と Arduino UNO R3 、そして温度センサーを利用し、データ収集・蓄積サービス SORACOM Harvest でセンサーデータを可視化するハンズオンです
※本ハンズオンは 30分~60分 程度を見込みます
- 準備するもの
- ハンズオン
- 有効なSORACOMアカウント / 1つ
- パソコン / 1台
- USB-Aポートを持ち、 Arduino との接続時にOSからシリアルポートとして利用可能なこと
- Arduino IDE (1.8.5 以上) が インストール済み であること
- Arduino UNO R3 / 1つ
- Arduino UNO R3 ⇔ パソコン接続用 USBケーブル / 1本
- LoRa Arduino 開発シールド / 1式
- 購入後の登録 が済んでいること
- 温度センサー LM61CIZ / 1つ
- ブレッドボード / 1つ
- ジャンパワイヤ / 3本
- 本ドキュメントで利用するサービスには一部有料のものを含んでおります (e.g. SORACOM Harvest, SORACOM Funnel)
受講に伴い発生した費用は原則として受講者にご負担いただいておりますので、係る費用について確認・ご理解いただいた上での受講をお願いいたします - 本ドキュメントで発生した不具合等につきましては弊社は一切責任を負いません
- SORACOM Harvest: 5円/LoRaデバイス/日
→ 本ハンズオンで通常の利用であれば 2,000 回/日のリクエストに収まります - SORACOM Funnel: 600回のリクエスト → 約1円程度
※これ以降 Arduino UNO R3 本体の事は Arduino と称します
※この段階では、まだ LoRa 開発シールドは使用しません。取り付けないでください
Arduino IDE から ファイル > スケッチ例 > 01.Basics > Blink を選んでください
すると、新しいウィンドウで Arduino 上のLEDをチカチカ点滅させる Blinkスケッチ が開きます
Arduino とパソコンを USB ケーブルで接続してください
Blink スケッチ をコンパイル&マイコンボードへの書き込みを行います
初めて Arduino を使う場合や、これまで使っていたのと違う機種の Arduino を使う場合は、書き込み時にエラーが発生します。 その場合は ツール > ボード から "Arduino/Genuino Uno" を選び、ツール > シリアルポート から "Arduino/Genuino Uno が接続されているポート" を選んでください。
書込みが完了すると Arduino は自動的に書き込まれたスケッチ(プログラム)を起動します。 LED が1秒毎に点滅し始めれば成功です
Arduino を停止します。停止の方法は USB ケーブルを抜くことです
マイコン全般に言えることですが、電源OFFの際のシャットダウン処理などは、原則不要です。Raspberry Pi やノートPC等、汎用 OS が稼働するコンピュータとの大きな違いです
Blink スケッチ は LED を 1 秒 (=1,000 ミリ秒)ごとに点滅するようにコーディングされています
いろんな改造をしてみましょう
- LED の点滅周期を 500 ミリ秒毎に変えてみましょう
- ヒント:
delay
関数によって周期が変更できます
- ヒント:
- 点灯は 2 秒、消灯は 1 秒と間隔を変えてみましょう
- モールス信号 "SOS" を表現してみましょう
- ヒント: SOS => トントントン ツーツーツー トントントン
- ヒント: トンは 150 ミリ秒、ツーは 300 ミリ秒、休止は 600 ミリ秒
Arduino を接続しているシリアルポートがOSから認識できていません
- Arduino を再接続をしてみてください
- ツール > ボード から "Arduino/Genuino Uno" が選択されているか確認してください(選ばれていない場合は選んでください)
- ツール > シリアルポート から "Arduino/Genuino Uno が接続されているポート" が選択されているか確認してください(選ばれていない場合は選んでください)
温度センサー (LM61CIZ) を取り付け、温度を実際に計測してみましょう
※この段階では、まだ LoRa 開発シールドは使用しません。取り付けないでください
Arduino を停止してください。電源を入れたまま配線を行うと感電の恐れがあります。
Arduinoを停止した後、 1/Arduino 2/ブレッドボード 3/温度センサー (LM61CIZ) 4/ジャンパワイヤー それぞれを準備し、下記の通り接続してください
ブレッドボードと温度センサー (LM61CIZ) を実際につなげたところ
注意点
- 温度センサー (LM61CIZ) の取り付け向きに注意してください。平らになっている面がありますので、その面を活かして方向を確認してください
- ジャンパワイヤーの色自体には意味がありません。お好きな色をお使いください
(一般的には電源 (VCCとかVsとか書かれている) には赤を、GNDには黒を使います) - Arduino 上には複数 GND が存在します。どの GND に接続しても大丈夫です
Arduino とパソコンを USB ケーブルで接続してください
※この時点では、前の Blinkスケッチ が動作しているため LED が点滅します
注意点
- この時点で温度センサー (LM61CIZ) が 「とても高熱になった」「焦げ臭い匂いがする」 場合は、USBケーブルを抜いて Arduino を停止し、再度接続を確認してください
ファイル > 新規ファイル を選択すると、新たなスケッチウィンドウが立ち上がります
骨組みコードが書かれていますが すべて削除したうえで 下記スケッチを張り付けて「マイコンボードに書き込む」をしてください
※スケッチの保存を聞かれた場合は handson_tmpr
と保存しましょう(ファイル名は任意でかまいません)
#define SENSOR_PIN 0 // analog pin
#define PROBE_INTERVAL 5000 //msec
void setup() {
Serial.begin(9600);
}
void loop() {
int mV = analogRead(SENSOR_PIN);
int dv = map(mV, 0, 1023, 0, 5000);
unsigned long tmpr = map(dv, 300, 1600, -30, 100); /* NOTE: Map by DataSheet */
Serial.println(tmpr);
delay(PROBE_INTERVAL);
}
-
analogRead()
でセンサーからの電圧を読み取る - 読み取った電圧(0 ~ 1023) をセンサーの解像度(0 ~ 5000)にマッピング
- マッピングされた後の値を、センサー仕様に沿ってマッピング (300 が -30 ℃、1600 が 100 ℃ になるように)
実行し始めると、先ほどまで点滅していたLEDは点灯状態となり、温度センサーでの計測を開始します
計測された温度は シリアルモニタ というところに表示されるので、それを確認します
ツール > シリアルモニタ を開くと、下記のように温度が表示されていることがわかります
シリアルモニタは Arduino 開発で最も一般的な入出力画面です
シリアルモニタの様子が確認出来たら、シリアルモニタを閉じてから Arduino を停止します
"シリアルモニタ" のウィンドウを表示していると CPU 負荷がかかるようです
"シリアルモニタ" ウィンドウを閉じてください
温度センサー (LM61CIZ) で計測した温度データを LoRaWAN を利用して SORACOM Harvest に送信し、可視化してみましょう
Arduino を停止してください。電源を入れたまま配線を行うと感電の恐れがあります。
また、温度センサー (LM61CIZ) もすべて取り外してください。
注意点
- LoRa開発シールドのピンは折れ曲がりやすいため、取り付け時および取り外しの際にはご注意ください(原則保証外です)
注意点
- LoRa アンテナケーブルのコネクタはとても小さいため、取り付けができていない場合もあります。不安がある場合はスタッフにご確認ください。またコネクタを破損しないよう、取り付け時および取り外しの際にはご注意ください(原則保証外です)
LoRa 開発シールドの上に、先ほどと同じ様に温度センサー (LM61CIZ) を取り付けます
注意点
- Arduino 上の表記と若干違うため、ピンの位置は再度確認するようにしてください。位置自体は全く同じです
この時点で、下記のようになっているはずですので、確認をしてください
以上でハードウェアの準備は完了です。
LoRa 開発シールドを Arduino で利用するには、 SORACOM からリリースされているソフトウェアライブラリをスケッチに取り込む必要があります
下記から最新版の ZIP ファイルをダウンロードしてください
※ "Source code (zip)" と表示されているリンクです
Arduino IDE を起動してください。(すでに起動している場合は、次の手順に進んでください)
スケッチ > ライブラリをインクルード > .ZIP形式のライブラリをインストール... で、先ほどダウンロードした SORACOM-LoRaWAN-1.0.6.zip を選択してください
Arduino とパソコンを USB ケーブルで接続してください
注意点
- この時点で温度センサー (LM61CIZ) が 「とても高熱になった」「焦げ臭い匂いがする」 場合は、USBケーブルを抜いて Arduino を停止し、再度接続を確認してください
ファイル > 新規ファイル を選択すると、新たなスケッチウィンドウが立ち上がります
骨組みコードが書かれていますが すべて削除したうえで 下記スケッチを張り付けて「マイコンボードに書き込む」をしてください
※スケッチの保存を聞かれた場合は handson_tmpr_lorawan
と保存しましょう(任意でかまいません)
#define SENSOR_PIN 0 //analog pin
#define PROBE_INTERVAL 5000 //msec
#include <lorawan_client.h>
LoRaWANClient lorawan;
void setup() {
Serial.begin(9600);
if(! lorawan.connect(true))
{
Serial.println(" failed to connect. Halt...");
for(;;){};
}
Serial.println("\nConnected.\n");
}
void loop() {
int mV = analogRead(SENSOR_PIN);
int dv = map(mV, 0, 1023, 0, 5000);
unsigned long tmpr = map(dv, 300, 1600, -30, 100); /* NOTE: Map by DataSheet */
Serial.println(tmpr);
lorawan.sendData(tmpr);
delay(PROBE_INTERVAL);
}
前回のスケッチからの差分になります
-
setup()
内にlorawan.connect()
から始まる LoRaWAN ゲートウェイ接続処理を追加 -
loop()
内にlocalwan.sendData()
によるデータ送信処理を追加
書込みが完了すると Arduino 内のスケッチの実行が開始されます
シリアルモニタを見てみると、先ほど同様に温度が表示されるのと同時に LoRaWAN 通信をしている様子が確認できます
ソラコムコンソールにログインし Menu > LoRa デバイス管理 をクリックします
ここにはLoRa 開発シールド購入後の登録が完了しているデバイスが表示されています
表示されていない、対象のデバイスが無い場合は、まずLoRa 開発シールド購入後の登録を行ってください
Menu > LoRa グループ をクリックすると、LoRaグループ一覧が表示されます。この画面で 追加 をクリックします
ダイアログで下記の通り設定した後、グループ作成 をクリックします
- グループ名:
lora_demo0
下記の通り、先ほど作成した lora_demo0
が一覧に表示されます
LoRa グループ一覧の中から lora_demo0
をクリックします
SORACOM Air for LoRaWAN 設定 の通りになっていることを確認してください(なっていない場合は変更してください)
- SORACOM LoRa Space を利用: 利用する (※通常は変更の必要がありません。設定の確認を行ってください)
- LoRa ネットワークセットID: ------ (※通常は変更の必要がありません。設定の確認を行ってください)
- バイナリパーサー設定: ON
- フォーマット:
tmpr_c:2:uint:16
同じページ内の SORACOM Harvest 設定 を下記の通りにした後 保存 をクリックしてください
- ON
その際、下記のダイアログが出ますので OK をクリックしてください
※バイナリパーサーについてはAppendix: バイナリパーサーについてをご覧ください
Menu > LoRaデバイス管理 をクリックして、LoRaデバイス一覧を表示します
先ほど作成した lora_demo0
LoRaグループに所属させたいLoRaデバイスのチェックボックスを選択した後、操作 > 所属グループ変更をクリックしてください
ダイアログにて下記のように設定した後 グループ変更 をクリックしてください
- 新しい所属グループ:
lora_demo0
LoRa デバイスを SORACOM Harvest が有効な LoRa グループに所属させた直後から、データの可視化が始まります
Menu > LoRa デバイス管理 をクリックし、データを表示させたい LoRa デバイスのチェックボックスを選択した後、操作 > データを確認 にてデータを確認することができます
温度センサー (LM61CIZ) を指でつまんでみると温度が変化します
SORACOM Harvestは標準では手動での表示更新であるため更新ボタンを押す、もしくは自動更新をONにしてください
動作が確認出来たら Arduino を停止します
何回も unsuccess が表示される場合は LoRaWAN 通信に失敗しています(電波状況にもよりますが 0~2 回程度の失敗がありえます)
- LoRaWAN ゲートウェイと通信できる距離・環境であるか確認してください
- LoRa 開発シールドと LoRa アンテナの接続を確認してください
- 「表示期間」が合ってないことがあります。調整してみてください
SORACOM Funnel の SORACOM Funnel AWS IoT Adapter を利用して、LoRaデバイスからのデータをAWS IoT Coreへデータを送信してみます
※本ハンズオンは 60分~90分 程度を見込みます
- LoRa Arduino 開発シールドを使用したハンズオンにて SORACOM Harvestでデータの可視化まで達成でき、同じものを用意できる
- 有効なAWSアカウントを持っている
- 本ハンズオンにおいては有料サービスを利用するため課金されることをご理解ください
- AWSの基本的なサービスは利用可能である
- Amazon EC2のインスタンス作成・停止などの操作が行える
- Amazon S3のバケット作成・削除などの操作が行える
- AWS IAMのロールやポリシーを理解し、作成・削除などの操作が行える
1-1. SORACOM Webコンソール で 左上[Menu] > [セキュリティ]
- 認証情報ID:
awsiot-dataaccess
- 概要:
AWS IoT DataAccess
- 種別: AWS 認証情報 (これを選択すると、下記IDを入力するテキストボックスが増えます)
- AWS Access Key ID: ハンズオン運営から入手 (aws-accesskey-id)
- AWS Secret Access Key ID: ハンズオン運営から入手 (aws-secret-accesskey-id)
自前のアカウントを使う場合には、本ページ末の Appendix: 自分の AWS アカウントを使う を参考にして IAM ユーザを作成し、アクセスキーIDとシークレットアクセスキーを用意します
2-1. SORACOM Webコンソール で 左上[Menu] > [LoRa グループ]
[追加] で LoRa グループを作成します (グループ名 lora_funnel
もしくは任意でかまいません)
- SORACOM LoRa Space を利用: 利用する (※通常は変更の必要がありません。設定の確認を行ってください)
- LoRa ネットワークセットID: ------ (※通常は変更の必要がありません。設定の確認を行ってください)
- バイナリパーサー設定: ON
- フォーマット:
tmpr_c:2:uint:16
SORACOM Harvest の設定は OFF にしてください
- 転送先サービス: AWS IoT
- 転送先URL: ハンズオン運営から入手 (endpoint-url)
- 認証情報: awsiot-dataaccess (AWS IoT DataAccess)
- 送信データ形式: JSON
自前のアカウントを使う場合には、転送先 URL は
https://data.iot.ap-northeast-1.amazonaws.com/#{deviceId}
のように指定してください
- 対象の LoRa デバイスを選択 > [操作] > [所属グループ変更]
- 先ほど作成した LoRa グループ に所属させる
Arduino とパソコンを USB ケーブルで接続してください
注意点
- この時点で温度センサー (LM61CIZ) が 「とても高熱になった」「焦げ臭い匂いがする」 場合は、USBケーブルを抜いて Arduino を停止し、再度接続を確認してください
※ここで紹介するスケッチは 「LoRaWANでデータ送信をしてSORACOM Harvestで可視化する」で使用したスケッチと全く同一のものです。そのため、続けて行う場合は本手順はスキップできます
ファイル > 新規ファイル を選択すると、新たなスケッチウィンドウが立ち上がります
骨組みコードが書かれていますが すべて削除したうえで 下記スケッチを張り付けて「マイコンボードに書き込む」をしてください
※スケッチの保存を聞かれた場合は handson_tmpr_lorawan
と保存しましょう(ファイル名は任意でかまいません。また、続けて行っている場合は上書きとなりますが、同一の内容ですので問題ありません)
#define SENSOR_PIN 0 //analog pin
#define PROBE_INTERVAL 5000 //msec
#include <lorawan_client.h>
LoRaWANClient lorawan;
void setup() {
Serial.begin(9600);
if(! lorawan.connect(true))
{
Serial.println(" failed to connect. Halt...");
for(;;){};
}
Serial.println("\nConnected.\n");
}
void loop() {
int mV = analogRead(SENSOR_PIN);
int dv = map(mV, 0, 1023, 0, 5000);
unsigned long tmpr = map(dv, 300, 1600, -30, 100); /* NOTE: Map by DataSheet */
Serial.println(tmpr);
lorawan.sendData(tmpr);
delay(PROBE_INTERVAL);
}
AWS IoT Core 上でのデータ着信は、運営側で行いますので、送信し始めたら運営に声をおかけください
正しく送信されていれば、運営側で表示している AWS IoT Core のデータモニターツールに表示されます
自前の AWS アカウントを利用している場合には、本ページ末の Appendix: 自分の AWS アカウントを使う を参考にして データを確認してみましょう
動作が確認出来たら Arduino を停止します
おつかれさまでした
LoRaWAN ハンズオンは以上で終了です。最後に注意点の確認をお願いいたします
SORACOM Air for LoRaWAN の費用はご利用料金 - LoRaデバイス ならびにご利用料金 - LoRaゲートウェイ をご覧ください
本ハンズオンで使用した SORACOM Harvest は、実際の通信の有無に限らず SORACOM Harvest が利用可能状態の LoRa デバイスの数に応じて日当たりのオプション料金が発生します
ハンズオンが終了したら必ず設定を確認し、不要な課金が発生しないようにしてください
費用については ご利用料金 - LoRaデバイス をご覧ください
以下、片付け方法です
Menu > LoRa グループ をクリックすると、LoRa グループ一覧が表示されます
LoRa グループ一覧の中から lora_demo0
をクリックします
SORACOM Harvest 設定 を下記の通りにした後 保存 をクリックしてください
※ONの時に出た様なダイアログは出ません
- OFF
LoRa グループの SORACOM Harvest 設定が OFF になっていれば SORACOM Harvest の費用は発生しませんが、今後の不要な課金を避けるためにも削除をお勧めします
手順は以下の通り
- 削除対象の LoRa グループに所属しているLoRaデバイスをすべて解除する
- 削除対象の LoRa グループを表示し 高度な設定 から削除を実行する
本ハンズオンで使用した SORACOM Funnel は、発生したリクエストに応じた課金がされるサービスです
詳細は ご利用料金 - LoRaデバイス をご覧ください
クーポンコードの使い方をご覧ください
※その他クーポンに関する注意事項もご参照ください
LoRa デバイスを初期化しておくことで、次回起動時に不用意な通信などを防ぐことができます
作業としては「空っぽのスケッチ」を書き込むことで、初期化できます
- Arduino IDE を起動する
- Arduino IDE の [ファイル] > [新規ファイル]
- Arduino を PC を接続する
- 新しく開いたウィンドウの (マイコンボードに書き込む) をクリック
- 書き込みが完了すれば、初期化完了です
Download the Arduino IDEから、OSにあったファイルをダウンロードし、インストールしてください
- "Support the Arduino Software" のページで JUST DOWNLOAD を選べばダウンロードできます (もう一方のボタンは寄付のページに飛ばされますのでご注意)
- Windowsの場合: Windows Installer をダウンロードしてください。また、インストールは管理者権限で行ってください
- macOSの場合: インストール時に Java SE も同時にインストールを要求される場合があります。 Java SE もインストールしてください
インストールが終われば がデスクトップやスタートメニューに現れるので、これで起動可能です
LoRa 開発シールドの DevEUI (LoRaWAN におけるデバイス ID) はソラコムで管理※しており、ご利用者が直接管理する必要がありません
その代わりに、ご購入いただき LoRa 開発シールドがお手元に届きましたら 受け入れ をソラコムコンソールから行っていただく必要があります
※2018年3月現在
Menu > 発注 をクリックしてください。受け入れ可能な LoRa 開発シールドには 受け取り確認 が表示されているので、受け取り確認をクリックしてください
これで Menu > LoRa デバイス管理 に受け取り確認ができたデバイスが一覧に表示され、利用準備が整います
詳細はLoRaWAN ゲートウェイ/デバイス ハードウェアセットアップガイドをご覧ください
バイナリパーサーとは、ビット列で構成されたバイナリデータをルールに沿って JSON 化する、SORACOM 独自の機能です
バイナリ化することで 1回あたり約10バイト程度しか送信できない LoRaWAN や Sigfox の通信でも、多くの情報を詰め込むことができるようになりますが、バイナリデータはクラウド側では扱いに不便であることは否めません
本機能は、そのような LPWA デバイスとクラウドの橋渡しをする機能です
今回バイナリパーサー設定として、tmpr_c:2:uint:16
を指定していますが、これは以下のような意味となります。
- 2 バイトめから、16 bit 分を取り、uint(±のない正の整数) として解釈し、それを "tmpr_c" というパラメータとする
※先頭1バイトは AL-050 の仕様により0h00
が入るため2バイト目から取得しています
例えば複数のデータを混載して送りたい場合は
unsigned long payload = ( (unsigned long)temperature << 16 ) + (unsigned long)humidity;
としたうえで、バイナリパーサー設定を tmpr:0:uint:16 hmd::uint:16
と、複数のデータを一度に送ることができます。
またクラウド側では
{
"tmpr": 25,
"hum": 33
}
といった JSON で受け取ることができます
ここでは、参加者自身の AWS アカウントを用いてハンズオンを行う場合の準備について解説します。
AWS IoT へデータを送信する事が出来るユーザを作成します。
-
こちらのリンクから、AWS IAM のコンソールを開きます
-
ユーザ名は、"AWSIoT"等、わかりやすい名前をつけ、APIキーが必要なので "プログラムによるアクセス" のチェックボックスを付け、次のステップへ進みます
-
既存のポリシーを直接アタッチを選び、
iotdata
と検索窓に入れ、AWSIoTDataAccess
にチェックボックスを入れ、次のステップに進みます -
確認画面で、ユーザの作成をクリックします
-
完了画面では、アクセスキーIDと、シークレットアクセスキーをどこかに保存しておきます(CSVファイルをダウンロードしてもよい)
このアクセスキーIDとシークレットアクセスキーを使って、Funnel の設定を行ってください。
-
AWS IoT のコンソール左側のメニューから、Test ページを開きます。
-
Subscription topic に
#
を入力し、[Subscribe to topic]ボタンを押します
- データが受信されると、JSON形式でデータが表示されます。
AWS IoT の持つルールエンジンを使って、センサーデータを様々な AWS サービスへ連携することが出来ます。
連携可能なアクションの一覧は下記のようになっています。
たとえば...
- S3 にセンサーデータを保存する
- 温度が一定以上の値だった場合に、SNS で通知を行う
- CloudWatch のカスタムメトリクスとしてグラフの描画や、アラート設定を行う
など、色々な組み合わせを試してみましょう。