dragino社製LoRaゲートウェイLG01-JPでTTN(The Thing Network)に繋いだ（つながったとは言っていない）話

## はじめに
[https://qiita.com/openwave-co-jp/items/ece578bb51d748f11f71](https://qiita.com/openwave-co-jp/items/ece578bb51d748f11f71)
を参考にLG01-JPのLoRaWANゲートウェイとLoRa mini Dev-JPを使ったエンドデバイスでとりあえず"Hello, World!"を送ろうとしました。

ただやり方が悪いのか諸々環境が変わってきたのか、記事のとおりだと何故か上手く行かず・・・試行錯誤した忘備録です。

## 1, TTN(The Thing Network)の設定
基本的には[https://qiita.com/openwave-co-jp/items/ece578bb51d748f11f71](https://qiita.com/openwave-co-jp/items/ece578bb51d748f11f71)、#1~#3のとおりで大丈夫でしたので割愛します。

## 2, ゲートウェイ（LG01-JP）の設定

初期ユーザー名/初期パスワードは root/dragino です
ちなみにWAN側に割り振られたIPアドレスへ、WANと同じサブネットからブラウザでアクセスしても（確認が取れるファームウェア4.3.4では）管理画面が開ける

### 2-1 ファームウェアアップデート
まずLG01-JPのファームウェアのバージョンを確認します。
バージョンは上部メニューのStatus→Overviewから確認できます。
![2018-11-08.PNG](https://qiita-image-store.s3.amazonaws.com/0/213714/f003ebe9-a112-8d09-fdca-5ba778b45868.png)
バージョンが4.3.4より下の場合、ファームウェアをアップデートする必要があります。
メーカー(dragino社)からファームウェアをダウンロードします。
[http://www.dragino.com/downloads/index.php?dir=motherboards/ms14/Firmware/IoT/IoT--build-v4.3.4-20180507-1426/](http://www.dragino.com/downloads/index.php?dir=motherboards/ms14/Firmware/IoT/IoT--build-v4.3.4-20180507-1426/)
LG01-JPのSystem→Backup/Flash Firmwareからアップデートを行えます。
![2018-11-08-02.PNG](https://qiita-image-store.s3.amazonaws.com/0/213714/786df573-b311-cc95-2215-1715afe881c8.png)

### 2-2 Arduino Sketchの書き込み
LG01-JP（どうやらArduino Yunベースらしい）へ、LoRaモデムで受信したデータをそのままIP経由で転送するためのArduinoスケッチを書き込みます。
[冒頭の記事](https://qiita.com/openwave-co-jp/items/ece578bb51d748f11f71)より新しいスケッチが発売元より公開されているようなので、こちらを利用します。
[http://www.dragino.com/downloads/index.php?dir=motherboards/lg01/sketch/](http://www.dragino.com/downloads/index.php?dir=motherboards/lg01/sketch/)から「Single_pkt_fwd_v004.ino.hex」をダウンロードします。
これを上部メニューのSensor→Flash MCUの画面でLG01-JPへ書き込みます。

### 2-3 IoT Serverの設定
Sensor→IoT Serverの画面から「IoT Server」にプルダウンメニューのなかから「LoRaWAN」を選択します。
選択したら「Apply & Setting」を押して設定を反映させます。

このへんどういう設定なのかいまいちよくわからないのですが、察するにLG01にはLoRa WANゲートウェイ以外にもいろんな機能があるのだろうと思います。

### 2-4 LoRa Gatewayの設定
上部メニューのSensor→LoRa / LoRa WAN　から設定します。
この辺から[冒頭の記事](https://qiita.com/openwave-co-jp/items/ece578bb51d748f11f71)と違いが大きくなってきます。

![2018-11-08-03.png](https://qiita-image-store.s3.amazonaws.com/0/213714/fdaa8da7-29d8-5931-8855-826b6f4b1381.png)

#### LG01からTTNへの接続設定
まずLoRaWAN Serverの設定です。この部分ではLG01-JPとTTNとの接続の設定を行うようです。
以下のように設定しました

* Server Address: router.as1.thethings.network
* Server Port: 1700
* Gataway ID: TTNで設定したGataway EUI
* Mail Address: 実在する任意のメールアドレス（で大丈夫なはずです）

ゲートウェイの地理情報は空白でも大丈夫でした。
ゲートウェイ（LG01-JP）なんですが、設定入れてから実際につながるまで、コンソール上のステータスが"connected"に変わるまで結構時間かかるようです・・・
ちなみに、TTNのコンソール上では冒頭の記事と同じく選択するRouter"ttn-router-asia-se"を選択したのですが、この画面でServer Addressには"router.as1.thethings.network"を設定しました。元の記事通りでもつながる気はします。

#### LG01-JPが取り扱うLoRaの電波の設定
Radio Settingsの項目で、ゲートウェイが発信するLoRaの周波数等電波の設定を変えられるようです。
以下のように設定します

* TX Frequency: 923200000
* RX Frequency: 923200000
* Encryption Key: 空白
* Spreding Factor: SF7
* Transmit Spreding Factor: SF9
* Coding Rate: 4/5
* Signal Bandwidth: 125kHz
* Preamble Length: 8

設定し終えたら「Save & Apply」ボタンを押して設定を保存・反映させます。
Spreding Factorが冒頭の記事と異なるのは、エンドデバイスで冒頭の記事とは異なる設定を用いるためです。

これでLG01-JPの設定は終わり（のはず）です。

## 3, エンドデバイス(Dragino mini Dev-JP)の設定
Arduino Unoベースで、SPIバスを介してでLoRaモデムと接続されているようです。
UART-USB変換モジュールにCH340というものを使用しているので、もしPCから認識しないようならCH340のドライバをインストールしてください。

### 3-1 サンプルコードの用意とネットワークキーなどの編集
Dragino社が[github上で公開](https://github.com/dragino/Arduino-Profile-Examples/blob/master/libraries/Dragino/examples/LoRa/LoRaWAN/Arduino_LMIC/Arduino_LMIC.ino)しているサンプルコードをダウンロードしてください。
そして、36行目~50行目をTTNのコンソール上で表示されているものに変更します。
Applications→任意のアプリケーション名→Devices→任意のデバイス名 の部分で確認します。

```c++
// LoRaWAN NwkSKey, network session key
// This is the default Semtech key, which is used by the prototype TTN
// network initially.
//ttn
static const PROGMEM u1_t NWKSKEY[16] = { 0xB3, 0xC2, 0x99, 0x8A, 0x2B, 0x04, 0x83, 0x5A, 0x34, 0xF6, 0xF1, 0x2E, 0x5A, 0x5F, 0xF8, 0x17 };
// 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] = { 0xE6, 0xA3, 0xC2, 0x13, 0x08, 0xFF, 0x89, 0xA0, 0x5B, 0x41, 0x39, 0x83, 0xC7, 0xFD, 0xB6, 0xAA };
//
// LoRaWAN end-device address (DevAddr)
// See http://thethingsnetwork.org/wiki/AddressSpace
// ttn
static const u4_t DEVADDR = 0x26011880;

```

* NWKSKEY: TTNコンソール上のNetwork Session Key
* APPKEY: TTNコンソール上のApp Session Key
* DEVADDR: TTNコンソール上のDevice Address

このコードがきちんと動作すると60行目のこの部分(ちなみにa(のASCIIコード) = 0x61)がTTNへ定期的に送信されるはずです。

```c++
static uint8_t mydata[] = "abcdefg";
```


### 3-2 Arduino-lmic ライブラリのインストールと設定
上記のまま実行してもlmic.hがないと言われてコンパイルエラーが出るので、Android-lmicライブラリをインストールします。
github上でいろいろフォークされてて何が何やらわからりにくいですが、今回は以下のものを使用しました。
[https://github.com/mcci-catena/arduino-lmic](https://github.com/mcci-catena/arduino-lmic)
日本の周波数設定がもともと用意されてる・・・ありがたや・・・・

デフォルトだとおそらくアメリカの周波数で動き出すので、日本の周波数を使用するように設定を変更します。```project_settings/lmic_project_config.h```を編集することでこの設定を変えられるようです。
Arduino IDEのメニューの「スケッチ」→「ライブラリをインクルード」→「.ZIP形式のライブラリをインストール」からインストールした場合、ライブラリは```C:\Users\ユーザー名\Documents\Arduino\libraries\```にインストールされます。
この中の```\arduino-lmic-master\project_config```にある```lmic_project_config.h```を編集し以下のようにします。

```c++　lmic_project_config.h

// project-specific definitions
//#define CFG_eu868 1
//#define CFG_us915 1
//#define CFG_au921 1
#define CFG_as923 1
#define LMIC_COUNTRY_CODE LMIC_COUNTRY_CODE_JP	/* for as923-JP */
//#define CFG_in866 1
#define CFG_sx1276_radio 1
//#define LMIC_USE_INTERRUPTS
```

3行目'''#define CFG_us915 1'''をコメントアウトし、5行目と6行目のコメントアウトを解除します。

これで設定は完了・・・のはずです。

## 4 動作確認とシングルチャンネルゲートウェイ

最後にコンソール画面上からデータがアップリンクしてくるのを確認します。
![2018-11-09-04.png](https://qiita-image-store.s3.amazonaws.com/0/213714/15dbd4f6-593f-ec50-a86b-e8fc801e348e.png)

データ来てるの確認できたしこれで終わりヽ(=´▽`=)ﾉ・・・と思いきや2回に1回はデータを受信できていません。
これは多分設定で回避できるんでしょうが、デフォルトの設定だとこうなる理由として、LG01がsingle channel gateway にしかできないからというのがあるようです。
フル機能のLoRaWAN Gatawayは8チャンネルとか同時にLoRaを待ち受けできるようですが、LG01は同時に1チャンネルしか搭載しているハードウェアの制約上待ち受けできないそうです。
今回利用したArduino-lmicライブラリは（何故か2チャンネルだけしか使ってないですが）923.2MHzと923.4MHzで交互にデータを送信するようになっています。8チャンネルのLoRaWAN Gatawayならばどちらもきちんと受信できます。しかし、シングルチャンネルゲートウェイであるLG01は、今回2-4で923.2MHzを利用するよう設定したので、923.2MHｚで送信されたデータのみしか受信できないため、このような形になってしまうと推測されます。
詳しくは[http://wiki.dragino.com/index.php?title=LoRa_Questions#What_is_the_difference_between_LG01_single_channel_gateway_and_a_8-channel_LoRaWAN_gateway.3F](http://wiki.dragino.com/index.php?title=LoRa_Questions#What_is_the_difference_between_LG01_single_channel_gateway_and_a_8-channel_LoRaWAN_gateway.3F)

最後までお付き合いいただき、ありがとうございました。

## 参考にしたサイト
* [https://qiita.com/openwave-co-jp/items/ece578bb51d748f11f71](https://qiita.com/openwave-co-jp/items/ece578bb51d748f11f71)
* [http://wiki.dragino.com/index.php?title=Connect_to_TTN#Create_Single_Channel_Gateway_By_LG01](http://wiki.dragino.com/index.php?title=Connect_to_TTN#Create_Single_Channel_Gateway_By_LG01)
* [http://wiki.dragino.com/index.php?title=Connect_to_TTN#Use_LoRa_Shield_and_Arduino_as_LoRa_End_Device](http://wiki.dragino.com/index.php?title=Connect_to_TTN#Use_LoRa_Shield_and_Arduino_as_LoRa_End_Device)
* [http://wiki.dragino.com/index.php?title=LoRa_Questions#What_is_the_difference_between_LG01_single_channel_gateway_and_a_8-channel_LoRaWAN_gateway.3F](http://wiki.dragino.com/index.php?title=LoRa_Questions#What_is_the_difference_between_LG01_single_channel_gateway_and_a_8-channel_LoRaWAN_gateway.3F)