LoginSignup
2
2

More than 3 years have passed since last update.

ESP8266 + E32 LoRa

Last updated at Posted at 2020-04-29

E32(EBYTE製)はRxd,TxDを接続するだけで,無線でシリアル通信が出来るデバイスです.UARTが使えればどのマイコンからも簡単に利用できます.SEMTECのSX1276を使っており,無線通信方式はLoraです.
 電源電圧とI/O電圧は3.3~5Vに対応しているので,どのマイコンからでも使いやすいです.

 上記の通り,ただブロードキャストするだけならUARTを接続するだけですが,通信相手を指定するなどの通信パラメータを変えるには,レジストリの設定などが必要です.E32のデータシート(というか取説)は公開されており,ドライバを書けばよいのですが,信号のタイミングを取ったりするのは面倒です.
 ネットで探すと,このための素晴らしいライブラリ(1)が公開されているので,これを利用して実験します.ライブラリは高機能であり,その説明用のサイト(2)も素晴らしいものですが,いかんせん英語ですので,忘備録としてここにまとめます.

 マイコンはESP8266を使いました.PCとの通信用にハードウェア・シリアルを使っており,通信モジュールのE32とのUART通信にはソフトウェア・シリアルを使いました.espsoftwareserialというライブラリがありますが,今回使用したE32のライブラリとの相性なのかバージョンが古いとうまく動かないとの報告があります.バージョン6.8.0以降であれば問題なく動くようです.

結線

ブロードキャストは簡単

 RxD,TxDの2本をつなぎ,E32に3.3~5Vの電源を与えれば動作します.
これだけなら特にライブラリもいらないですね.シリアル通信LoRa電波バラまき機(チャネルだけ合わせれば受信できる)として使えます.

細かい設定はモード4で

 E32の動作モードは4つあり,M0とM1ピンで設定します.

モード 説明 ピン設定(M1, M0)
Mode0 通信可能 0, 0
Mode1 通信可能.送信データにはスリープ端末を起動させるプリアンブルが付く 0, 1
Mode2 スリープ.起動プリアンブル付きのデータ受信で起動する 1, 0
Mode3 通信不可.設定を行うモード 1, 1

 E32では送信出力などの設定もできますが,設定するにはMode3に設定しなければなりません.
そのためM0,M1ピンもマイコンと接続します.AUXピンはバッファの状態を通知したり,いくつか機能がありますが,この際全部結線しておきましょう.

サンプル・コード

ホストから文字を受け取って,LoRaで投げるだけです.
逆も同様で,LoRaで受信したら,ホストに投げます.同じ端末を2つ用意して実験してください.
 今回は通信相手を指定せず,ブロードキャストしています.同じチャネルのデバイス全てが受信します.

#include <Arduino.h>

//#define LoRa_E32_DEBUG
#define FREQUENCY_915  //920MHz帯に設定
#define E32_TTL_100
#include "SoftwareSerial.h"  //espsoftwareserialを利用(ver6.8.0以上)
#include "LoRa_E32.h"

SoftwareSerial mySerial(0, 4); // RX, TX(ピンの設定)
LoRa_E32 e32ttl(&mySerial, 14, 13, 12);  //AUX, M0, M1

void printParameters(struct Configuration configuration);

void setup() {
  Serial.begin(9600);  //ホスト(PC)との通信用
  delay(500);

  e32ttl.begin();    //LoRaモジュール初期化

    ResponseStructContainer c;
    c = e32ttl.getConfiguration();
    Configuration configuration = *(Configuration*) c.data;  //設定用オブジェクト取得
    Serial.println(c.status.getResponseDescription());
    Serial.println(c.status.code);
    Serial.println("======Parameters======");
    printParameters(configuration);  //設定前のパラメータ表示

    configuration.ADDL = 0x01;
    configuration.ADDH = 0x00;
    configuration.CHAN = 0x0F;  //915Mhz (900 + 0x0F * 1MHz = 915MHz)
    configuration.OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION;
    configuration.OPTION.fec = FEC_0_OFF;
    configuration.SPED.uartBaudRate = UART_BPS_9600;
    configuration.SPED.airDataRate = 10;

    ResponseStatus rs = e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);  //オブジェクトを渡してE32に設定を反映させる
    Serial.println(rs.getResponseDescription());
    Serial.println(rs.code);
    Serial.println("======New Parameters======");
    printParameters(configuration);  //設定後のパラメータ表示
}

void loop() {
    // E32受信処理(E32->Serial)
  if (e32ttl.available()>1) {
      Serial.println("e32ttl.avialable");
      // read the String message
    ResponseContainer rc = e32ttl.receiveMessage();
    // エラー表示
    if (rc.status.code!=1){
        rc.status.getResponseDescription();
    }else{
        // シリアルに受信したメッセージを投げる
        Serial.println(rc.data);
    }
  }
    //シリアル受信処理(Serial->E32)
  if (Serial.available()) {
      Serial.println("Serial.available");
      String input = Serial.readString();
      ResponseStatus rs = e32ttl.sendMessage(input);
      Serial.println(rs.getResponseDescription());
  }
}

