ESP32[28] E32-900T20D

概要

アマゾンで「SX1276 LoRa 無線915Mhz UARTシリアルモジュール LoRaWAN トランスミッター レシーバー + 915Mhz アルドゥイーノ STM32 51Bと互換性のある for Arduino 3dBi SMAアンテナ51シングルチップマイクロコンピュータ 免許不要の特定小電力無線局 862~930Mhz」なるものを購入しました。いわゆる LoRa 無線というやつです。

E32-900T20D

E32-900T20DのマニュアルEBYTE E32-900T20D User Manual (PDF)

Introduction

E32-900T20D は、SEMTECH 社の SX1276 RF チップをベースにした UART(シリアル)対応の無線通信モジュール です。
複数の送信モードを備え、動作周波数帯は 862MHz ~ 931MHz、
LoRa 拡散スペクトラム技術を採用し、TTL レベル出力に対応しています。SX1276 は LoRa™ 技術を搭載しており、長距離通信が可能で、電力密度が集中し、高い秘匿性(セキュリティ性能)を持つという特長があります。
送信出力 20dBm の本モジュールには 産業用グレードの水晶発振器が使用されており、通信の安定性と一貫性が確保されています。E32-900T20D は、ユーティリティメーター、IoT 改修、スマートホーム などの用途で広く使用されています。本モジュールは データ暗号化および圧縮機能を備えており、空中で送信されるデータは ランダム性を持ち、無線データレートのデフォルト値は 2.4kbps です。また、E32-900T20D は FCC、CE、CCC の設計規格を厳格に遵守しており、輸出に必要な各種 RF 認証要件を満たしています。

暗号化はされているようです。CRCはついてないですが、暗号化されているなら、同じなのであえて付けなくても良さそうですね。20dBm なので意外とありますね。データレイトが 2400bps です。バイト数は58B、通信距離は5500m(ほんとか?)なのであまり大きなデータは送れませんが、そこそこのアプリには使えそうです。

UART 3.3V のインターフェースです。

AUX

AUXがついています。モジュールに電源が投入されると、AUX はすぐに低レベルを出力し、ハードウェアのセルフチェックを実行し、ユーザーのパラメーターに基づいて動作モードを設定します。 処理中、AUX はローレベルのままです。 プロセスが完了すると、AUX は高レベルを出力し、M1 と M0 によって組み合わされた動作モードに従って動作を開始します。
したがって、ユーザーは、モジュールの通常の作業の開始として、AUX の立ち上がりエッジを待つ必要があります。

モードスイッチ

ユーザーは、M1とM0の組み合わせによって動作モードを決定できます。 MCUの1つのGPIOを使用してモードを切り替えることができます。 M0またはM1を変更した後、モジュールが空いている場合は1ms後に新しいモードで動作を開始します。 まだ無線送信を終了していないシリアルデータがある場合は、UART送信が終了した後、新しいモードで動作を開始します。 モジュールがワイヤレスデータを受信し、シリアルポートを介してデータを送信すると、送信が終了した後、新しいモードで動作を開始します。 したがって、モードスイッチはAUX出力XNUMXの場合にのみ有効であり、そうでない場合は遅延します。
例えばampつまり、モード0またはモード1で、ユーザーが大量のデータを連続して入力し、同時に動作モードを切り替えると、モード切り替え動作は無効になります。 新しいモードのチェックは、すべてのユーザーのデータ処理が完了した後にのみ開始できます。 AUXピン出力状態を確認し、AUXがハイレベルを出力してから2ms待ってからモードを切り替えることをお勧めします。

モジュールが他のモードからスタンバイモードに切り替わる場合、残りのすべてのデータ処理が完了した後にのみ、モジュールはスタンバイモードで動作します。 この機能を使用すると、消費電力を節約できます。 例ampつまり、トランスミッタがモード0で動作している場合、外部MCUがデータ「12345」を送信した後、AUXピンの立ち上がりエッジを待たずにすぐにスリープモードに切り替えることができます。また、ユーザーのメインMCUはすぐに休止状態になります。 次に、モジュールはすべてのデータをワイヤレス送信で送信し、1ミリ秒後に自動的に休止状態になります。これにより、MCUの動作時間が短縮され、電力が節約されます。
同様に、この機能は任意のモードスイッチで使用できます。 モジュールは、現在のモードタスクを完了してから1ms以内に新しいモードで動作を開始します。これにより、ユーザーはAUX照会の手順を省略してモードをすばやく切り替えることができます。 例ampつまり、送信モードから受信モードに切り替えるとき、ユーザーMCUはモード切り替えの前に休止状態になり、外部割り込み機能を使用してAUXを変更し、モード切り替えを実現できます。

技適

E32-900T20Dを使用するには免許はいりませんが、装置は技適を取得してある必要があります。ただし、日本国内や他国で使用されている一般的な無線設備の場合は特例があります。

技適未取得機器を用いた実験等の特例制度

注意事項

実験・試験・調査を行う専門家が、自己責任で無線機器を使用するための手続きです。
技適マークがある場合は、この手続きを行わなくても使用できます。技適マークは、登録証明機関に申請して証明を受けるなどの方法で取得することができます。
本制度は届出制度です。届出の受理に当たり形式上の審査(未記入箇所がないかなど)を行いますが、申請制度とは異なり事前審査や許可・承認等はありません。ご自身の責任で特例制度の対象範囲内で使用いただく限り、届出が到達したときから直ちに特例の効力が生じます。
特例制度関係の法令を事前に必ず確認してください。併せて、機器の仕様書および外国の認証による方法、またはその他の法令に定められた方法により特例制度の対象となっていることを必ず確認してください。

ESP32からの制御

  • 最大送信バイト数は58バイト
  • AUXがLOWの間は送信不可

マニュアルにもあるように、どのタイミングで送信を開始するかを判断するためには、AUXを見るのは必須事項です。LOWから数ミリ秒待ってから送信するのが良いと思います。LOW時間は短いので割込みで見つけます。

#define E32_AUX_PIN 18

volatile bool aux_low_seen = false;

void IRAM_ATTR aux_isr(void)
{
    if (digitalRead(E32_AUX_PIN) == LOW) {
        aux_low_seen = true;
    }
}

void setup(void)
{
    pinMode(E32_AUX_PIN, INPUT_PULLUP);   // ダメなら INPUT に変更
    attachInterrupt(digitalPinToInterrupt(E32_AUX_PIN),
                    aux_isr, CHANGE);
}

static void wait_aux_high_stable(uint32_t stable_us, uint32_t timeout_ms)
{
    uint32_t t0 = millis();
    uint32_t high_start = 0;

    while ((millis() - t0) < timeout_ms) {
        if (digitalRead(E32_AUX_PIN) == HIGH) {
            if (high_start == 0) high_start = micros();
            if ((micros() - high_start) >= stable_us) {
                return;
            }
        } else {
            high_start = 0;
        }
    }
}

void e32_send_once(const char *buf, int len)
{
    aux_low_seen = false;

    /* 送信前:BUSYでないことを確認 */
    wait_aux_high_stable(3000, 50);   // HIGHが3ms続いたらOK

    /* 送信 */
    E32Serial.write((const uint8_t*)buf, len);
    E32Serial.flush();                // UART完了

    /* 送信中にLOWを一度でも見たら完了待ちを厳密に */
    if (aux_low_seen) {
        wait_aux_high_stable(3000, 100);
    } else {
        /* LOWを見逃した場合の保険 */
        delay(5);
    }
}

e32_send_once(txbuf, len);