これまでのお話
- LoRaでIoTプラットフォーム(ThingSpeak)にデータを上げる方法
- LoRaWANでIoTプラットフォーム(The Things Network)にデータを上げる方法
- LoRaにGPSを付けて、会社の周りを歩いてみた(Google Earthで位置情報をプロットする)
- 複数のLoRaノードをゲートウェイにアクセスさせるときに気を付けること
- LoRa機器の受信強度(RSSI)の取得方法
- LoRaと法律の関係について
イントロダクション
以前の投稿で、LoRaWANへの接続の方法をご紹介しましたが、このほどDragino社のゲートウェイLG01-P-JPのファームがアップデートがありまして、そちらを使うとより簡単にLoRaWANへ接続できるようになりました。
今回はファームのアップデートから、LoRaWANに接続するまでをまとめたいと思います。
使用する機器は、弊社(株式会社オープンウェーブ)のLoRa IoT スターターキット、接続するIoTプラットフォームにはThe Things Network(以降TTN)となります。
全体像
デバイス:LoRa Mini
ゲートウェイ:LG01-JP
デバイスの固定文字列「Hello, world!」を、LoRaWANプロトコルでTTNへ送信します。
使用ハードウェア
- Dragino社のLoRa IoT スターターキット
- Dragino LG01-JP:LoRaゲートウェイ
- Dragino LoRa mini:LoRaノード
ファームのアップデートファイル
今回アップデートするファームウェアのバージョンはfirmware 4.2.3です。
ビルド済みArduinoプログラム
ゲートウェイのArduino部分のプログラムは、コンパイルされた実行ファイルを直接取り込みます。
使用ソフト
- Arduino用LMiCのライブラリ(下記をダウンロードして、Arduino IDEのライブラリにインクルードしておく)
https://github.com/matthijskooijman/arduino-lmic
使用プログラム
- LoRaWANExample/lora-arduino/lora-arduino.ino →デバイス(LoRa mini)
手順
ファームウェアのアップデート
TeratermなどでLG01-P-JPにログインし、バージョンが4.2.3より前のバージョンであれば、ファームウェアのアップデートを行います。
ファームウェアファイルのインストール
LG01-P-JPにブラウザでアクセスし、「System」→「Backup/Flash Fireware」を開きます。
ダウンロードした「dragino-IoT--v4.2.3-squashfs-sysupgrade.bin」を下記の項目からアップロードします。
TTNの設定
アプリケーションとデバイスの登録
TTNにアカウントを作成し、アプリケーションの登録と、そのアプリケーションにデバイスを登録します。
アプリケーションは作成後、ABPに変更します。(デフォルトはOTAA)
デバイスを作成した時に得られた、Network Session Key、App Session Key、Device Addressを控えます。
)
ゲートウェイの登録
次の点に注意し、TTNでゲートウェイを作成します。
- 予めLG01-JPにTeraTerm等でログインし、MACアドレス※1を控えておきます
- TTNでゲートウェイの登録を行います
- 「I'm using the legacy packet forwarder」を選択した上で作成します
- Gateway IDはLG01-JPのMACアドレスを上3桁、FF、FF、下三桁で登録します
- 例:MACアドレス「AA BB CC 11 22 33」の場合「AA BB CC FF FF 11 22 33」となる
- 他は適宜設定します※2
※1:MACアドレスについて、LG01-JPには複数あります。(WiFiと有線の口ですね)
WiFiと有線のどちらのMACアドレスを使うのか?という疑問が出てくるかと思いますが、実はどちらでも構いません。
※2:ゲートウェイの接続先ルータの設定について。
ゲートウェイのプログラミングでは、現在router.au.thethings.network(オーストラリア)のサーバへ接続しています。
そのため、下記の設定では、アジアのルータを設定してください。
ゲートウェイのプログラミング
ゲートウェイでは、LoRaでデバイスからデータを受信し、TTNにデータをアップロードするArduinoのプログラムを書き込みます。
ダウンロードした「single_pkt_fwd_v002.hex」をアップロードします。
ゲートウェイの設定
バージョン4.2.3のファームウェアでは、ブラウザ上からLoRaWANの設定を行います。
LoRaWANのゲートウェイの設定に合わせて、各項目を設定します。
下にスクロールすると、LoRaのチャネルの設定があります。
以降のLMiCのライブラリの設定に合わせて、LoRaの周波数を指定してください。
デバイスのプログラミング
デバイス側では、LMiCライブラリの修正とデバイス情報の設定が必要になります。
LMiCライブラリの修正
LMiCとは、IBMが作成した暗号化を含めたLoRaのMACプロトコル→LoRaMACのライブラリです。(LoraMac in Cの略)
2017/3現在のLMiCライブラリ(v1.5ベース)は、EUとUS基準の無線周波数の設定が用意されています。そのまま日本では使えないので、とりあえず簡単に日本で使っても良い設定に変更します。
Arduino IDEを通常通りインストールすると、インクルードしたライブラリは\Documents\Arduino\librariesに配置されます。
\Documents\Arduino\libraries\arduino-lmic-master\src\lmic\lorabase.hを開き、EUの設定を書き換えます。
// Default frequency plan for EU 868MHz ISM band
// Bands:
// g1 : 1% 14dBm
// g2 : 0.1% 14dBm
// g3 : 10% 27dBm
// freq band datarates
enum { EU868_F1 = 868100000, // g1 SF7-12
EU868_F2 = 868300000, // g1 SF7-12 FSK SF7/250
EU868_F3 = 868500000, // g1 SF7-12
EU868_F4 = 868850000, // g2 SF7-12
EU868_F5 = 869050000, // g2 SF7-12
EU868_F6 = 869525000, // g3 SF7-12
EU868_J4 = 864100000, // g2 SF7-12 used during join
EU868_J5 = 864300000, // g2 SF7-12 ditto
EU868_J6 = 864500000, // g2 SF7-12 ditto
};
enum { EU868_FREQ_MIN = 863000000,
EU868_FREQ_MAX = 870000000 };
// Default frequency plan for EU 868MHz ISM band
// Bands:
// g1 : 1% 14dBm
// g2 : 0.1% 14dBm
// g3 : 10% 27dBm
// freq band datarates
enum { EU868_F1 = 923200000, // g1 SF7-12
EU868_F2 = 923200000, // g1 SF7-12 FSK SF7/250
EU868_F3 = 923200000, // g1 SF7-12
EU868_F4 = 923200000, // g2 SF7-12
EU868_F5 = 923200000, // g2 SF7-12
EU868_F6 = 923200000, // g3 SF7-12
EU868_J4 = 923200000, // g2 SF7-12 used during join
EU868_J5 = 923200000, // g2 SF7-12 ditto
EU868_J6 = 923200000, // g2 SF7-12 ditto
};
enum { EU868_FREQ_MIN = 920600000,
EU868_FREQ_MAX = 928000000 };
デバイスのプログラミング
「使用プログラム」のlora-arduino.inoを、Arduino IDEで開きます。
「アプリケーションとデバイスの登録」で控えたNetwork Session Key、App Session Key、Device Addressで下記を書き換えます。
//ttn
static const PROGMEM u1_t NWKSKEY[16] = { 0x19, 0x7C, 0x79, 0x8E, 0x6D, 0xDE, 0xEB, 0xA6, 0x92, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0FF, 0xFF };
// LoRaWAN AppSKey, application session key
// This is the default Semtech key, which is used by the prototype TTN
// network initially.
//ttn
static const u1_t PROGMEM APPSKEY[16] = { 0x07, 0x8C, 0xB1, 0x4F, 0x1E, 0xAD, 0x39, 0x4A, 0x99, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0FF, 0xFF };
// LoRaWAN end-device address (DevAddr)
// See http://thethingsnetwork.org/wiki/AddressSpace
//ttn
static const u4_t DEVADDR = 0x2600FFFF;
このソース内でmydataという変数が、送信するデータです。
→LoRa miniに書き込み
接続確認
Payloadの「48656C6C6F2C20776F726C6421」が、デバイスのmydataになります。
この数字をASCII文字で表現すると、「Hello, world!」になります。
最後に
今回のファームアップデートでは、LoRaWANゲートウェイの使い勝手が格段に良くなったと思います。
弊社からDragino社への情報提供もあってか、ファームウェアとArduinoプログラムの構成は、以前の投稿のプログラムと似ている部分があります。(我々がpythonで作った部分をファームウェアのCプログラムに置き換えたような構造です)
Dragino社の製品はファームウェアもソースがオープンなので、内容を見てみるのも面白いかと思います。
注意
プログラミングにはArduino IDEを使用しますが、事前にArduino IDEに次の設定が必要です。
- Dragino向けの設定をしておく必要があります。
http://www.ibeacondo.com/download/LG01_LoRa_Gateway_Manual_JP.pdf - 次のライブラリを検索してインクルードしておく必要があります。
- 「LoRa」(LoRaライブラリ)
この記事で使用するソースは、使用するハードに依存している部分が大きいため、他のハードとの組み合わせでどうなるかは分かりません。
また、今回使用したプログラムは、LoRaWANの仕様を完全に満たしているわけではありません。(最も簡単なLoRaWANによるデータのアップロードをしているだけです。パケットのカウントや、SN比の算出など、ゲートウェイやデバイスの状態を表す値の取得の実装もダミーで実装しています。)