【Private LoRa】ESP-WROOM-32をホストマイコンにしてES920LRの設定をする
この記事はArduino Advent Calendar 2021の22日目の記事です.
はじめに
前回の記事で,Private LoRa通信モジュールを活用する上で「これは最低限知ってて欲しい!」と思う内容を書きました.(Private LoRa通信は,はじめましてだ!という方は先に前回の記事から読まれると良いかもです)
そして,「Private LoRa通信モジュールを使うと,何ができるかなんとなくわかった!」となったら次は実際に使ってみたいですよね.
なので今回は,Private LoRa通信モジュールを使ってみる〜設定編〜をお届けしたいと思います!
今回の記事のゴール
みなさんは以下の目標を達成するために今回の記事を読み進めてもらうことになります.
- Private LoRa通信モジュールである「ES920LR」の通信設定をいじれるようにします.このとき,ESP-WROOM-32をホストマイコンとして使います.
- 設定時のES920LRの動きとその設定手順にどのような意味があるのかまで理解できるようにします.
あれ?ES920LR"2"じゃないの?
確かに前回の記事では「ES920LR2」を題材にしました.そして,この「ES920LR2」と今回取り上げる「ES920LR」はどちらも株式会社EASELが提供しているPrivate LoRa通信モジュールです.この2つのモジュールはピン配置,機能面で互換性を維持しています.
違いとして挙げられるのは,「ES920LR2」はLoRa変調とFSK変調への変調方式選択をファームウェア(マイクロコンピュータの内部的なプログラムだと思ってください)を更新することなく,コマンドから変更できる点です.今回の記事ではES920LRでもデフォルトで実装されているLoRa変調の通信プロトコルを利用していきます.なので,記事で取り上げるのは「ES920LR」ですが,これと互換性のある「ES920LR2」でも同じことができます.
ES920LRの設定手順
さて,ここから実際にES920LRの通信設定をやっていきましょう!すごくざっくり言うと必要なものを用意して,回路組んで,ファームウェアを書き込むだけです.順番にゆっくりやってきましょう.
0.用意するもの
ハードウェア
こちらが今回の記事で主役となるマイコン達です.
部品名 | 今回の記事での役割 |
---|---|
ESP-WROOM-32 | ホストマイコン |
ES920LR | 設定を行うPrivate LoRa通信モジュール |
必要に応じて以下のものも用意します.
今回の記事では評価ボードは使用せず,ユニバーサル基板を使います.(評価ボードの方が楽です.持ってる方は是非使いましょう.)
部品名 | 今回の記事での役割 |
---|---|
ES920EB 評価ボード | ES920LR等のモジュールを使うときに便利な評価ボードです |
ユニバーサル基板 | 半田付けをすることで簡単な基板を実装できます |
ジャンプワイヤー | 回路を組むときに使います |
ブレッドボード | 回路を組むときに使います |
ソフトウェア
今回の記事では,ArduinoIDEを使ってESP-WROOM-32の書き込みを行いますので,インストールがまだの方は以下の記事を参考にして入れておいてくださいね
※今回の記事では「ArduinoIDE ver1.8.10」を使用しました
ホストマイコンって何?なんで必要なの?
(ここは読み飛ばし可です)
さて,必要なものは用意できたので次は回路を組みたいのですが,ここで今回の記事におけるホストマイコンの役割を確認します.
まず,タイトルでも言っている「ホストマイコン」って何?と思っている方もいらっしゃるはずです.この記事におけるホストマイコンとは,ES920LRを制御するための小さなコンピュータのことを指します.
そもそもこのホストマイコンって必要なんでしょうか?株式会社EASELが公開しているデータシート(2021/12/17時点の最新バージョン)を確認してみます.
ES920LR無線モジュールは、RFトランシーバ部とMCU部で構成されています。MCU部には、ARM Cortex-M0+を内蔵しており、UART、SPI、I2C、ADC、DAC、GPIOのインターフェースが用意されています。
ES920LR無線モジュールは、下記に示すように、ホストマイコンからUARTを介して制御する事ができます。
ホストマイコンを使用する場合(ターミナルモード)
ホストマイコンを使用しない場合(プロセッサモード)
ここまで読んだ感じだと,ホストマイコンあってもなくてもどっちてもES920LRの制御はできそうですね...というか実際できます(笑)
それでは,もう少しデータシートを読み進めて今回筆者がわざわざホストマイコンを用意した理由を知って頂きましょう.
ES920LR搭載MCU(ARM Cortex-M0+)にて無線ソフト開発を行う場合、下記環境が必要となります。
ARM Cortex-M0用統合開発環境:EWARM-BL-MB(IARシステムズ社製)
ICE:I-jet(IARシステムズ社製)
ES920 評価ボード:ES920EB
これはつまり,ホストマイコンを使わない場合には専用のデバイスと開発環境を使って自分でファームウェア(マイコン内部のプログラム)をいじってくださいねーとおっしゃっています.確かに自分で書ける方はそれで良いのかも知れませんが,筆者にとっては専用の開発環境を整えるのが手間ですし,そもそも通信を実行する部分もファームウェアに記述されているはず?なので自分でいじっちゃうのは怖いですよね.
以上の理由から,今回の記事ではホストマイコンを用意してES920LRを制御します.では,なぜ数あるマイコンの中でもESP-WROOM-32を使うのでしょうか?
筆者がみなさんにとって比較的扱いやすいマイコンを選びたかったというのが理由の一つですが,それならArduinoUNOにすればいいじゃんと思われる方も多いと思います.それでも今回ESP-WROOM-32を選択したのはES920LRとホストマイコン間でUART通信のロジックレベルを合わせる必要があるためです.
今回の記事では,このロジックレベルは主題ではないので詳細な説明は割愛しますが,つまりは動作電圧の違う2つのマイコン同士では通信ができない(厳密には工夫すればできますが,今回は置いておきます)ので,ArduinoUNOではなく,ESP-WROOM-32を選択しました.
※ロジックレベルに関しての詳細が知りたい方は以下の記事から情報が得られると思います
1.回路を組む
さて,長らくお待たせしました.ここから回路を組んでいきましょう.
まずES920LRはピンのピッチが狭く,ブレッドボードにささらないのでユニバーサル基板に実装します.ES920LRの配線はES920EB 評価ボードがあれば楽にできるのですが,筆者はなくしてしまったみたいなので,頑張ってユニバーサル基板に実装しました.(泣)
みなさんがもし筆者と同様にユニバーサル基板にES920LRをはんだ付けする場合は,以下の1,2,8,9,13,24,26番のピンが使えるようにはんだ付けをしてください.
以上のようにES920LRにジャンプワイヤーをさせるようにしたら,ESP-WROOM-32と接続します.以下に接続のイメージと接続ピンの対応表を示します.このときリセットピンはプルアップするようにします.
ES920LR ピン | ESP-WROOM-32 ピン |
---|---|
GND×2 | GND |
VCCRF, VCC | 3V3 |
UART_TX | 17 |
UART_RX | 16 |
RESETB | 9 |
これでESP-WROOM-32をホストマイコンにしてES920LRの制御ができる回路が完成です.
今回の記事ではハードウェア的な面は主題ではないので触れませんでしたが,これからハードウェアを学ぶ予定のある方は「プルアップ」など知らない単語が出てきたら少しずつ知っていけると私はそれが強みになると思います.なので,今回の記事でも参考記事のリンクを載せておきますので,興味のある方は是非どうぞ!
2.ファームウェアを書き込む
ボードマネージャーを追加
まず,ArduinoIDEでESP-WROOM-32を使えるようにしないといけないので,ボードマネージャーを追加しましょう.
💻 Windowsをお使いの方の場合
- Arduino IDEを起動して,ウィンドウ左上の「ファイル」-「環境設定」をクリックします.
- 「追加のボードマネージャのURL」の隣のアイコンをクリックします.
- 以下のURLを「追加のボードマネージャのURL」の空欄に入力して,「OK」をクリックします.(このとき,すでに他のアドレスが入力されている場合,「;」でURLを区切って入力してください.)
https:/dl/package_esp32_index.json
- 「OK」をクリックします.
- 「ツール」-「ボード:」-「ボードマネージャ」をクリックします.
- 「検索をフィルタ…」に「esp32」と入力すると,「esp32 by Espressif Systems」が表示されるので,「インストール」をクリックします.(ここで筆者の開発環境でのバージョンは1.0.4でした)
- インストールが行われるので,完了するまでしばらく待ちます.
- インストールが完了したら,「閉じる」をクリックして終了です.
🍎 Macをお使いの方の場合
- Arduino IDEを起動して,画面左上の「Arduino」-「Prefernces...」をクリックします.
- 「追加のボードマネージャのURL」の隣のアイコンをクリックします.
- 以下のURLを「追加のボードマネージャのURL」の空欄に入力して,「OK」をクリックします.(このとき,すでに他のアドレスが入力されている場合,「;」でURLを区切って入力してください.)
https:/dl/package_esp32_index.json
- 「OK」をクリックします.
- 「ツール」-「ボード:」-「ボードマネージャ」をクリックします.
- 「検索をフィルタ…」に「esp32」と入力すると,「esp32 by Espressif Systems」が表示されるので,「インストール」をクリックします.(ここで筆者の開発環境でのバージョンは1.0.4でした)
- インストールが行われるので,完了するまでしばらく待ちます.
- インストールが完了したら,「閉じる」をクリックして終了です.
SoftwareSerialライブラリを追加
今回はESP-WROOM-32とES920LRをUART通信で接続します.
また,このときにSoftwareSerialを使って通信をするので,ここでインストールを済ませておきましょう.(SoftwareSerialを使わずにHardwareSerialでもできます)
Arduino IDEの「ツール」-「ライブラリの管理..」から「espso」と検索し,インストールをしてください.(ここで筆者の開発環境でのバージョンは5.3.3でした)
ファームウェアの書き込み
いよいよファームウェアをESPに対して書き込みを行なって,そのファームウェアを使ってES920LRの通信設定を変更します!
- ESP-WROOM-32とコンピュータを接続します.
- ArduinoIDEを開いて「ツール」-「ボード」から「ESP32 Dev Module」を選択します.(ESP32 Arduinoの一番上にあるかと思います)
- 「ツール」-「シリアルポート」からESP-WROOM-32が該当するポートを選択します.(cu.usbserialって書いてあるやつがたぶんそうです)
- 「ファイル」-「新規ファイル」を選択して新しいファームウェアを作成します.
- 以下のソースコードをArduinoIDEのスケッチにコピペします.
ソースコード
#include <SoftwareSerial.h> // SoftwareSerialライブラリ
#define UART_RX 17 // ES920LRの8ピン(TX)に接続します
#define UART_TX 16 // ES920LRの9ピン(RX)に接続します
#define LoRa_Rst 9 // ES920LRの24ピン(RESETB)に接続します
SoftwareSerial LoRa_ss; // Private LoRa通信モジュールとのSoftwareSerialを定義します
// Private LoRa通信モジュールからのメッセージを受信します
void LoRa_read() {
if (LoRa_ss.available())Serial.print("from LoRa >>");
while (LoRa_ss.available()) {
char c = LoRa_ss.read();
if (c < 0x80)Serial.write(c);
delay(1);
}
}
// Private LoRa通信モジュールへメッセージを送信します
void LoRa_write(char msg[]) {
LoRa_ss.write(msg);
Serial.print("to LoRa >>");
Serial.print(msg);
delay(500);
LoRa_read();
}
void setup() {
// コンピュータとの通信速度を定義します
Serial.begin(115200);
// SoftwareSerialでPrivate LoRa通信モジュールとの通信を定義します
LoRa_ss.begin(115200, UART_RX, UART_TX, SWSERIAL_8N1, false, 256); // ES920LRのデフォルトボーレート(115200bps)
Serial.println("Start!!");
// ES920LRをコンフィグレーションモードに移行します
LoRa_write("config\r\n");
// Private LoRa通信モジュールをリセットするピンを定義します
pinMode(LoRa_Rst , OUTPUT);
delay(1000);
digitalWrite(LoRa_Rst, HIGH);
delay(1000);
// Private LoRa通信モジュールを一度リセットします
Serial.println("Reset");
digitalWrite(LoRa_Rst, LOW);
delay(1000);
digitalWrite(LoRa_Rst, HIGH);
delay(1000);
// Private LoRa通信モジュールからのメッセージを受信します
LoRa_read();
// ES920LRのプロセッサーモードを選択します
LoRa_write("processor\r\n");
delay(1000);
// ES920LRの設定を全て初期設定に戻す
LoRa_write("load\r\n");
delay(100);
// 帯域幅を125kHzに設定します
LoRa_write("bw 4\r\n");
delay(100);
// 拡散率を7に設定します
LoRa_write("sf 7\r\n");
delay(100);
// 無線チャンネル番号を1に設定します
LoRa_write("channel 1\r\n");
delay(100);
// PANネットワークアドレスをABCDに設定します
LoRa_write("panid ABCD\r\n");
delay(100);
// 自ノードのネットワークアドレスを1000に設定します
LoRa_write("ownid 1000\r\n");
delay(100);
// 送信先ノードのネットワークアドレスを0000に設定します
LoRa_write("dstid 0000\r\n");
delay(100);
// 設定した内容を内蔵FlashROMに保存します
LoRa_write("save\r\n");
delay(10000);
// ES920LRをオペレーションモードに移行します
LoRa_write("start\r\n");
delay(1000);
}
void loop() {
LoRa_write("test\r\n");
delay(3000);
}
- 書き込みボタンをクリックして書き込みを行います.
- 「マイコンボードに書き込みを行なっています..」と表示されたら,ESP-WROOM-32の「Flush」ボタンを長押しします.(ESPは書き込みモードじゃないと書き込みができないので基本的に必須のアクションです)
- 「ボードへの書き込みが完了しました.」と表示されたら,完了です.
ES920LRの設定時の様子と解説
ここまでの手順でES920LRの設定変更の手順は完了です!本当にお疲れ様でした.
ここまでで今回の記事の目標の1.が達成されましたー🎉
今回の記事のゴール
- Private LoRa通信モジュールである「ES920LR」の通信設定をいじれるようにします.このとき,ESP-WROOM-32をホストマイコンとして使います.
- 設定時のES920LRの動きとその設定手順にどのような意味があるのかまで理解できるようにします.
それでは,目標の2.を達成するために,ここからは実際にES920LRが設定されている様子をArduinoIDEの「シリアルモニタ」を使って観察して,さらにそのときのES920LRはどんな動きをしているかを解説していきます.(ここからは読み物だけなので,ハードウェア系のものは一旦置いて一息つきながら読んでもらえると嬉しいです)
さて,コンピュータと接続しているESP-WROOM-32の様子をシリアルモニタを使ってみていきます.ArduinoIDEの「ツール」から「シリアルモニタ」をクリックします.すると,こんな感じの動きをしているのではないでしょうか.
最初の”Start!”が表示されませんでしたね.USB通信機能の準備に時間がかかってしまったためにシリアルモニタへの表示が間に合わなかったようです.でも,今回は特にそれでも問題ないので無視します.どうしても表示したいと思うこだわりの強い方(その気持ちを分けて欲しいくらい素晴らしいことだと私は思います)は以下の記事を参考にしてみてはどうでしょうか.
ES920LRの動作モード選択
さて話を戻します.上記のファームウェアのsetup関数に注目すると,ESPはまずES920LRとのUART通信を定義します.そしてES920LRをリセットするピンを定義してconfig
コマンドを入力後にリセットをしています.ここでconfig
コマンドは一旦置いときます.
ES920LRはリセット完了直後に以下のメッセージを送信してきました.
Select Mode [1.terminal or 2.processor]
ふむ,Select Modeですか...ES920LRの何かしらのモード選択をすることは察しがつきますね.実際,公式のコマンド仕様ソフトウェア説明書(2021/12/18時点の最新)にも以下のように書いてありました.
初回電源投入時は、ターミナルモードかプロセッサモードを選択した後、コンフィグレーションモードで起動します。
それでは,ターミナルモードとプロセッサモードのどっちを選ぶべきでしょうか.この記事を読んで察してくださっている方もいらっしゃるかと思いますが,仕様書から引用した以下の表をみてみましょう.
今回の記事ではタイトルにもあるようにESP-WROOM-32をホストマイコンとしてUART通信を行なっていますので,プロセッサモードを選択すれば良さそうですね!ターミナルモードでの設定も試してみたい方は以下の記事が参考になるかと思いますので,興味のある方は確認してみてくださいね.
最初にconfigコマンドを入力する意味とは
ここからES920LRが実際に設定されてる様子について解説をしますが,ちょっとその前にES920LRをリセットした直前に行なったconfig
コマンドについて触れておきましょう.「なんかNG 002
って怒られてるし,そのコマンドいらないんじゃないの?」って思った方,確かに今回はいらなかったですね(笑)
でも,このconfig
コマンドが今回特に役に立たなかった理由は「すでにES920LRコンフィグレーションモードだったから」なんです.ここで,ES920LRには前述したようにターミナルモードとプロセッサモードの二つのモードがあります.そしてさらに,この二つのモードにはそれぞれ「コンフィグレーションモード」と「オペレーションモード」があります.再び仕様書からこの二つのモードについての説明の記述を引用します.
ざっくり要約すると,コンフィグレーションモードはES920LRの設定を行うモードで,オペレーションモードはPrivate LoRa通信を実行するモードのようです.今回の記事ではあくまで,「ES920LRの設定」が目的なのでES920LRが起動したときにオペレーションモードに入ってたら困りますよね.だから上のオペレーションモードの説明に記述があるようにconfig
コマンドを事前に入力しておくことで,ES920LRがコンフィグレーションモードに入るようにします.
ES920LRのPrivate LoRa通信設定を行う
さて,ここまでで確実にプロセッサモードのコンフィグレーションモードに移行できたと思いますので,ES920LRの設定を変更していきましょう.コマンドは以下の書式に則して入力します.
● コマンド書式
コマンド [コマンドオプション]
・コマンドとコマンドオプションの間には必ず半角スペースを挿入して下さい。
・コマンドの終端には改行コード(CRLF)を付与して下さい。
・コマンドオプションについてはコンフィグレーション項目詳細を参照して下さい。
例えば,ES920LRの自ノードアドレス設定の設定を行うときは以下のように入力を行います.このとき,設定コマンドの直後にdelayを入れておきましょう.必須ではないのですが,少し余裕を持たせておいたほうが安全です.
LoRa_write("ownid 1000\r\n");
delay(100);
また,筆者はES920LRの設定のはじめ(プロセッサモード移行直後)にload
コマンドを入力しています.このコマンドはすべての設定をデフォルト値に戻すためのコマンドです.もちろん必須ではないのですが,このコマンドを最初に入力しておくことで,「あれ?この設定前にやったんだっけ?やってないんだっけ?」とか非効率的なことを考える必要がなくります.(プログラム上にあるコマンドが全てで後は絶対にデフォルト値になるので把握が簡単ですよね)
ES920LRの設定したい項目のコマンド入力が完了したら,その設定を内蔵FlashROMに保存しましょう.保存をしておけば次にES920LRの電源を投入した際にも今回行った設定内容が引き継がれます.コマンドは単純にsave
を入力すればOKです(改行コードを忘れがちなので注意).
また,このsave
コマンドの後には十分に時間を空けることを推奨します.筆者はいつも10秒のdelayを置くようにしてます.
以上で,今回の記事のゴールをすべて達成しましたー🎉
Private LoRa通信モジュールの通信設定内容はどれをどういじるべきなのかについては,前回の記事であったり,今後の記事で学んで頂けるようにしたいと考えておりますので,今後ともよろしくお願い致します.
今回の記事のゴール
- Private LoRa通信モジュールである「ES920LR」の通信設定をいじれるようにします.このとき,ESP-WROOM-32をホストマイコンとして使います.
- 設定時のES920LRの動きとその設定手順にどのような意味があるのかまで理解できるようにします.
(おまけ)オペレーションモードでPrivate LoRa通信を実行する
ここからは,おまけです.今回の記事の本題とは少し外れた内容になります.
ここまでで,ES920LRの通信設定の変更が完了しましたね.次にコンフィグレーションモードでstart
コマンドを入力するとオペレーションモードに移行します.そして,その後に入力するconfig
以外のコマンドはPrivate LoRa通信での送信が行われます.この記事でのファームウェアでもloop関数でtest
という文字列をPrivate LoRa通信で送信しています.でも,現状では誰も受け取ってくれないので,NG 103
と怒られてしまっていますね.次回以降の記事でES920LRさんにOK
と返してもらえるように頑張っていきます!
最後に
今回の記事では,ES920LRの設定をすることを目的として記事を書きました.また,各手順の意味の解説も行いました.
今回の主題であるPrivate LoRa通信モジュールですが,IoTシステムを構築する上で大変便利で私の研究室でもいつも利用させて頂いています.それにも関わらず,使い方を検索してみると仕様書はあっても具体的な内容や手順を示したものは少ないなと感じてます.
今回の記事も含めてPrivate LoRa通信の記事を書くことで利用者や増えたら,より発展的な使い方を他の方の記事から学べるかなという期待の意味も込めて,これからもたまに記事を書く予定です.
よろしくお願いします.
以上です.最後まで読んで頂きありがとうございました!
みなさまの貴重なご意見・ご感想お待ちしております.
参考
株式会社EASEL
取扱製品一覧 | 株式会社EASEL
ES920LRデータシート_1.05.pdf
ESP32-Arduino IDEを活用した開発環境の準備
macOSでESP32-dev-moduleを実験する。
第47回 補足 – シリアルモニタ
ES920LRコマンド仕様ソフトウェア説明書_v120
ES920LRをセットアップする(Windows)
ESP32でSoftwareSerial接続する
Private LoRa通信関連の記事シリーズ
Private LoRa通信モジュールに関する記事をいくつか書いておりますので,興味がございましたら合わせてご覧ください.
Discussion
非常に参考になる記事を投稿していただきありがとうございます。
これほど丁寧に説明しているページはあまりないのでとても助かっています。
自分の環境で行ったところ、いくつかバグがあるようでしたので他の方の参考にこちらに書いておきます。
EspSoftwareSerialのbegin()の使い方について
バージョンの違いかと思うのですが、2022/06/29で最新のver 6.16.1では
ライブラリのソースコードを見るとこのように書いてありますので、
ではなく
が正しいようです。
ちなみに、自分の環境ではbaudrateとpin以外はデフォルトの値で大丈夫でしたので、
このような使い方でもOKでした。
ES920LRとのUARTのbaudrateについて
自分の環境だと115200bpsではなく9600bpsなど低いものを使わないとES920LRから送られてきたメッセージをシリアルモニタに表示することができませんでした。
EspSoftwareSerialのREADMEには115200bpsに対応していると書かれているのですが、この記事でも下のように言及されているように動作が不安定なようです。
解決方法は以下の手順です。
上の初期化設定のコードをコメントアウトし、
上のbaudrateを9600bpsに設定するコードを追加します。
これをESP32に書き込んで実行されるとES920LRのUARTのbaudrateが9600bpsに設定されます。
次に
を
に変えてESP32に書き込みます。
シリアルモニタのbaudrateも115200bpsから9600bpsに変えると文字化けしていないES920LRからの返答が見えるはずです。
これに気付くのに1日かかってしまったので、同じバグで困っている方がいらっしゃったら試してみてください!
今、この記事通りに作業を行っているのですがシリアルモニタに表示させるところで to LoRa>>processor などは表示されるのですが from LoRa>>OKが表示させません。何か原因として挙げられるところがありましたら教えてください。