« 2026年2月 | トップページ | 2026年6月 »

2026年3月

2026年3月20日 (金)

Loraデバイス E220-900T22S の動作確認

20260320lora
写真1.LoRaデバイスの送受信実験回路


Loraデバイスの動作試験を行ったので、備忘録として書いておく。

Loraとは、スペクトラム拡散技術を応用した、低消費電力での長距離通信を可能にする無線通信方式。

そもそも何のためにこの検証をしようと思ったかというと、マンション1階の郵便受けに荷物が届いたかどうかを検知するための無線センサが作れないかどうか考えたのが始まりだった。

現在、鉄筋コンクリート4階建てのマンションの3階に住んでいて、郵便受けは一階の入口に設置されており、ステンレス製だ。条件としては、郵便受けを改造せず、アンテナを外部に引き出すのもNGとする。つまりステンレスの箱の中から、外部にアンテナを出さずに、データを電波で送ってそれを受信できるか?ということだ。

以前、Wifiで信号が送れないか予備実験を行ったが、うんともすんともデータは送れなかった。このときはESP32を使用した。

LoRaに採用されているスペクトラム拡散方式の通信技術は、ノイズや干渉に強いという特徴があるため、ひょっとしたら郵便受けの中から部屋に向けて通信が可能なのではないかと思ったのだ。

そういうわけで、さっそく秋月にいって、LoRaモジュールを2個購入してきた。E220-900T22S(JP)-EV2というもので、1個1980円。アリエクに慣れているとちょっと高い買い物だが、まあしょうがない。

とりあえず片方のデバイスから"hello(^-^)/"と送信して、これをもう片方のデバイスで受信できるようにし、送信側のデバイスを1階の郵便受け内部に設置して、3階の部屋でこれを受信できるか検証するのが、今回の目的である。
結論を先に書いておくと、郵便受けの中から2秒ごとに送信した"hello(^-^)/"信号が、3階の部屋で大体2~3分に一度受信できた。予想としては、Wifiと同じくまったく受からないのではないかと思っていたので、意外な結果だった。

必要最低限のコードで通信テストを行う手順は以下の通り。

使用するマイコンはESP32。よくあるUSB接続のブレークアウトボードを使った。環境はArduino、バージョンはesp32_3.3.5。
LoRaモジュールE220のConfigが初期値である前提ならば、透過送信モード(Transparent)が使用でき、ハンドシェイクやペアリングをせずにテキストの通信ができる。送信、受信のコードは次の通り。

////////////////////////////送信コード ここから
/*
  20260319 Lora E220 送信テスト
  arduino esp32_3.3.5
  Device Config = Default
  M0=M1=0
  AUX:Open
  E220 Tx → ESP32-16
  E220 Rx → ESP32-17
*/

HardwareSerial LoraSerial(2);

void setup() {
  Serial.begin(115200);
  LoraSerial.begin(9600, SERIAL_8N1, 16, 17);
  delay(1000);
  Serial.println("TX start");
}

void loop() {
  LoraSerial.println("hello (^-^)/");
  Serial.println("sent: hello (^-^)/");
  delay(2000);
}
////////////////////////////送信コード ここまで

////////////////////////////受信コード ここから
/*
  20260319 Lora E220 受信テスト
  arduino esp32_3.3.5
  Device Config = Default
  M0=M1=0
  AUX:Open
  E220 Tx → ESP32-16
  E220 Rx → ESP32-17
*/

HardwareSerial LoraSerial(2);

void setup() {
  Serial.begin(115200);
  LoraSerial.begin(9600, SERIAL_8N1, 16, 17);
  delay(1000);
  Serial.println("RX start");
}

void loop() {
  while (LoraSerial.available()) {
    char c = LoraSerial.read();
    Serial.write(c);
  }
}
////////////////////////////受信コード ここまで

LoRaモジュールは、VCCに3.1~5.5Vの電源電圧を供給し、M0,M1端子はGNDに接続、AUXはオープン、Tx,RxはそれぞれESP32の16,17pinに接続する。
コードは、
LoraSerialと名付けたUARTのインスタンスに対し任意の文字列を送るだけのごく単純なものだ。

ところがやってみると、受信できていない。
そこで、LoRaモジュールのConfigがどのような設定になっているか調べてみることにした。
ArduinoにLoRa用のライブラリ"EByte LoRa E220 library by Renzo Mischianti 1.0.8"を追加し、次のArduinoコードを書き込んで実行する。
ダウンロード - 20260319_lora_e220_readconfig_000_ok.ino

すると、シリアルモニタに次のようにConfigの内容が表示された。2個のデバイスの両方とも同じ内容だった。

