mattintosh note

田舎エンジニア物語 〜In Search of the Lost My Private Key〜

LoRa モジュール RAK811 WisDuo Lora Module で TTN に接続する

SX1276 と STM32L を搭載した RAK 社製の LoRa モジュールを AliExpress で入手した。AK811 を選んだ理由は下記の通り。

f:id:mattintosh4:20190822175421p:plain
RAK811 WisDuo LoRa Module

  • 小さい(大事)
  • 値段が安い(だいたい $15 くらい)
  • ARM 環境での開発にちょっと興味があった

RAK811 は ARM 開発環境が無くても AT コマンドで LoRaWAN や LoRaP2P の設定ができるようなので今回は AT コマンドで遊んでみる。

RAK811 に関する情報収集

物は届いたのでまずは情報収集から始めた。

  • ピンヘッダは 2 mm ピッチなのでそのままではブレッドボード等に挿すことはできない。XBee のピッチ変換基板が流用できるっぽい?(海外掲示板情報)
  • ドキュメントにはファームウェアの更新方法が記載されているが、3.0.0.x 系の場合は BOOT ピンを使わなくてよい。(ドキュメントには If the firmware of your RAK811 WisNode is V3.0.0.0 or a newer one, just jump this section. と書かれている)
  • ファームウェアの更新には RAK LoRaButton Upgrade Tool というソフトを使うがこれが Windows しか対応していない様子(Wine でもなんとかできるかも)

ブートモードからノーマルモードに戻せない

これを先に書いておきたい。picocom コマンドで at+set_config=device:boot を送ってブートモードに移行すると AT コマンドを受け付けてくれなくなるため、at+run を送ってノーマルモードに戻すということができなくなる。この状態になってしまった場合はシェルのリダイレクトを使って at+run を書き込むことでノーマルモードに戻すことができる(ここでの USB シリアルアダプタのパスは /dev/ttyUSB0 だが環境によって異なる)。Arduino IDE のシリアルコンソールで改行コードを Both NR & CR に設定して AT コマンドを叩くという方法でも OK。何故か picocom のときはこうなる。

$ printf 'at+run\r\n' >/dev/ttyUSB0
Stop Boot Mode


========================================================
______  ___   _   __  _    _ _          _               
| ___ \/ _ \ | | / / | |  | (_)        | |              
| |_/ / /_\ \| |/ /  | |  | |_ _ __ ___| | ___  ___ ___ 
|    /|  _  ||    \  | |/\| | | '__/ _ \ |/ _ \/ __/ __|
| |\ \| | | || |\  \ \  /\  / | | |  __/ |  __/\__ \__ \
\_| \_\_| |_/\_| \_/  \/  \/|_|_|  \___|_|\___||___/___/
========================================================
********************************************************
RAK811 Version:3.0.0.3.H
********************************************************
========================================================

ファームウェアの更新

購入時のファームウェアは 3.0.0.0 だったが、一部のコマンドの改行がおかしかったので 3.0.0.3.H に更新した。ここでは RAK LoRaButton Upgrade Tool V1.0 を使用してファームウェアを V3.0.0.0.H から V3.0.0.3.H へ更新する。

最新のファームウェアは下記のページからダウンロードできる。

USB シリアルアダプタとの接続は VCCGNDTXRX のみで BOOT は接続不要。シリアル接続時の設定は下記の通り。

  • ボーレート: 115200
  • フローコントロール: オフ
  • パリティ: オフ
  • データビット: 8
  • ストップビット: 1

ここでは picocom コマンドを使用するが、Arduino IDE のシリアルコンソールでも設定可能。ローカルエコーを有効にしておかないと入力したコマンドが見えないので注意(見えなくても慣れればそのまま操作できるけど)。

Terminal

$ picocom -b 115200 --echo /dev/ttyUSB0

まずはブートモードに変更する。

AT Command

at+set_config=device:boot

Result

work in Boot mode now...
<BOOT MODE>

ブートモードに設定できたら Ctrl + aCtrl + xpicocom を終了する。この状態で RAK LoRaButton Upgrade Tool で新しいファームウェアRUI_RAK811_V3.0.0.3.H.bin 等)を選択して[Start]を押せば新しいファームウェアが書き込まれる。

macOSLinux の場合はどうするのか?

Windows 10 の評価版などを入手して VirtualBox にインストールしてホストの USB シリアルポートをバイパスさせることでゲストの Windows 10 から RAK LoRaButton Upgrade Tool を使って書き込みができる。Wine でもなんとかできるかも。

