LoRa評価ボード(LRA1-EB)を使いこなす

LoRa評価ボードのLRA1-EBにはキャラクターディスプレイと環境センサー(BME280)が搭載されており、これだけでLoRa通信を使った実験を行うことができます。この記事ではこれらの機能を使うための手順を紹介します

![LRA1-EB.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61404/cb671475-a99c-7a6e-4449-dd5f23c6860c.jpeg)

# 評価ボードについて

現在、評価ボードにはSMAアンテナ版とワイヤアンテナ版の2種類があります。電波感度を評価したいならSMAアンテナ版、ケースに入れて動かしたいならワイヤアンテナ版を選ぶのが良いでしょう

LoRa/FSKモジュール評価ボード SMAアンテナ(2台セット) LRA1-EB-SMA-2｜電子部品・半導体通販のマルツ
https://www.marutsu.co.jp/pc/i/1633699/

LoRa/FSKモジュール評価ボード ワイヤアンテナ(2台セット) LRA1-EB-M1-2｜電子部品・半導体通販のマルツ
https://www.marutsu.co.jp/pc/i/1633698/

本記事ではSMAアンテナ版を使っていますが、ワイヤアンテナ版でも電波感度以外の違いは無いと思います[^1]

# 1. 準備

PCと評価ボードをUSBケーブルで繋ぎ、TeraTermなどのターミナルを開きます。詳しい手順は [前の記事](https://qiita.com/suzutsuki0220/items/7c96d8d3ebd5404d1036) をご覧ください

# 2. 環境センサー(BME280)

評価ボードに搭載されている環境センサー(BME280)から温度、湿度、気圧を取得してみます

センサーからの取得には `BMEコマンド` を使います。引数に格納する変数を `温度` `湿度` `気圧` の順に入れます

```shell:環境センサー値を取得
>BME T,H,P
OK
```

格納した値を `PRINTコマンド` で表示します

```shell:格納した値を表示する
>PRINT T
250
OK
>PRINT H
531
OK
>PRINT P
10017
OK
```

Tには温度、Hには湿度、Pには気圧が入っていますが、そのまま表示すると10倍された値になってます。1/10にして正しい値に直したいのですが、LRA1のBASICは小数の値を扱うことが出来ない為、10で割った整数部分と余りの部分で分けて文字列化します

文字列の連結には `;(セミコロン)` を使います。BASICの文法では変数の型は気にしませんので、PRINTコマンドの引数にそのまま計算式を入れても良いです

```shell:10で割った値で表示する
>PRINT T/10;".";T%10
25.0
OK
>PRINT H/10;".";H%10
53.1
OK
>PRINT P/10;".";P%10
1001.7
OK
```

これで温度、湿度、気圧が正しく表示できました

# 3. キャラクターディスプレイ(LCD)を使う

評価ボード上にあるLCDには `8文字×2行` の半角英数字が表示できます[^2]

## 3-1. コマンド

LCDに使用するコマンドは次の3つを押さえておきましょう

| コマンド | 動作 |
|:---|:---|
| LCLR | LCDの表示を消去します |
| LPRINT [Message] | 引数に指定された文字をLCDに表示します |
| LPOS [表示位置] | LCDの表示位置を指定します |

### 表示位置について

LCDの表示位置と `LPOSコマンド` に指定する値は次のように対応しています

| | 1文字目 | 2文字目 | 3文字目 | 4文字目 | 5文字目 | 6文字目 | 7文字目 | 8文字目 |
|:------|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
| 1行目 |  0 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |
| 2行目 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |

初期状態または、 `LCLRコマンド` でクリアした時は `0` になります

まず `LPRINT "1234"` と入れるとLCDには左から "1234" が表示されます。その後 `LPRINT "5678"` と入れると、 "12345678" となり、最初に入れた "1234" に続けて "5678" が表示されます

これは、LCDモジュール内部で保持している表示位置が文字を表示する度に `+1` でズレていくためです。表示位置がLCDに表示できる範囲を超えてしまうと `LPRINTコマンド` を実行しても表示されなくなります。一度表示した文字を置き換えるには `LCLRコマンド` で消去するか、 `LPOSコマンド` で書き換えたい文字の位置を指定して上書きします

## 3-2. 実行例

LCDの1行目(上)に "Hello!" 2行目(下) "LoRa" を表示させてみます

```shell:LCD表示例
>LCLR
OK
>LPOS=1
OK
>LPRINT "Hello!"
OK
>LPOS=66
OK
>LPRINT "LoRa"
OK
```

# 4. 活用編

評価ボードの使い方が分かったところで、少し実践的なことをやってみます

## 4-1. 環境センサーで取得した値をLCDに表示する

完成イメージはこちらです
![fig-env-sens.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61404/d6927d6a-7633-0645-4349-a13d3b58ae36.jpeg)

[販売元のWeb](https://www.i2-ele.co.jp/LoRa.html) の写真のように評価ボードのLCDに温度湿度、気圧を表示させてみます。以下のプログラムを入力して実行します。コピーペーストでまとめてターミナルに貼ってしまうと文字が抜けてエラーになる事があるので、面倒でも一行ずつ渡してください

```shell:評価ボードのLCDに温度、湿度、気圧を表示する
BME T,H,P
LCLR:LPRINT T/10;".";T%10;" ";H/10;"%"
LPOS=64:LPRINT P/10;".";P%10;"hP"
```

* 表示できる文字が不足するため、湿度は妥協して整数部分だけ表示しています
* LCDの2行目は表示位置を64にセットして気圧を表示しています

### プログラムで繰り返しセンサー値を取得する

BASICプログラムを入れて繰り返し取得するようにしてみます。簡単な補足は入れていますが、不安な方は [この前のLチカする記事](https://qiita.com/suzutsuki0220/items/6aead626dececbc0e773) で復習するといいでしょう

プログラムを入れる時は `EDIT 1` を入れて編集モードに切り替えて、 `NEWコマンド` を実行して前に入力したプログラムや変数を消去しましょう

```shell:プログラム入力の準備
>EDIT 1
OK
>>NEW
OK
>>
```

プロンプトが `>` から `>>` に変われば準備は完了です

#### 繰り返し取得してLCDに表示する

先ほど実行したプログラムを `DO-LOOP文` で繰り返し実行するようにします。以下のプログラムを入力します

```vb:繰り返しセンサー値を取得してLCDに表示する
10 DO
20 BME T,H,P
30 LCLR:LPRINT T/10;".";T%10;" ";H/10;"%"
40 LPOS=64:LPRINT P/10;".";P%10;"hP"
50 DELAY 1000
60 LOOP
```
* ループの間に `DELAY 1000` を挟み、1秒待ってから次の取得を行ってます

入れ終えたら `RUNコマンド` でプログラムを実行します。1秒間隔で値が更新されていきます

## 4-2. 受信のrssi(信号強度)をLCDに表示する

完成イメージはこちらです
![fig-recv-rssi.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61404/1031c973-4297-f9c9-e418-996f2c303c55.jpeg)

### 準備

予め、受信側のLoRa変数 `OWN` を決めておき、その値を送信側のLoRa変数 `DST` に設定しておきます。ここでは例として `6` をセットしていますが、0～65534 の間で任意に選ぶことができます

```shell:例)受信側にOWNを6に設定
>OWN=6
```

```shell:例)送信側でDSTを設定
>DST=6
```

受信側を待ち受け状態にして、送信側で任意のメッセージを送ります

```shell:受信側で待ち受け状態にする
>RECV
```

```shell:送信側で任意のメッセージを送る
>SEND "hello"
```

受信側でメッセージが受信出来たら `Ctrl + C` で待ち受けを止めてください

### LCDにrssiの値を表示する

受信側で `RSSI変数` の値を確認すると、最後に受信したデータのrssiが入っています。これを `LPRINTコマンド` に与えればLCDにrssiの数値が表示されます

```shell:受信側でrssiの数値をLCDに表示する
>LCLR:LPRINT "Rssi";RSSI
```

### プログラムで繰り返しデータを受信してrssiをLCDに表示する

BASICプログラムを入れて繰り返し受信するようにしてみます。プログラムを入れる時は `EDIT 1` を入れて編集モードに切り替えて、 `NEWコマンド` を実行して前に入力したプログラムや変数を消去しましょう

```shell:プログラム入力の準備
>EDIT 1
OK
>>NEW
OK
>>
```

プロンプトが `>` から `>>` に変われば準備は完了です

#### 受信側のプログラム

以下のプログラムを入力します

```vb:受信側
10 DO
20 RECV 6000
30 IF STAT=10 THEN
40 LCLR:LPRINT "Rssi";RSSI
50 ELSE
60 LCLR:LPRINT "ERROR ";STAT
70 ENDIF
80 LOOP
```

* 単に `RECVコマンド` を実行してしまうと、常に待ち受け状態となってブロックしてしまうために、タイムアウト時間(ここでは6秒)を指定しています
* データを受信できたか、受信できなくてタイムアウトしたかは、30行目の `STAT変数` で分かります
* 正常に受信できた時は `STAT=10` となり、LCDにrssiの数値を表示します
    - rssiには -137～0 の値が入り、電波が強いほど 0 に近づきます
* 受信できなかった時はLCDに "ERROR" とSTAT変数の値を表示します (timeoutは8です)

#### 送信側のプログラム

送信側には以下のプログラムを入力します

```vb:送信側
10 DO
20 FOR S=4 To 1 STEP -1
30 LCLR:LPRINT "Wait ";S;"s"
40 DELAY 1000
50 NEXT
60 LCLR:LPRINT "Sending"
70 SEND "1234567890"
80 DELAY 1000
90 LOOP
```

基本的には `SENDコマンド` と `DELAYの待ち` をLOOPに入れれば良いですが、せっかくなのでLCDにカウントダウンを表示するように工夫しました

* 20行目から50行目が `FOR文のループ` で1秒ごとに 4 から 1 まで `変数S` の値を減らして、LCDに表示しています
* `変数S` が1になると `FOR文のループ` を抜けます
    - 60行目でLCDに "Sending" を表示
    - 70行目で任意のデータ "1234567890" を送信
* データ送信後、1秒待ち(80行目)、 `DO-LOOP構文のループ` で最初に戻って繰り返します

#### 実行

プログラムを入力できたら、それぞれの評価ボードで `RUNコマンド` を実行します

```shell:プログラム実行
>>RUN
```

およそ5秒間隔でrssiの数値が更新されていきます。この状態で評価ボードを持ち歩けばLoRa通信の感度を確認できると思います

![P_20200520_000842.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61404/9ac36fae-966c-32cc-d2b6-a6b7f9446955.jpeg)


[^1]: SMAアンテナ版とワイヤアンテナ版の写真を見比べると、ワイヤアンテナ版にはSMAのコネクタが省略されているようです。購入後にアンテナを付け替えることは出来ないと考えたほうがいいでしょう
[^2]: ターミナルの文字コードをSJISにすれば半角カナも使えますが、全角文字、日本語は表示できません。