//E32の設定値を整形して表示
void printParameters(struct Configuration configuration) {
Serial.println("----------------------------------------");
Serial.print(F("HEAD BIN: "));  Serial.print(configuration.HEAD, BIN);Serial.print(" ");Serial.print(configuration.HEAD, DEC);Serial.print(" ");Serial.println(configuration.HEAD, HEX);
Serial.println(F(" "));
Serial.print(F("AddH BIN: "));  Serial.println(configuration.ADDH, BIN);
Serial.print(F("AddL BIN: "));  Serial.println(configuration.ADDL, BIN);
Serial.print(F("Chan BIN: "));  Serial.print(configuration.CHAN, DEC); Serial.print(" -> "); Serial.println(configuration.getChannelDescription());
Serial.println(F(" "));
Serial.print(F("SpeedParityBit BIN    : "));  Serial.print(configuration.SPED.uartParity, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTParityDescription());
Serial.print(F("SpeedUARTDataRate BIN : "));  Serial.print(configuration.SPED.uartBaudRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTBaudRate());
Serial.print(F("SpeedAirDataRate BIN  : "));  Serial.print(configuration.SPED.airDataRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getAirDataRate());
Serial.print(F("OptionTrans BIN       : "));  Serial.print(configuration.OPTION.fixedTransmission, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFixedTransmissionDescription());
Serial.print(F("OptionPullup BIN      : "));  Serial.print(configuration.OPTION.ioDriveMode, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getIODroveModeDescription());
Serial.print(F("OptionWakeup BIN      : "));  Serial.print(configuration.OPTION.wirelessWakeupTime, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getWirelessWakeUPTimeDescription());
Serial.print(F("OptionFEC BIN         : "));  Serial.print(configuration.OPTION.fec, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFECDescription());
Serial.print(F("OptionPower BIN       : "));  Serial.print(configuration.OPTION.transmissionPower, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getTransmissionPowerDescription());
Serial.println("----------------------------------------");
}

E32の設定

 オブジェクトに各項目を設定していくだけです.メンバ変数への代入orセッター関数で設定可能なようです.

オブジェクトの取得

  ResponseStructContainer c = e32ttl.getConfiguration();
  Configuration configuration = *(Configuration*) c.data;

オブジェクトに設定

 取得したオブジェクトに通信用パラメータを設定する

  configuration.ADDL = 0x01;  //デバイス固有のID(今回の使い方では意味はない)
  configuration.ADDH = 0x00;
  configuration.CHAN = 0x0F;  //915Mhz (900 + 0x0F * 1MHz = 915MHz)
  configuration.OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION;

設定値を反映

  ResponseStatus rs = e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);  //E32に設定
  Serial.println(rs.getResponseDescription());  //結果を確認(成功:Success)
  Serial.println(rs.code);  //結果を確認(成功:1)

設定項目一覧

必須 グループ 設定項目 内容 設定値 設定値定数
* SPED uartParity シリアル通信パラメータ(ホスト―E32) 0 ~ 3 MODE_00_8N1 ~ MODE_11_8N1
* SPED uartBaudRate 有線通信レート(ホスト―E32) 0 ~ 7 UART_BPS_1200 ~ UART_BPS_115200
* SPED airDataRate 無線通信レート 0~7 AIR_DATA_RATE_000_03~AIR_DATA_RATE_111_192
OPTION fixedTransmission 送信モード(通信相手を指定するなら1) 0, 1 FT_TRANSPARENT_TRANSMISSION, IO_D_MODE_OPEN_COLLECTORFT_FIXED_TRANSMISSION
OPTION ioDriveMode I/O設定 0, 1 IO_D_MODE_PUSH_PULLS_PULL_UPS, IO_D_MODE_OPEN_COLLECTOR
OPTION wirelessWakeupTime スリープ復帰時間 0~7 WAKE_UP_250~2000
* OPTION FEC オフにした方が実効通信レートが改善するが,干渉に弱くなる.通信端末同士で設定を合わせないと通信できない 0, 1 FEC_0_OFF / FEC_1_ON
OPTION transmissionPower 送信出力(モジュールTTL100/TTL500/TTL1Wによって設定がことなる) 0~4 POWER_20~POWER_10
ADDL その端末のアドレス(下位) uint8 (BROADCAST_ADDRESS)
ADDH その端末のアドレス(上位) uint8 (BROADCAST_ADDRESS)
* CHAN 通信チャネル 0 ~

今日はそこまで!!
IMG_20200429_201543.jpg

参考文献
(1)E32ライブラリ
https://github.com/xreef/LoRa_E32_Series_Library

(2)How to use the Library
https://www.mischianti.org/2019/10/15/lora-e32-device-for-arduino-esp32-or-esp8266-specs-and-basic-usage-part-1/

EBYTE公式
http://www.ebyte.com/en/product-view-news.aspx?id=552

総務省 技適未取得機器を用いた実験等の特例制度
https://www.tele.soumu.go.jp/j/sys/others/exp-sp/index.htm!

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2