0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LRA1でLoRa通信|たった1行のBASICでLoRa送受信してみた(前回の続き)

Last updated at Posted at 2025-06-27

※この記事は、しゃちらぼブログ Vol.008 をベースに、Qiita向けに再構成・補足したものです。

※前回の記事(P2P通信の基本編)はこちら:
https://qiita.com/shachi-lab/items/04f45a27470bcb9df7c0

前回の記事では、LRA1のBASICで「P2P通信の基本操作」をやってみました。
LRA1のBASICでは行番号付きのプログラムも書けるけど、インタラクティブモードでの1行BASICでもいろいろできるんです。
なので、今回はその続編として、より実用的な1行スクリプトを使って、LCD表示やセンサーデータのLoRa送信まで一気にやってみます!


BASICでのマルチステートメントと変数

→ 1行に複数の処理を詰め込む方法と、基本の変数操作を試します。

LRA1のBASICは、古き良き8bit機風ながら、if - endifdo - loop などの現代的な構文も一部取り入れた独自仕様です。

>a=10
OK
>? a
10
OK

変数は A〜Z の1文字。複数の命令は : で連結して1行にまとめることができます。

>for i=1 to 10:? i:next

LoRa送信も同じ要領で可能です。

>for i=1 to 10:send i:delay 3000:next

最後の delay を除きたいなら以下のようにも書けます:

>for i=1 to 10:send i:if i<10 then delay 3000 endif:next

すべてASCII文字列で送受信されます。数値の送信には十分ですが、センサーデータなどの効率化を図るには後述のバイナリ送信が有効です。

LCD表示

→ LCDに文字を表示したり、行を指定して表示を整えてみます。

評価ボードのLRA1-EBには 8×2 のLCDがついており、以下のように表示できます。

>lprint "Hello"
>lpos=64:lprint "World!"

lra1_eb_lcd_helloworld_w400.jpg

  • lpos=64 で2行目の先頭に移動
  • lclr で画面全体クリア
>lclr:lprint "Hello":lpos=64:lprint "World!"

繰り返し表示する例:

>for i=1 to 10:lclr:lprint i:delay 1000:next

BME280センサーからデータ取得

→ 気温・湿度・気圧を1行で読み取って、変数に入れて表示します。

LRA1-EBに搭載されているBME280センサーの値を読み取るには以下の通りです:

>bme
260 562 10055

(26.0℃, 56.2%, 1005.5hPa)

変数に格納するには:

>bme t,h,p
OK
>? t,h,p
260     562     10062
OK

LCDに表示:

>lclr:lprint t:lpos=4:lprint h:lpos=64:lprint p

ループ化:

>do:bme t,h,p:lclr:lprint t:lpos=4:lprint h:lpos=64:lprint p:delay 60000:loop

60秒ごとに計測して表示します。

LoRaで送信

→ センサー値をLoRaで送信して、受信側に届く様子を確認します。

センサーデータをLoRaで送信するには:

>bme t,h,p
OK
>send t,h,p
OK

変数はPrintコマンド同様に文字列に変換されて送信されます。
ただし send ではカンマが挿入されないため、受信結果は以下のように詰まった形式になります:
Printコマンドではカンマはタブになりますが、SENDコマンドでは区切り扱いです。
これを受信:

>recv
@-88,1,26257110062

カンマを入れたければ、次のように書きます:

>send t "," h "," p

結果:

>recv
@-96,1,262,571,10062

LoRa受信データの扱い

→ 受信したデータを取り出して、LCDに表示してみます。

まずは、受信側でrecvコマンドで受信状態にしてから、送信側から送信してみます:

>send "Hello"
OK
>send "World!"
OK

recv 実行後、最後の受信データは # または rxd に格納されています:
recvコマンドで受信があった時に、Ctrl-Cで中断してから参照してみます。

>recv
@-91,1,Hello
@-91,1,World!
Break
OK
>? #
world!
OK

recv に引数(ミリ秒)を指定することで、1パケットを受信するとコマンドが終了するようにできます。

>recv 10000

タイムアウト時間が経過するか、パケットを受信するとrecvコマンドが終了します。
このとき、受信があっても受信データーの表示はありません。
受信有無は stat 変数で確認します:
stat=10のときは受信あり、stat=8のときはタイムアウトです。

>recv 10000:if stat=10 then ? # else ? "Timeout" endif
262,571,10062

送信側から送信したらデーターが表示されて、10秒間何もなかったら"Timeout"が表示されます。

この受信データーをLCDに表示してみます:

>recv 10000:lclr:if stat=10 then lprint # else lprint "Timeout" endif

これにdo-loop を使って、受信がある度にLCDの表示を更新することができます。

>do:recv 10000:lclr:if stat=10 then lprint # else lprint "Timeout" endif:loop

lra1_lcd_temp_w200.jpg

ただ、今回のセンサーからのデーターを表示すると、気圧のところで表示が切れちゃってます。
いまは送信データーがASCII文字列なので、うまく表示ができないのですが、
次回に説明するバイナリ方式では、うまく表示できるようになります。


まとめ

LRA1のBASICを使えば、1行でLoRa通信+LCD表示+センサーデータ処理まで可能です。
Arduinoや他のマイコンが不要で、ターミナル1つで完結する開発環境は、プロトタイピングや実験用途に非常に便利です。

次回は、バイナリ送受信と本格的なデータ処理に踏み込んでみたいと思います。


関連リンク


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?