stm32flash についてはまだ試していない。

TTN への接続(OTAA)

デフォルトでは OTAA モードになっているが ABP でもほとんど変わらない。

まずは get_config=lora:status で現在の状態を確認する。

AT Command

at+get_config=lora:status

Region が AS923 になっていないのと DevEUI、AppEui、AppKey などが設定されていないのでこれらを設定していく。

Result

OK.
*************************************************
==============LoRaWAN Status List================
Region: EU868
Join_mode: OTAA
DevEui: 0000000000000000
AppEui: 0000000000000000
AppKey: 00000000000000000000000000000000
Class: A
Joined Network:false
IsConfirm: false
Work Mode: LoRaWAN
AdrEnable: true
EnableRepeaterSupport: false
RX2_CHANNEL_FREQUENCY: 869525000, RX2_CHANNEL_DR:0
RX_WINDOW_DURATION: 3000ms
RECEIVE_DELAY_1: 1000ms
RECEIVE_DELAY_2: 2000ms
JOIN_ACCEPT_DELAY_1: 5000ms
JOIN_ACCEPT_DELAY_2: 6000ms
Current Datarate: 5
Primeval Datarate: 5
ChannelsTxPower: 0
UpLinkCounter: 0
DownLinkCounter: 0
AntennaGain: 2.15
===================List End======================
*************************************************

Region の設定

周波数は下記のコマンドだけで設定できる。設定可能な値は EU868EU433CN470IN865EU868AU915US915KR920AS923。日本で使用できるのは AS923

AT Command

at+set_config=lora:region:AS923

デフォルトのデバイス EUI が返ってくるが TTN のコンソールで発行できるので控えておかなかったとしても問題はない。

Result

DEFAULT DEV_EUI = 9B0100089D010008
Selected LoRaWAN 1.0.2 Region: AS923
Band switch success.
OK

Region が変更されたか確認する。

AT Command

at+get_config=lora:status

Region が AS923 に変更されている。周波数の値も 923200000 になっている。

Result

OK.
*************************************************
==============LoRaWAN Status List================
Region: AS923
Join_mode: OTAA
DevEui: 0000000000000000
AppEui: 0000000000000000
AppKey: 00000000000000000000000000000000
Class: A
Joined Network:false
IsConfirm: false
Work Mode: LoRaWAN
AdrEnable: true
EnableRepeaterSupport: false
RX2_CHANNEL_FREQUENCY: 923200000, RX2_CHANNEL_DR:2
RX_WINDOW_DURATION: 3000ms
RECEIVE_DELAY_1: 1000ms
RECEIVE_DELAY_2: 2000ms
JOIN_ACCEPT_DELAY_1: 5000ms
JOIN_ACCEPT_DELAY_2: 6000ms
Current Datarate: 5
Primeval Datarate: 5
ChannelsTxPower: 0
UpLinkCounter: 0
DownLinkCounter: 0
AntennaGain: 2.15
===================List End======================
*************************************************

バイス EUI、アプリケーション EUI、アプリケーションキーの登録

TTN Console でデバイスを登録したら各値を控えておく。EUI は 16 桁、KEY は 32 桁の 16 進数。

dev_eui: 9B59615D543BC6F3
app_eui: 240A0F2375D286F8
app_key: 62DC6A9880FBE606F3503DB057946817

バイス EUI の登録

AT Command

at+set_config=lora:dev_eui:9B59615D543BC6F3

Result

OK

アプリケーション EUI の登録

AT Command

at+set_config=lora:app_eui:240A0F2375D286F8

Result

OK

アプリケーションキーの登録

注:OTAA の場合は lora:app_key、ABP の場合は lora:apps_key なので間違わないように注意。

AT Command

at+set_config=lora:app_key:62DC6A9880FBE606F3503DB057946817

Result

OK

設定を確認する

EUI などが設定されているか確認する。「Joined Network」はまだ false

AT Command

at+get_config=lora:status

Result