/////////////////////////////////
E220 configuration read start
Status code: 1
Status: Success
----------------------------------------
HEAD : C1 0 8

AddH : 0
AddL : 0

Chan : 0 -> 410MHz

UART parity : 1 -> 8O1
UART baud : 11 -> 9600bps (default)
Air data rate : 0 -> 2.4kbps

Sub packet : 0 -> 200bytes (default)
TX power : 0 -> 22dBm (Default)
RSSI ambient noise : 0 -> Disabled (default)

WOR period : 0 -> 500ms
LBT enable : 0 -> Disabled (default)
RSSI enable : 0 -> Disabled (default)
Fixed transmission : 1 -> Fixed transmission (first three bytes can be used as high/low address and channel)
----------------------------------------

内容を注意深く見ていくと、デフォルト設定ではない箇所がある。
ひとつはUART parity : 1 -> 8O1で、これはデフォルトでは8N1であるべき。そしてもうひとつは、
Fixed transmission : 1 -> Fixed transmission (first three bytes can be used as high/low address and channel)
この部分は、上の通信プログラムを実行させるには"Transparent transmission"になっていないといけない。
周波数は920MHzなのだが、410MHzになっているのはおかしい。

そこで、次のコードを書き込んで実行し、すべてのパラメータをDefaultに修正する。
ダウンロード - 20260319_lora_e220_setconfigdefault000_ok.ino

実行したら、再度、上に書いたConfigの読み込みコードを書き込んで実行し、内容を確認する。次の内容になった。

----------------------------------------
HEAD : C1 0 8

AddH : 0
AddL : 0

Chan : 0 -> 410MHz

UART parity : 0 -> 8N1 (Default)
UART baud : 11 -> 9600bps (default)
Air data rate : 10 -> 2.4kbps (default)

Sub packet : 0 -> 200bytes (default)
TX power : 0 -> 22dBm (Default)
RSSI ambient noise : 0 -> Disabled (default)

WOR period : 0 -> 500ms
LBT enable : 0 -> Disabled (default)
RSSI enable : 0 -> Disabled (default)
Fixed transmission : 0 -> Transparent transmission (default)
----------------------------------------

これで、上で述べた箇所が修正された。すなわち、
UART parity : 0 -> 8N1 (Default)
Fixed transmission : 0 -> Transparent transmission (default)
この部分が修正された。周波数が410MHzと表示されているのはおかしいのだが、読み出しソフトのバグだろうか?

この修正を2つのデバイスに行ったうえで、再度上に書いた送受信コードを書き込んだところ、こんどはちゃんと受信できた\(^o^)/

このデバイスをより本格的に使用するには、たとえば透過モードではなく固定通信モードに設定して、送信先のアドレス、チャンネルを指定して特定の相手にのみデータを送るなどの方法がある。手順を大雑把に述べると、モードをTransparent transmissionからFixed transmissionに変更し、送信するシリアルデータを[ADDRH][ADDRL][CHAN][DATA...]のようにする。
たとえば、宛先アドレスが0x0002、チャンネルが0x00、データが"hello"なら、

uint8_t data[] = {
0x00, 0x02, 0x00, // 宛先アドレス(H,L) + チャンネル
'h','e','l','l','o','\n'
};
LoraSerial.write(data, sizeof(data));

こんな感じになるだろう。

そういうわけで、とりあえず送受信ができるようになったので、送信側を3.8Vのリチウムイオン電池駆動にして、同じく秋月で715円で売っていた専用のアンテナをつけて紙袋に入れ、1階の郵便受けの中に入れて、3階の自室で受信確認をしたところ、2秒ごとに送信している"hello (^-^)/"が2~3分に一度受信できる、という結果になった。これならひょっとしたら実用できるかもしれない。構想としては、光センサをつけて、郵便受けになにかが入ることで反射光の状態が変化したら、信号を送信するようにすれば、荷物検知ができそうだ。

やはり今回の金属製郵便受けの内部から電波を送信するというプロジェクトの最大のネックはアンテナで、アンテナの外出しおよび郵便受けの改造はNGという条件ではかなり困難だ。通信をより確実にするためにできることがあるとすれば、郵便受けの箱そのものに給電してしまって飛びを確認するか、あるいは扉に開けられている細長い穴をスロットアンテナとして使うか、くらいだが、細長い穴は41mmで、920MHzの波長は約30センチ、1/2λなら15センチなので、41mmでは全く足りない。なかなかむつかしい課題だ……


| | | コメント (0)

« 2026年2月 | トップページ | 2026年6月 »