LoRa通信をLRA1のBASICで。たった1行でかんたん送受信!

LRA1のBASICでLoRa通信を1行送受信するろらたん LRA1実践

LoRa通信をLRA1のBASICで。たった1行でかんたん送受信!

この記事について

こんにちは、ぽんたです🐾
今回の記事では、LRA1に搭載されているBASICインタプリタを使って、たった1行のプログラムでLoRa通信ができることを体験してみたいと思います。

実験的な内容ではありますが、「環境センサーを使ってLoRaで送信してLCDに表示する」まで、全部1行でできちゃうんです!

ろらたんがLRA1と温度計を持って笑ってる画像

🎀 “1行BASIC”って、なんだか魔法の呪文みたいだね〜っ♪

LRA1は、TeraTermなどのターミナルから直接操作できるようになっていて、
コマンド入力待ちの > プロンプトが表示された状態を「インタラクティブモード」と呼んでいます。
ここでは、BASICの各種コマンドをその場で入力して実行することができるんです。

🎀 コマンドを打ち込むとすぐに応答が返ってくるって、ちょっとBASIC全盛期の頃っぽい感じだよね〜っ♪


マルチステートメントと変数の基本

LRA1のBASICは、昔の8bitパソコンのBASICのようなイメージをベースにしていますが、
if - endifdo - loop のような“今どきの構文”も一部取り入れられています。
当時のBASICに慣れた人には懐かしく、Visual Basicに慣れてる人には逆に少し新鮮に感じるかもしれません。

そのBASICのように、1文字の変数(A〜Z)が使えます。(大文字小文字は区別されません)

>a=10
OK
>? a
10
OK

FOR/NEXT、IF文などを使ってプログラムを書くことができます。
そして、複数の文を : でつなげて1行でまとめる「マルチステートメント」にも対応しています。

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

これだけで、1〜10を順番に表示できます。

さらにLoRa送信も1行で!

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

受信側で recv コマンドで待ち受けると、3秒ごとに受信するはずです。

🎀 ちょっとしたループで、データー送信が簡単にできるなんてスゴいよ〜!

10回目のdelayを省きたいなら、IF文を使って調整も可能:

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

1行でもそれなりのことができそうな気がしませんか?

🎀 :(コロン) をつなげるだけで、どんどん命令を詰め込めるの、クセになるよね〜!

表示や送信される値は、すべてASCII文字列になります。
センサーデーターなどは、あとで紹介する“バイナリ送信”のほうが効率が良い場面もあります。

⚠️ LoRaで送受信するときは、gid、dst、own、ch、sf、cr、bw を
送信側と受信側で合わせておないと通信できません。
事前に確認しておきましょう!


LCDを使ってみよう

LRA1-EB(評価ボード)には、8文字×2行のLCDがついています。
BASICのコマンドから、以下のように簡単に表示することができます。

>lprint "Hello"

続けてlprintコマンドを使うと、前回の表示の後ろにつながります。
また、8文字を超えても次の行には表示しません。
2行目に表示したいときは lpos を指定します。

>lpos=64:lprint "World!"

1行目の先頭は 02行目の先頭は 64 になります。

🎀 lpos=64 の64って、“1行目が0、2行目が64”ってルールなの、不思議だけど覚えやすい〜!

LCD全体を消すには lclr を使います。

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

LRA1のLCDにHello!Worldが表示されている画像

FOR文と組み合わせてみましょう。

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

1秒ごとに1~10がLCDに表示されましたか?

🎀 LCDがあると、目に見えて結果がわかるから楽しくなるよねっ♪


センサー(BME280)の値を取得!

LRA1-EBには環境センサー(BME280)も搭載されていて、次のように使うことができます。
まずは、引数なしで bme コマンドを実行してみましょう:

>bme
260 562 10055  (例:26.0℃, 56.2%, 1005.5hPa)