OK.
*************************************************
==============LoRaWAN Status List================
Region: AS923
Join_mode: OTAA
DevEui: 9B59615D543BC6F3
AppEui: 240A0F2375D286F8
AppKey: 62DC6A9880FBE606F3503DB057946817
Class: A
Joined Network:false
IsConfirm: false
Work Mode: LoRaWAN
AdrEnable: true
EnableRepeaterSupport: false
RX2_CHANNEL_FREQUENCY: 923200000, RX2_CHANNEL_DR:2
RX_WINDOW_DURATION: 3000ms
RECEIVE_DELAY_1: 1000ms
RECEIVE_DELAY_2: 2000ms
JOIN_ACCEPT_DELAY_1: 5000ms
JOIN_ACCEPT_DELAY_2: 6000ms
Current Datarate: 5
Primeval Datarate: 5
ChannelsTxPower: 0
UpLinkCounter: 0
DownLinkCounter: 0
AntennaGain: 2.15
===================List End======================
*************************************************

LoRa ネットワークに JOIN する

EUI の準備などができたので LoRa ネットワークに JOIN する。

AT Command

at+join

Result

OTAA:
DevEui:9B59615D543BC6F3
AppEui:240A0F2375D286F8
AppKey:62DC6A9880FBE606F3503DB057946817
OTAA Join Start... 
OK
[LoRa]:Joined Successed!

成功すれば TTN の Console にアクティベーションのログが残っているはず。電源を切っても復帰すれば自動的に JOIN してくれる。

TTN にデータを送る

ドキュメントによれば at+send は 50 bytes まで 16 進数でなければならないとある。適当に 1 バイトのデータを送ってみる。

AT Command

at+send=lora:1:00

Result

OK
[LoRa]: Unconfirm data send OK

データタブで受信できているか確認する。

/// image ///

デコーダを設定して値を整形する

TTN には Payload Formats という機能があり、値を変換したりすることができる。下記はデコーダのデフォルトサンプル。

Payload Formats (Decoder)

function Decoder(bytes, port) {
  // Decode an uplink message from a buffer
  // (array) of bytes to an object of fields.
  var decoded = {};

  // if (port === 1) decoded.led = bytes[0];

  return decoded;
}

サンプルを消して単純に数値を文字に変換する処理を入れてみる。返り値はオブジェクトで返す必要がある。

Payload Formats (Decoder)

function Decoder(bytes, port) {
  var a = [];
  for (var i=0; i<bytes.length; i++) {
    a.push(String.fromCharCode(bytes[i]));
  }
  return {
    message: a.join("")
  }
}

シェルで Hello, world! という文字列を 16 進数に変換する。

Terminal

$ printf 'Hello, world!' | hexdump -e '50/1 "%02x"' | tr -d ' '
48656c6c6f2c20776f726c6421

Hello, World! を 16 進数に変換した結果を at+sendTTN に送る。

AT Command

at+send=lora:1:48656c6c6f2c20776f726c6421

データタブで確認すると文字列に変換された結果が出てくる。

//// images ////

Shell や Python からデータを送ってみる

シェルからは CR + LF を末尾に付けてデータを書き込むだけ。応答を cat で読む場合は少し待ち時間を入れる。

$ printf 'at+send=lora:1:00\r\n' >/dev/ttyUSB1; sleep 1; cat /dev/ttyUSB1; sleep 3; cat /dev/ttyUSB1
OK
[LoRa]: Unconfirm data send OK

Python では serial モジュールを使う(PIP を確認したら RAK811 用のモジュールもあるっぽい)。write() に渡すデータはバイナリになってなければならない。応答は read() または read(n)readline() で読み取ることができる。

import serial
s = serial.Serial("/dev/ttyUSB0", baudrate=115200, timeout=10)
s.write(b"at+send=lora:1:00\r\n")
s.readline()

AT コマンド一覧

at+join

Start to join LoRa network.

LoRa ネットワークに参加する。一度 at+join すると電源を切っても設定が保持される(何日持つかは不明)。

at+run

Stop boot mode and run as normal. It is valid when the device works in boot mode.

ブートモードを停止してノーマルモードでは動作させる。デバイスがブートモードのときに有効。

at+version

Get the current firmware version number.

現在のファームウェアバージョン番号を得る。

OK3.0.0.3.H

at+send=lora:<PORT>:<HEX>

Send a customized data.

  • <PORT>: LoRa port
  • <HEX>: The data which you want to send. The limited length is 50 bytes, and the data must be in HEX format.

at+send=lorap2p:<HEX>

Send data through LoRaP2P. This AT command is valid when it works in LoRaP2P mode.

get_config=device

at+get_config=device:status

Get all infomation about the device's hardware components and their current status.

バイスのハードウェアに関する情報を表示する。

OK.
*************************************************
===============Device Status List================
Board Core:  RAK811
MCU:  STM32L151CB_A
LoRa chip:  SX1276
===================List End======================
*************************************************

