株式会社アイツーの LoRa 無線モジュール LRA1 を試してみました。
LRA1-ADB1
LRA1 のモジュール単体部分は写真の緑基板の部分。使いやすくするためにブレークアウトボードに載せたり評価ボードに仕立てた製品がいくつかある。今回はその中で最も小さいものである「LRA1-ADB1」を購入。
「LRA1-ADB1」は 1.27mm ピッチでピンが出ている
これは LRA1-ADB1 のバリエーションでアンテナ付き SMA タイプ。
今回はワイヤーアンテナタイプで実験してみました。
資料
ドキュメントは主にこちら
https://www.i2-ele.co.jp/LoRa.html
内部コントローラーは SEMTECH の LoRaCHIP SX1272/73 らしいです。
cf., https://www.marutsu.co.jp/select/list/detail.php?id=1150
SX1272
https://www.semtech.com/products/wireless-rf/lora-connect/sx1272
SX1272データシート
https://semtech.my.salesforce.com/sfc/p/#E0000000JelG/a/440000001NCE/v_VBhk1IolDgxwwnOpcS_vTFxPfSEPQbuneK3mWsXlU
配線
モジュール単体は基板裏面に端子パッドがポート1~37まで出ています。「LRA1-ADB1」ではそのポートのうちアンテナ関係をのぞくポート1~34が1.27mmピッチのピンになっています。
以下のように引き出しました
ピン番号 | 記号 | 仕様 | USBシリアル側 |
---|---|---|---|
2 | PA05/UART RX | TX | |
3 | PA04/UART TX | RX | |
10,11 | VDD | 1.8V~3.6V | 3V3 |
12,13 | GND | GND |
USBシリアルモジュールに接続し、PCに接続します。
PCでの操作
PCからUARTシリアル通信で操作してみます。OS は Ubuntu Linux を使い、 picocom を使って通信してみました。
通信条件としてボーレートは 115200bps。ボード側の改行コードは CRLF なので Linux の改行コード LF を以下のようにしてマッピング設定をしています。
$ picocom -b 115200 -r -l --omap crcrlf /dev/ttyUSB0
2台同じように用意して、1台を送信側、もう1台を受信側とします。
パラメータ確認
#?
と入力すると現在の設定値を表示します。
送信側
「技適認定済モジュールLRA1でLoRa通信を行ってみる」
https://qiita.com/suzutsuki0220/items/7c96d8d3ebd5404d1036
に習って、以下のように設定しました。
>Own=5
OK
自局 ID を5に設定します。
>Dst=6
OK
通信相手先 ID を6に設定します。
受信側
同様に、以下のように設定しました。
>Own=6
OK
自局 ID を6に設定します。
>Dst=5
OK
通信相手先 ID を5に設定します。
>RECV -1
待受状態にします。
通信してみる
送信機側で以下のようにタイプしてエンターします。
>SEND "HOGEHOGE"
とすると、受信機側に以下のように表示されました。
@-26,5,HOGEHOGE
「@RSSI, 送信側 ID, 受信 Data」の形式で表示されます。
設定値の確認、保存
先程設定した値を確認するには
? Dst
で表示されます。
#?
ですべての設定値が表示されます。
ssave
で各種設定が保存され、次回起動時にも反映されます。
離れてテスト
歩きながら、どこまで通信できるか試してみました。
実験フィールドは自宅近辺で住宅地です。受信機は屋内で、窓などで見通すことができない奥まった場所の床に置いています。
No.0~No.5のそれぞれのポイントで送信してみました。No.0は玄関、ほかは路上です。地上に直接置いて測定しています。
受信側では以下のように受信されていました。
@-64,5,No.0
@-83,5,NO.1
@-91,5,NO.2
@-118,5,NO.3#
最後の NO.3 の NO.3# となっているのはミスタイプです。
No.4およびNo.5は受信されていませんでした。
No.0~No.5いずれも見通しではありません。更にNo.3においては自宅すら見えない状態でしたので、それでも受信できたことは特筆です。
センサを繋いでみる
温度・湿度・気圧センサであるBME280を繋いでみます。
モジュール単体は基板裏面に端子パッドがポート1~37まで出ています。「LRA1-ADB1」ではそのポートのうちアンテナ関係をのぞくポート1~34が1.27mmピッチのピンになっています。
以下のように接続しました
ピン番号 | 記号 |
---|---|
10,11 | VDD |
12,13 | GND |
16 | SDA |
17 | SCL |
以下のようにして、温度、湿度、気圧が表示されます。
>bme t,h,p
OK
>? t,h,p
329 415 10083
OK
温度 32.9℃
湿度 41.5%
気圧 1008.3hP
を表しています。
CO2センサを繋いでみる
株式会社ストロベリー・リナックスの 「CCS811 エアークオリティセンサモジュール」
https://strawberry-linux.com/support/11811/1905536
を接続してみました。
このセンサーは 400ppmから8192ppmのCO2が測れます。
以下のように接続しました
LRA1ピン番号 | CCS811モジュール側記号 | CCS811モジュール側配線設定 |
---|---|---|
10,11 | VDD | |
12,13 | GND | |
16 | SDA | |
17 | SCL | |
nRESET | VDD | |
nWAKE | GND |
更に、 CCS811モジュール側の nINT ADDR ジャンパーで I2C アドレスを設定するようになっています。 0 側ジャンパーで 0x5A、1 側ジャンパーで0x5B ですが、今回は1側ジャンパーで 0x5B に設定しています。
本来SDAとSCLはプルアップが必要ですが、先のBME280モジュールと並列でつなげていてBME280モジュール内のプルアップが効いているのでCCS811用に特に追加せずに使うことにしました。
I2C で CO2 センサの値を読んでみる
LRA1 上のシリアル経由の操作や BASIC プログラムで I2C コマンドを使うには LRA1 のファームウェアを Ver 1.05.a 以上にする必要がありますが、
>ver
i2-ele LRA1
Ver 0.39.j
OK
なので
「LoRaモジュールLRA1のファームウェアを更新する」
https://qiita.com/suzutsuki0220/items/402765986b750808fe84
の記事をもとにアップデートしました。
>ver
i2-ele LRA1
Ver 1.08.d+
OK
I2CR コマンドを使い、デバイスIDを読んでみます。
>I2CR $5B,$20,1
OK
I2Cアドレス 0x5B, レジスタアドレス 0x20 から 1バイト読み出します。
>? I2CD(0)
129
OK
HW_ID として 0x81 が読み出せたので正常ぽいです。
センサを動作開始するために、コマンド 0xF4(APP_START)を送ります。
>I2CW $5B,$F4,1
OK
0xF4レジスタには書き込み動作だけでOKですが、ダミーとして1バイト指定しています。
次に動作モード(MEAS_MODE)指定をします。
>I2CD(0) = $10
OK
>I2CW $5B,$01,1
OK
>
0x01 レジスタに 0x10(Constant power mode, IAQ measurement every second)を書き込みます。
>I2CR $5B,$02,8
OK
結果を表示します
>? I2CD(0)
129
OK
>? I2CD(1)
253
OK
>? I2CD(2)
0
OK
>? I2CD(3)
0
OK
>? I2CD(4)
0
OK
>? I2CD(5)
0
OK
>? I2CD(6)
0
OK
>? I2CD(7)
0
OK
オフセット | ラベル | データ |
---|---|---|
0 | eCO2 High Byte | 129 |
1 | eCO2 LOW Byte | 253 |
2 | TVOC High Byte | 0 |
3 | TVOC Low Byte | 0 |
4 | STATUS | 0 |
5 | ERROR_ID | 0 |
6 | RAW_DATA | 0 |
7 | RAW_DATA | 0 |
データは CO2 として 4096 ppm となっています。センサの値は最初は不安定なので、落ち着くまで時間を置く必要があります。
BASIC プログラムで送ってみる
>PRINT T,H,P,I2CD(0)*256+I2CD(1)
295 489 10083 33277
OK
これを送ってみます
>SEND T,H,P,I2CD(0)*256+I2CD(1)
OK
>
受信側では
@-55,6,295488100830
となったので、
SEND T," ",H," ",P," ",I2CD(0)*256+I2CD(1)
@-49,6,295 488 10083 0
となりました。
SEND T," ",H," ",P," ",I2CD(0)*256+I2CD(1)
とすると、
@-49,6,295 488 10083 65021
となりました。
総合して、プログラムは以下のようになります。
10 BME T,H,P
20 I2CW $5B,$F4,1
30 I2CW $5B,$01,1
40 I2CR $5B,$02,8
50 PRINT T,H,P,I2CD(0)*256+I2CD(1)
60 SEND "6"," ",T," ",H," ",P," ",I2cD(0)*256+I2cD(1)
70 DELAY 5000
80 GOTO 10
>EDIT 1
OK
>>
としてBASICプログラムモードにします。
プログラムを入力したあとに
>>run
295 495 10083 65021
295 498 10084 65021
295 496 10083 65021
Break in 70
OK
>>
親機側で
@-40,6,6 295 495 10083 65021
@-38,6,6 295 498 10084 65021
@-41,6,6 295 496 10083 65021
受信できました
>>psave
OK
でプログラムを保存します。
>AUTO="PLOAD:RUN"
OK
>ssave
OK
で次回から電源ON時に自動起動します。
電池駆動でRXのノイズ入力を抑制する
RXD(PA05)がハイインピーダンスなので、ばたついてCtrl+C入力とみなされプログラムが停止したりします。
それを抑制するために、以下の変数を設定して Pull-Down してみましたが・・・
>? ctrl
0
OK
>ctrl=$800
OK
>ssave
OK
実験してみましたがあまり効果が無さそう? 更に、Pull-Down だと Break 信号とみなされる恐れが無いかな?
ということで外部に Pull-Up 抵抗をつけてバタつきを解消しました。実験的に値を求めて 2.7kΩ としましたが、厳密な実験ではなかったのでもっと大きな抵抗でも問題ないかも知れません。