引数なしで bme を実行すると、現在の気温・湿度・気圧がその場で表示されます。
各値は、「気温:℃×10」「湿度:%×10」「気圧:hPa×10」の単位になります。

🎀 気温とか湿度とか気圧まで、これだけで測れちゃうのってちょっとすごくない?

変数に格納したいときは、以下のように記述します

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

‘t’には気温、`h’には湿度、’p’には気圧が入ります。
変数名はa~zならば何でもいいのですが、分かりやすいようにt,h,pとしています。
※printコマンド中のカンマはTABになります。

これをLCDに表示してみましょう。

>lprint t,h,p

このとき、表示が全部つながってしまいましたよね。
それもそのはず──
lprintprint と違ってカンマ(,)を区切りでしかなく、出力に何も挿入されません
つまり、間に何も入れずにそのままつながって表示されます。
そこで、次のようにしてみます。

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

いい感じに表示されたと思います。

🎀 `lprint`はちょっと素直じゃないけど……慣れると使いやすいよ〜♪

1行ループにするとこうなります:

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

1分ごとに、気温、湿度、気圧が更新されてLCDに表示されるようになります。
ちょっとした環境モニターとして使えそうですよね。


LoRaで送ってみよう!

環境センサーで計測した値をLoRaで送信してみましょう。

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

これだけで、気温・湿度・気圧をLoRaで送信することができます。
受信側でrecvコマンドで待ち受けていれば、値が表示されたと思います。

🎀 センサーデータを無線で飛ばせるって、ちょっと未来っぽいよね〜✨

でも、LCDのときと同じようにカンマが無視されて、つながって表示されます。
こんな感じに…

>recv
@-88,1,26257110062

カンマを区切り文字として一緒に送ってみましょう。

>send t "," h "," p

今度はカンマで区切られた状態で送信されました。
受信側では次のようになっていると思います。

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

ちょっといい感じになりました。

🎀 カンマをうまく使えば、人間にもやさしい表示になるんだねっ!

LoRaからの受信データーを扱おう!

recvコマンドで受信したデーターは rxd または # 変数として参照することができます。
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

気圧の表示が切れちゃってますね。

🎀 これじゃ、気圧がわかんないよ〜っ

というのも、いまは送信データーもASCII文字列で“見やすさ重視”になっています。
通信効率や扱いやすさを考えるとバイナリ形式の方が向いています
次は、そういった“実用化の第一歩”として、受信バッファやバイナリ送受信、1行スクリプトでの自動送信なども体験していきますね!

🎀 “送れたからOK!”じゃなくて、“ちゃんと使えるか?”が次のステップなんだよ〜っ📡✨


おわりに

今回は、1行BASICだけでLoRaの送受信、LCD表示、センサーデーターの処理までやってみました!

LRA1は、よくあるLoRaモジュールのように外部MCUや特別なIDEは必要ありません。
シリアルポートのターミナルがあれば、たった1行のBASICだけで結構色々なことができる気がしませんか?

🎀 この楽しさ、昔のポケコンみたいでワクワクしちゃう〜っ!

次は、いよいよ バイナリでの送受信に挑戦して、
LCDにもちゃんと収まる本格的な環境モニターを作っていきます!

🎀 “はみ出ない表示”って、意外と奥が深いんだよ〜っ。お楽しみにっ♪


📪 お問い合わせなど

技術的なご相談やご質問などありましたら、
📩お問い合わせフォーム  
または、
📮info@shachi-lab.com までお気軽にどうぞ。

🎀 「LoRaのこと、BASICのこと、ちょっとした疑問でも全然OKだからね〜!
“こんなことで聞いていいのかな?”って思わずに、気軽に聞いてほしいなっ🐾


🔗 関連リンク

しゃちらぼの最新情報や開発の様子は、こちらでも発信しています:

💬「シャチラボ」で検索してきた方も大歓迎!
ほんとは「しゃちらぼ(Shachi-lab)」なんだけど、見つけてくれてありがとう🐬

コメント

タイトルとURLをコピーしました