set_config=device

at+set_config=device:boot

Let the device work in boot mode.

ブートモードとして動作させる。

at+set_config=device:restart

After set, the device will restart.

再起動する。

OK,restart ...

at+set_config=device:sleep:<MODE>

After setting, the device will go to sleep mode or wake up immediately.

バイスをスリープ、またはただちに起動させる。

  1. wake up
  2. sleep

get_config=lora

at+get_config=lora:status

LoRa に関する情報を表示する。(PDF 未記載)

at+get_config=lora:channel

It will return the state of all LoRa channels, then you can see which channel is closed and which channel is open very clearly.

OK.Max_nb_chs=16:
* 0,on,923200000,0,5;
* 1,on,923400000,0,5;
* 2,on,923600000,0,5;
* 3,on,923800000,0,5;
* 4,on,924000000,0,5;
* 5,on,924200000,0,5;
* 6,on,924400000,0,5;
* 7,on,924600000,0,5; 
  8,off,923600000,0,5;
  9,off,923800000,0,5;
  10,off,924000000,0,5;
  11,off,924200000,0,5;
  12,off,924400000,0,5;
  13,off,0,0,0;
  14,off,0,0,0;
  15,off,0,0,0;

*上記は at+set_config=lora:region:AS923 時の結果を整形したもの

set_config=lora

at+set_config=lora:adr:<MODE>

Open or close ADR function of LoRa Node.

0: Close ADR 1: Open ADR

at+set_config=lora:app_eui:<VALUE>

Set the application EUI for OTAA.

at+set_config=lora:app_key:<VALUE>

Set the application key for OTAA.

at+set_config=lora:apps_key:<VALUE>

Set the application session key for ABP.

at+set_config=lora:ch_mask:<NUM>:<MODE>

Set a certain channel on or off. <NUM>: The channel number, and you can check which channel can be set before you set it. <MODE>: 0 off, 1 on

at+set_config=lora:class:<NUM>

Set the class for LoRa.

  1. Class A
  2. Class B
  3. Class C

at+set_config=lora:confirm:<NUM>

Set the type of messages which will be sent out through LoRa.

  1. unconfirm
  2. confirm

at+set_config=lora:dev_addr:<HEX>

Set the device address for ABP.

at+set_config=lora:dev_eui:<HEX>

Set the device EUI for OTAA.

at+set_config=lora:dr:<NUM>

Set the DR of LoRa Node.

<NUM>: The number of DR. Generally, the value of X can be 0~5. More details, please check the LoRaWAN 1.0.2 specification.

at+set_config=lora:join_mode:<NUM>

Set the join mode for LoRaWAN.

  1. OTAA
  2. ABP

at+set_config=lora:nwks_key:<VALUE>

Set the network session key for ABP.

at+set_config=lora:region:<VALUE>

Set the region for LoRa.

  • EU868
  • EU433
  • CN470
  • IN865
  • EU868
  • AU915
  • US915
  • KR920
  • AS923

at+set_config=lora:work_mode:<NUM>

Set the work mode for LoRa.

  1. LoRaWAN
  2. LoRaP2P
  3. Test Mode

at+set_config=lorap2p:X:Y:Z:A:B:C

Set the parameters for LoRa P2P mode. This AT command is valid when the work mode is LoRaP2P.

  • X: Frequency in Hz.
  • Y: Spreading factor.
  • Z: Bandwidth
    • 0: 125 kHz
    • 1: 250 kHz
    • 2: 500 kHz
  • A: Coding Rate
    • 1: 4/5
    • 2: 4/6
    • 3: 4/7
    • 4: 4/8
  • B: Preamble Length (5-65535)
  • C: Power in dbm (5-20)

書式に誤りがある場合

以下のような応答が返ってくる。

  • No AT Command was found.
  • AT format error.

at+send でデータサイズがオーバーしている場合は下記のメッセージが返ってくる。

  • String over max length <256 Bytes>.

LoRaP2P モードで使うには

RAK811 Breakout Board を2つ用意する。

リージョンを設定する。

at+set_config=lora:region:AS923

LoRa の動作モードを LoRaP2P に設定する。

at+set_config=lora:work_mode:1

周波数などを設定する。

set+set_config=lorap2p:869525000:7:0:1:5:5

どちらかの RAK811 Breakout Board からデータを送る。

at+send=lorap2p:1234567890