※この記事は、しゃちらぼブログ Vol.010 をベースに、Qiita向けに再構成・補足したものです。
※前回の記事「P2P送受信をBASICでやってみた!(続編)」はこちら:
https://qiita.com/shachi-lab/items/d880570c4accdc5c85c9
はじめに
前回は、LRA1のBASICでLoRaの送受信を1行でやってみましたが、文字列での送受信でした。
ただ、文字列は冗長で取り扱いがちょっと面倒です。
LRA1では数値をそのまま扱えるバイナリ送受信にも対応していて、小さなパケット長で効率的にデータをやり取り可能です。
本記事では、BME280 環境センサーから取得した温度・湿度・気圧を 1 行 BASIC で定期的に送信し、受信側で LCD 表示するまでの手順をステップごとに解説します。
対象読者
- LRA1 の BASIC コマンドを使いこなしたい方
- LoRa パケット長を最適化して省電力化したい方
- 環境モニターや IoT プロトタイプを手軽に組みたい方
前提環境
- LRA1 モジュール + ターミナルソフト (Tera Term, minicom など)
- BME280 環境センサー(SDA/SCL 接続)
- LoRa 通信ペア(送信側と受信側の BASIC 環境)
評価基板のLRA1-EBには、上記のLCDとBME280,USB-UARTが搭載されていますので、
この記事では LRA1-EB を使用しています。
1. なぜバイナリ送受信?
文字列で数値を送るときは、例えば「25.3°C」をそのまま ASCII コードに変換して送信しますが、1 文字=1 Byte のためパケットが大きくなりがち。
また、受信側では受け取った値を計算するなどの場合は、変換が面倒。
バイナリで直接数値を送ると、数値のビットパターンをそのままペイロードに載せられるため省エネ&高速です。
LRA1 の BASIC では下記の型が利用可能です:
| 変数名 | サイス | Byte数 |
|---|---|---|
| Txd, # | BYTE | 1 byte |
| Txdw | WORD | 2 byte |
| Txdl | LONG | 4 byte |
エンディアンは、リトルエンディアンです。
これらを組み合わせることで、データの種類に応じた最適なサイズで通信できます。
2. 送信バッファの初期化
BASIC で LoRa DATA を組み立てるとき、まず送信バッファ (#) をクリアして、内部の LoRa 制御ヘッダ (GID, OWN, DST, LEN) を各変数の設定値にしたがって設定します。
下の例では、文字列にnullを設定しているので、LEN=0で設定されます。
># = null
この操作により、送信前に既定の設定になるので、複数回送信する際の古い情報の影響を防げます。
3. バイナリ送信の基本構文
3.1 1 Byte 単位の書き込み
>#[7] = 2 : #[8] = 65 : #[9] = 66 : send
-
#[7]:総データ長 (ここでは 2 Byte) -
#[8],#[9]:ペイロードの先頭アドレスからデータを設定 -
send:LoRa 送信実行
この例では、65 ('A')、66 ('B') をバイナリで 2 Byte 送信します。
3.2 WORD / LONG 型の送信
>#[7] = 6 : txdw[8] = 25185 : txdl[10] = 2054780975 : send
-
txdw[8]:送信バッファの8バイト目から WORD (16 bit) を格納 -
txdl[10]:送信バッファの10バイト目から LONG (32 bit) を格納
※ 送信バッファのペイロードは、8バイト目からとなります。
複数バイトの数値でも受信側で同じように取り出せば正しく復元できます。
4. 非同期バックグラウンド受信
4.1 受信開始
受信待ちしないモード(非同期モード)で受信コマンドを実行できます。
>recv 0
OK
この状態では、LoRa モジュールがバックグラウンドで受信を続けます。
インタラクティブモード実行中でも、受信を継続します。
4.2 受信結果の確認
非同期受信中は、stat を参照して受信を確認します。
stat をポーリングして、値が 10 になったら受信成功です。
>? stat ← stat = 10 ?
10
>? #[8], rxdw[8], rxdl[10] ← データ長 / WORD / LONG
6, 25185, 2054780975
>stat = 0 ← フラグリセット
stat を 0 にクリアしないと、新たな受信があってもバッファに格納されません。
-
#[8]:ペイロード長 -
rxdw[8]:受信した WORD -
rxdl[10]:受信した LONG
4.3 受信停止
通常は受信しっぱなしにしておけば問題ありませんが、非同期受信を停止する場合は下記コマンドを利用します。
>rxstop
OK
5. 1 行で組む環境モニター例
BME280 から温度 (T), 湿度 (H), 気圧 (P) を読み取り、5 分間隔でバイナリ送信する 1 行コードです。
>#=null:do:bme t,h,p:#[7]=6:txdw[8]=h:txdw[10]=t:txdw[12]=p:send:delay 300000:loop
-
# = null:送信バッファ初期化 -
bme t,h,p:BME280 から計測値取得 -
h,t,p:湿度・温度・気圧をそのまま WORD 型で格納 -
send:LoRa 送信 -
delay 300000:300,000 ms (5 分) 待機 -
loop:無限ループで定期実行
これだけで、屋外バッテリー駆動の小規模環境モニターの送信側が完成します。
6. 受信側 1 行コード例
受信側ではバックグラウンド受信& LCD 表示を組み合わせます。
失敗やタイムアウトを防ぐため、常に stat をチェックしてから処理すると安定度が増します。
>recv 0:do:while !stat:loop:if stat=10 then lclr:lprint rxdw[8]:lpos=4:lprint rxdw[10]:lpos=64:lprint rxdw[12]:stat=0:endif:loop
-
lclr:LCD クリア -
lprint:数値表示 -
lpos:カーソル位置調整
受信した数値は、左上「湿度」、右上「温度」、左下「気圧」として表示されます。
それぞれの値はスケーリングされる前の値のため、x10 になっています。
7. スクリプトの保存と自動起動
インタラクティブモードで入力したコマンドは電源断で消失します。長い 1 行スクリプトを自動実行させるには、行番号プログラムへの移行がおすすめですが、簡易的には下記で保存できます。
>auto = "# = null : do bme t,h,p : ..." : ssave
-
auto:起動時に自動実行するスクリプト登録 -
ssave:現在のスクリプトをフラッシュに保存
ただし、1 行文字数制限(約 63 文字)があるため、複雑な処理は行番号プログラムへ移行したほうが可読性・保守性ともに優れます。
8. 応用と次のステップ
- 行番号プログラム化:複数行での分岐・エラーハンドリングを追加
- データロギング:SD カードや外部サーバーへの定期アップロード
- 低消費電力化:送信間隔の最適化や深いスリープへの移行
- 他センサー連携:光センサー、CO2 センサーなど用途拡張
次回は行番号をつかった本格的なLRA1のBASICプログラミングをご紹介します。

