hiro yamamoto works

マイコンハード、ソフトを作ったりしています。
お家や現場のお困りごと解決に!
内容利用は自己責任でお願いします。

赤外線リモコンをWi-Fiで中継する(合体スケッチの改変したところ)

2023-12-30 15:37:26 | 赤外線リモコン

この投稿は書きかけです。スケッチにあやしい箇所や説明不足があるので調べています。

タイトルの"Wi-Fiで"は間違いかもしれません。正しくは"ESP-NOW"ですが、解りにくいですね。
複数のSONY製ブルーレイディスクレコーダを使っている知人が、
操作したいレコーダ以外が反応して困っているらしいとのこと

リモコンモード変更の設定可能台数
2013年秋以降発売モデル 6台(BD1〜6)
それ以外のモデル 3台(BD1〜3)
リモコンモード変更だけでは対応しきれないこともあるらしい

そんな訳でこのプロジェクトはスタートしております。
他にも応用できるんじゃないかという期待も含んでいます。

しくみ
リモコン操作で送信された赤外線をリモコン受光ユニットで受けて、
No.1マイコンでデコードして、ESP-NOW Masterで送信する
No.2マイコンはESP-NOW Slaveで受信して、リモコン信号に戻し赤外線LEDから送信する。
リモコン操作した動作がレコーダーで実行される。

スケッチ(プログラム)について

スケッチ例"ReceiveDump"と"ESPNow_Basic_Master"の合体(?)
それぞれのセクションごとに注意深く合体させてください。
ライブラリ読み込み部分、変数の定義や初期化の部分、setup()部分、loop()部分
もう一方の"SendRawDemo"と"ESPNow_Basic_Slave"の合体も同様に行ってください。

次に追加や変更が必要な部分を書いておきます。
赤外線受信(ReceiveDump)&ESP-NOW Master
#define IR_RECEIVE_PIN 3 //XIAO ESP32S3の時<追加>
//ESP-NOW Masterは赤外線リモコンを受信して、ESP-NOW Slaveへ送る
//<追加>構造体
typedef struct struct_IRSendData {
  char IR_protocol[10];
  uint16_t IR_address;
  uint16_t IR_command;
  uint8_t IR_repeat;
  uint8_t IR_bit;
} struct_IRSendData;
struct_IRSendData IRSendData;

uint8_t repeatCount = 0;//<追加>
//中略
//uint8_t data = 0; //<変更> sendData()関数の前
//esp_err_t result = esp_now_send(peer_addr, &data,sizeof(data)); //<変更> sendData()関数の最初の方 次行のようにする
esp_err_tresult = esp_now_send(peer_addr, (uint8_t *) &IRSendData, sizeof(IRSendData));
//中略
//
delay(4000);//<追加>Serial.begin(115200);の次の行に入れる
中略

    // リピート回数が2回未満の場合に処理を実行
    if (repeatCount < 2) {//<追加>if (IrReceiver.decode())の次の行辺りに入れる
中略
//Serial.println(F("Received noise or an unknown (or not yet enabled) protocol"));
        //}この後に次を入れる
        if (IrReceiver.decodedIRData.protocol == SONY) Serial.println("protocol = SONY ");//<追加>
        //Serial.println(IrReceiver.decodedIRData.protocol);//数値で表示される例SONY=23、SHARP=14
        Serial.print("address = ");
        Serial.println(IrReceiver.decodedIRData.address, HEX); //uint16_t
        Serial.print("command = ");
        Serial.println(IrReceiver.decodedIRData.command, HEX); //uint16_t
        Serial.println("repeat = 2");
        Serial.print("numberOfBits = ");
        Serial.println(IrReceiver.decodedIRData.numberOfBits);

        strcpy(IRSendData.IR_protocol, "SONY");//<追加>
        IRSendData.IR_address = IrReceiver.decodedIRData.address;
        IRSendData.IR_command = IrReceiver.decodedIRData.command;
        IRSendData.IR_repeat = 2 ;
        IRSendData.IR_bit = IrReceiver.decodedIRData.numberOfBits

//Serial.println();から
//IrReceiver.compensateAndPrintIRResultAsPronto(&Serial);までを/**/で括って
コメントにしておくとシリアルモニタの出力が減り見やすくなる
中略

//IrReceiver.resume();を目印にして次の行以降に挿入
      //IrReceiver.resume(); // Prepare for the next valueISR (割り込みサービス ルーチン) ステート マシンを再起動して、次の IR フレームの受信を有効にします。
      //ESP-NOW合体部分ここから>>>
      /*/ In the loop we scan for slave*/// ループの中でスレーブをスキャンする
      ScanForSlave();
      /*/ If Slave is found, it would be populate in `slave` variable*/
      /*/ We will check if `slave` is defined and then we proceed further*/
      // スレーブが見つかれば、変数 `slave` に入力する。
      // `slave` が定義されているかどうかをチェックし、次に進む。
      // スレーブ・チャンネルが定義されているかチェックする
      if (slave.channel == CHANNEL) { /*/ check if slave channel is defined*/
        /*/ `slave` is defined*/
        /*/ Add slave as peer if it has not been added already*/
        // `slave` が定義されている スレーブがまだ追加されていなければ、ピアとして追加する。
        bool isPaired = manageSlave();
        if (isPaired) {
          /*/ pair success or already paired
            // Send data to device*/
          // ペアリング成功またはペアリング済み デバイスにデータを送信
          sendData();
        } else {
          /*/ slave pair failed*/// スレーブ・ペアが失敗
          Serial.println("Slave pair failed!");
        }
      } else {
        /*/ No slave found to process*/ //処理するスレーブが見つからない
      }
      /*/ wait for 3seconds to run the logic again*/ //ロジックを再実行するために3秒待つ
      //delay(3000);
      //>>>ESP-NOW合体部分ここまで
      // リピート回数を増加
      repeatCount++;//<追加>
    } else {//<追加>
      // リピート回数が2回に達した場合、次のリモコン信号の処理を開始する前に
      // repeatCountをクリアするか、任意の初期値に設定する
      repeatCount = 0;//<追加>
    }
    IrReceiver.resume(); // Prepare for the next valueISR (割り込みサービス ルーチン) ステート マシンを再起動して、次の IR フレームの受信を有効にします。
  }

以上ですが解りにくいかな?ごめん
投稿したコードで大体の感じを掴んでもらえればと思います。
注意:リピート回数が2x2で4回になってしまうので、1回になるように追加しています。


"SendRawDemo"と"ESPNow_Basic_Slave"の合体スケッチは次の投稿にしたいと思います。

続く