※この記事は、しゃちらぼブログ 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 - endif
や do - 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!"
-
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
ただ、今回のセンサーからのデーターを表示すると、気圧のところで表示が切れちゃってます。
いまは送信データーがASCII文字列なので、うまく表示ができないのですが、
次回に説明するバイナリ方式では、うまく表示できるようになります。
まとめ
LRA1のBASICを使えば、1行でLoRa通信+LCD表示+センサーデータ処理まで可能です。
Arduinoや他のマイコンが不要で、ターミナル1つで完結する開発環境は、プロトタイピングや実験用途に非常に便利です。
次回は、バイナリ送受信と本格的なデータ処理に踏み込んでみたいと思います。