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
だが環境によって異なる)。ArduinoIDEのシリアルコンソールで改行コードを 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
コマンドを使用するが、ArduinoIDEのシリアルコンソールでも設定可能。ローカルエコーを有効にしておかないと入力したコマンドが見えないので注意(見えなくても慣れればそのまま操作できるけど)。
$ 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