Raspberry Pi3とArduinoのLoRa通信


LoRaの通信距離と信号強度を測定しました。Raspberry Pi3とArduinoそれぞれにLoRa通信モジュールを接続し、信号強度を測定するシステムを開発しました。調査結果は「[LoRaの通信距離と信号強度](https://ambidata.io/samples/network/lora/)」をご覧ください。

# 測定システム概要

開発した測定システムは、LoRa通信で帯域幅と拡散率を変えて通信をおこない、通信距離と信号強度を調べるものです。

![システム図](https://ambidata.io/wp/wp-content/uploads/2017/09/20170905system.jpg)

LoRa通信モジュールを搭載した端末2台で通信します。
1台をArduinoを使った移動端末で、場所を変えながら、GPSで測定地点の緯度経度を調べ、緯度経度情報をLoRaで送信します。もう1台はRaspberry Pi3を使った固定端末で、移動端末からのデーターを受信し、インターネット経由でデーターをIoTデーター可視化サービス「[Ambient](https://ambidata.io)」に送信し、蓄積、可視化します。

通信する際、帯域幅(bw)を62.5kHz、125kHz、250kHz、500kHzの4通り、拡散率(sf)を7から12の6通り、計24通りに変えながら通信し、帯域幅、拡散率と信号強度の関係を調べます。

# ハードウェア

![写真](https://ambidata.io/wp/wp-content/uploads/2017/09/20170904terminals.jpg)

## LoRa通信モジュール

LoRa通信モジュールは移動端末も固定端末もEASEL社製LoRa通信モジュール「[ES920LR](http://easel5.com/productinfo/lora_module.html)」を使いました。

![ES920LRの写真](https://ambidata.io/wp/wp-content/uploads/2017/09/20170906ES920LR.jpg)

## 移動端末のハードウェア

移動端末は電池駆動にするため、マイコンは消費電力の少ないESP8266を搭載したスイッチサイエンスの「[ESPr Developer](https://www.switch-science.com/catalog/2500/)」を使いました。GPSモジュールは秋月電子の「[GPS受信機キット 1PPS出力付き 『みちびき』対応](http://akizukidenshi.com/catalog/g/gK-09991/)」を使いました。

移動端末の回路図を示します。ESP8266とLoRaモジュール、GPSモジュールはそれぞれシリアルで通信します。スイッチをつけて、スイッチをオンにした場所で緯度経度を取得し、固定端末に情報を通信するようにしています。

![回路図](https://ambidata.io/wp/wp-content/uploads/2017/09/20170906schema_esp8266-1024x628.jpg)

## 固定端末のハードウェア

固定端末はLoRaモジュールの制御とインターネット通信ができるものが必要です。ESPr Developerも使えますが、使用マイコンの事例を増やすためにRaspberry Pi3を使うことにしました。

固定端末の回路図を示します。LoRaモジュールとはシリアルで通信し、Wi-Fi経由でインターネットに接続します。

![回路図](https://ambidata.io/wp/wp-content/uploads/2017/09/20170906schema_RPi3.jpg)

# ソフトウェア

## LoRa通信モジュール「ES920LR」の制御

ES920LRは制御プロセッサーとしてARM Cortex-M0+を搭載しており、この上で直接アプリケーションプログラムを動かすこともできますし、別のマイコンからシリアル通信でコマンドを送り、制御することもできます。今回はシリアル通信でコマンドを送り制御することにしました。

ES920LRには設定モードと通信モードの二つのモードがあります。設定モードでシリアル通信でコマンドを送ることで帯域幅や拡散率などが設定できます。通信モードでは、シリアル通信で送った文字列がLoRaのデーターとして送信されます。初回電源投入後は設定モードになります。設定モードから通信モードへの切り替えは、リセット後のモードを設定するコマンドを送信し、ES920LRをリセットすることでおこないます。通信モードから設定モードへの切り替えは、「config\r\n」という文字列を送信し、ES920LRをリセットすることでおこないます。

マイコンのプログラムからES920LRをリセットするために、ESP8266もRaspberry Pi3もGPIOピンをES920LRのリセットピンに接続しました。

ESP8266やRaspberry Pi3からES920LRの帯域幅と拡散率を設定/変更する流れは次のようになります。

![図](https://ambidata.io/wp/wp-content/uploads/2017/09/20170907configflow.jpg)

## 移動端末と固定端末で同期して帯域幅、拡散率を切り替える

今回の調査では、帯域幅、拡散率を変えながらLoRaで通信し、その時の信号強度を測りました。通信する端末が使う帯域幅と拡散率が同じでないと通信できないので、移動端末と固定端末は同期して帯域幅と拡散率を変える必要があります。

LoRa通信が不達の場合でも確実に同期を取るためには、LoRaとは別の方法で通信する必要がありますが、今回は移動端末と固定端末、それぞれでタイマーでタイミングを合わせて帯域幅と拡散率を切り替えるようにしました。

## 移動端末のソフトウェア

移動端末はESP8266 Arduino/C++でプログラミングしました。ESP8266 Arduinoでのシリアル通信は「[EspSoftwareSerial](https://github.com/plerup/espsoftwareserial)」というライブラリーを使いました。GPSデーターの解析には「[TinyGPS++](http://arduiniana.org/libraries/tinygpsplus/)」というライブラリーを使いました。GPSのアクセスについては
「[ESP8266 ArduinoとGPSモジュールでGPSロガーを作る](https://ambidata.io/blog/2017/08/04/gps-2/)」をご覧ください。

プログラムの大まかな流れは以下の通りです。

* GPSで緯度経度を取得しながら、スイッチをセンスする
* スイッチが押されたら、
	* 帯域幅と拡散率を変えながらLoRaで緯度経度情報を送信する

ソースコードはGithubに公開しました。
* https://github.com/AmbientDataInc/LoRa-rssi-measure

## 固定端末のソフトウェア

固定端末はRaspberry Pi3/Pythonでプログラミングしました。Raspberry Pi3/Pythonでのシリアル通信には「[pySerial](https://pythonhosted.org/pyserial/index.html)」というライブラリーを使いました。

プログラムの大まかな流れは以下の通りです。

* 帯域幅62.5kHz、拡散率12でデーターを待つ
* データーを受信したら、帯域幅と拡散率を変えながらさらにデーターを受信する
* 24通りの帯域幅と拡散率で受信が終了したら、信号強度(rssi)と緯度経度情報をAmbientに送信する

ソースコードはGithubに公開しました。
・https://github.com/AmbientDataInc/LoRa-rssi-measure

## Ambientの使い方

[Ambient](https://ambidata.io)はIoTデーターの可視化サービスです。データーはチャネルを指定して送信し、一つのチャネルにはd1からd8まで最大8種類のデーターを送信できます。また、8種類のデーターに緯度経度情報を付加することができます。

今回、帯域幅4通り、拡散率6通り、計24通りのデーターがあるため、チャネルを4つ使い、帯域幅をチャネルに対応させ、拡散率を6通りに変えた時の信号強度(rssi)の値をd1からd6に対応させてAmbientに送信しました。

| | | sf:7 | sf:8 | sf:9 | sf:10 | sf:11 | sf:12 |
|:--|:--:|--:|--:|--:|--:|--:|--:|
|bw:62.5kHz | ch1 | d1 | d2 | d3 | d4 | d5 | d6 |
|bw:125kHz | ch2 | d1 | d2 | d3 | d4 | d5 | d6 |
|bw:250kHz | ch3 | d1 | d2 | d3 | d4 | d5 | d6 |
|bw:500kHz | ch4 | d1 | d2 | d3 | d4 | d5 | d6 |

Ambientは位置情報のついたデーターを地図上に表示する機能があり、この機能を使い、帯域幅ごとに次のように信号強度を可視化することができました。

![スクショ](https://ambidata.io/wp/wp-content/uploads/2017/09/20170906map-1024x709.jpg)

測定結果はAmbientで公開しています。

* [帯域幅62.5kHzのデーター](https://ambidata.io/ch/channel.html?id=2139)
* [帯域幅125kHzのデーター](https://ambidata.io/ch/channel.html?id=2140)
* [帯域幅250kHzのデーター](https://ambidata.io/ch/channel.html?id=2141)
* [帯域幅500kHzのデーター](https://ambidata.io/ch/channel.html?id=2142)

調査結果は「[LoRaの通信距離と信号強度](https://ambidata.io/samples/network/lora/)」をご覧ください。