パート1ではカメラの映像をSDカードに保存するところまでをやりました。
https://qiita.com/Kurogara/items/13bf38b81738731329fe
今回は、LPWA(LoRa)通信を使用してモジュール間でデータの受け渡しをやってみたいと思います。
ハードウェア
・ESP32-S3 デバイスキット×2台
・E220-900T22S LoRaモジュール×2台
ソフトウェア
今回はどちらも定期的にデータを送信、受信するシステムを設定しました。
アドレス1側
// 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);
}
}
アドレス2側
// 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です。
それでは
パート1でカメラ画像の取得
パート2でLoRa通信の確立ができましたので、
パート3では、カメラ画像をLoRa通信で送信してみたいと思います。
最近は無線関係のシステムを多く構築しています。
なにか無線やカメラ関係でお困りの方はお気軽にご相談ください~(^^)