ESP32を使用してカメラ映像をLoRa通信で飛ばしてみた　パート２

パート１ではカメラの映像をSDカードに保存するところまでをやりました。
https://qiita.com/Kurogara/items/13bf38b81738731329fe

今回は、LPWA（LoRa）通信を使用してモジュール間でデータの受け渡しをやってみたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/5e567ada-95fd-3139-3459-c890809f2768.png)

## ハードウェア
・ESP32-S3　デバイスキット×２台
・E220-900T22S　LoRaモジュール×２台

## ソフトウェア
今回はどちらも定期的にデータを送信、受信するシステムを設定しました。
アドレス１側
```c

// LoRa設定==============================================================
#define M0 46  //E220のM0
#define M1 3   //E220のM1

#define UARTRXD 48
#define UARTTXD 45

int Ch_No = 0;  //送信するチャンネル
//=======================================================================

//===================================================================

void setup() {
  Serial.begin(115200);
  delay(100);

  // LoRa用初期設定-------------------------------------------------------
  Serial.println("LoRa setup start");
  Serial2.begin(9600, SERIAL_8N1, UARTRXD, UARTTXD);  // E220通信用
  //E220を設定モードに切り替え
  pinMode(M0, OUTPUT);
  pinMode(M1, OUTPUT);

  digitalWrite(M0, HIGH);
  digitalWrite(M1, HIGH);
  delay(100);

  //設定値を書き込み アドレス設定
  Serial2.write(0xC0);   //書き込みコマンド
  Serial2.write(0x00);   //スタートアドレス
  Serial2.write(0x08);   //書き込むサイズ
  Serial2.write(0x00);   //00H アドレス上位バイト
  Serial2.write(0x01);   //01H アドレス下位バイト
  Serial2.write(0x70);   //02H ボーレート9600、ADR1758、SF9、BW125
  Serial2.write(0xC0);   //03H パケット長32byte、RSSI無効、送信出力13dBm
  Serial2.write(Ch_No);  //04H チャンネル番号
                         //  Serial2.write(0xC3);   //05H RSSIバイト有効、送信方式固定、WOR2000ms
  Serial2.write(0x43);   //05H RSSIバイト無効、送信方式固定、WOR2000ms
  Serial2.write(0x01);   //06H パスワード上位
  Serial2.write(0x36);   //07H パスワード下位

  delay(100);

  bool flag = false;
  while (Serial2.available() > 0) {
    //新しいデータを配列の始めに入れる
    int incomingChar = Serial2.read();
    Serial.print("r_Data = ");
    Serial.println(incomingChar, HEX);
    if (incomingChar == 0x36) {  //正常に最後の0x36が書き込まれた
      flag = true;
      Serial.println("E220 Set ok");
    }
  }

  //正常にE220に書き込まれない場合はリスタート
  if (flag == false) {
    ESP.restart();
  }

  //E220を運用モードに切り替え
  digitalWrite(M0, LOW);
  digitalWrite(M1, LOW);
  delay(100);

  //Setup終了
  Serial.println("LoRa setup end");
  
  delay(1000);
}

void loop() {
  delay(3000);

  //ヘッダ情報の送信
  Serial2.write(0x00);   //ターゲットアドレス上位
  Serial2.write(0x02);   //ターゲットアドレス下位
  Serial2.write(Ch_No);  //チャンネル番号
  Serial2.write(0xff);

  delay(2000);

  while (Serial2.available() > 0) {
    //新しいデータを配列の始めに入れる
    int incomingChar = Serial2.read();
    Serial.print("r_Data = ");
    Serial.println(incomingChar);
  }
}
```

アドレス２側

```c

// LoRa設定==============================================================
#define M0 4  //E220受信用のM0
#define M1 5  //E220受信用のM1

#define UARTRXD 7  //受信E220用
#define UARTTXD 6

int Ch_No = 0;  //送信するチャンネル
//=======================================================================

//===================================================================

void setup() {
  Serial.begin(115200);
  delay(100);

  // LoRa用初期設定-------------------------------------------------------
  Serial.println("LoRa setup start");
  Serial2.begin(9600, SERIAL_8N1, UARTRXD, UARTTXD);  // E220通信用
  //E220を設定モードに切り替え
  pinMode(M0, OUTPUT);
  pinMode(M1, OUTPUT);

  digitalWrite(M0, HIGH);
  digitalWrite(M1, HIGH);
  delay(100);

  //設定値を書き込み アドレス設定
  Serial2.write(0xC0);   //書き込みコマンド
  Serial2.write(0x00);   //スタートアドレス
  Serial2.write(0x08);   //書き込むサイズ
  Serial2.write(0x00);   //00H アドレス上位バイト
  Serial2.write(0x02);   //01H アドレス下位バイト
  Serial2.write(0x70);   //02H ボーレート9600、ADR1758、SF9、BW125
  Serial2.write(0xC0);   //03H パケット長32byte、RSSI無効、送信出力13dBm
  Serial2.write(Ch_No);  //04H チャンネル番号
                         //  Serial2.write(0xC3);  //05H RSSIバイト有効、送信方式固定、WOR2000ms
  Serial2.write(0x43);   //05H RSSIバイト無効、送信方式固定、WOR2000ms
  Serial2.write(0x01);   //06H パスワード上位
  Serial2.write(0x36);   //07H パスワード下位

  delay(100);

  bool flag = false;
  while (Serial2.available() > 0) {
    //新しいデータを配列の始めに入れる
    int incomingChar = Serial2.read();
    Serial.print("r_Data = ");
    Serial.println(incomingChar, HEX);
    if (incomingChar == 0x36) {  //正常に最後の0x36が書き込まれた
      flag = true;
      Serial.println("E220 Set ok");
    }
  }

  //正常にE220に書き込まれない場合はリスタート
  if (flag == false) {
    ESP.restart();
  }

  //E220を運用モードに切り替え
  digitalWrite(M0, LOW);
  digitalWrite(M1, LOW);
  delay(100);

  //Setup終了
  Serial.println("LoRa setup end");

  delay(1000);
}

void loop() {
  delay(3000);

  //ヘッダ情報の送信
  Serial2.write(0x00);   //ターゲットアドレス上位
  Serial2.write(0x01);   //ターゲットアドレス下位
  Serial2.write(Ch_No);  //チャンネル番号
  Serial2.write(0xff);

  delay(2000);

  while (Serial2.available() > 0) {
    //新しいデータを配列の始めに入れる
    int incomingChar = Serial2.read();
    Serial.print("r_Data = ");
    Serial.println(incomingChar);
  }
}
```
これで双方にデータのやり取りができればOKです。

それでは
パート１でカメラ画像の取得
パート２でLoRa通信の確立ができましたので、
パート３では、カメラ画像をLoRa通信で送信してみたいと思います。

最近は無線関係のシステムを多く構築しています。
なにか無線やカメラ関係でお困りの方はお気軽にご相談ください～(^^)