SX1276 と STM32L を搭載した RAK 社製の LoRa モジュールを AliExpress で入手した。AK811 を選んだ理由は下記の通り。
- 小さい(大事)
- 値段が安い(だいたい $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 シリアルアダプタとの接続は VCC
、GND
、TX
、RX
のみで BOOT
は接続不要。シリアル接続時の設定は下記の通り。
ここでは picocom
コマンドを使用するが、Arduino IDE のシリアルコンソールでも設定可能。ローカルエコーを有効にしておかないと入力したコマンドが見えないので注意(見えなくても慣れればそのまま操作できるけど)。
$ picocom -b 115200 --echo /dev/ttyUSB0
まずはブートモードに変更する。
at+set_config=device:boot
work in Boot mode now... <BOOT MODE>
ブートモードに設定できたら Ctrl + a、Ctrl + x で picocom
を終了する。この状態で RAK LoRaButton Upgrade Tool で新しいファームウェア(RUI_RAK811_V3.0.0.3.H.bin
等)を選択して[Start]を押せば新しいファームウェアが書き込まれる。
macOS や Linux の場合はどうするのか?
Windows 10 の評価版などを入手して VirtualBox にインストールしてホストの USB シリアルポートをバイパスさせることでゲストの Windows 10 から RAK LoRaButton Upgrade Tool を使って書き込みができる。Wine でもなんとかできるかも。
stm32flash についてはまだ試していない。
TTN への接続(OTAA)
デフォルトでは OTAA モードになっているが ABP でもほとんど変わらない。
まずは get_config=lora:status
で現在の状態を確認する。
at+get_config=lora:status
Region が AS923 になっていないのと DevEUI、AppEui、AppKey などが設定されていないのでこれらを設定していく。
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 の設定
周波数は下記のコマンドだけで設定できる。設定可能な値は EU868
、EU433
、CN470
、IN865
、EU868
、AU915
、US915
、KR920
、AS923
。日本で使用できるのは AS923
。
at+set_config=lora:region:AS923
デフォルトのデバイス EUI が返ってくるが TTN のコンソールで発行できるので控えておかなかったとしても問題はない。
DEFAULT DEV_EUI = 9B0100089D010008 Selected LoRaWAN 1.0.2 Region: AS923 Band switch success. OK
Region が変更されたか確認する。
at+get_config=lora:status
Region が AS923
に変更されている。周波数の値も 923200000
になっている。
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+set_config=lora:dev_eui:9B59615D543BC6F3
OK
アプリケーション EUI の登録
at+set_config=lora:app_eui:240A0F2375D286F8
OK
アプリケーションキーの登録
注:OTAA の場合は lora:app_key
、ABP の場合は lora:apps_key
なので間違わないように注意。
at+set_config=lora:app_key:62DC6A9880FBE606F3503DB057946817
OK
設定を確認する
EUI などが設定されているか確認する。「Joined Network」はまだ false
。
at+get_config=lora:status
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+join
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+send=lora:1:00
OK [LoRa]: Unconfirm data send OK
データタブで受信できているか確認する。
/// image ///
デコーダを設定して値を整形する
TTN には Payload Formats という機能があり、値を変換したりすることができる。下記はデコーダのデフォルトサンプル。
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; }
サンプルを消して単純に数値を文字に変換する処理を入れてみる。返り値はオブジェクトで返す必要がある。
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+send
で TTN に送る。
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.
デバイスをスリープ、またはただちに起動させる。
- wake up
- 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.
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.
- Class A
- Class B
- Class C
at+set_config=lora:confirm:<NUM>
Set the type of messages which will be sent out through LoRa.
- unconfirm
- 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.
- OTAA
- 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.
- LoRaWAN
- LoRaP2P
- 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