hiro yamamoto works

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

赤外線リモコンをWi-Fiで中継する(赤外線送信側スケッチ)

2024-01-02 20:53:19 | 赤外線リモコン

この投稿は書きかけです。

タイトルの"Wi-Fiで・・・"は、正しくは"ESP-NOW"です。
"ESP-NOW"って何?なることが想定されるので"Wi-Fiで・・・"と表現してます。

複数のSONY製ブルーレイディスクレコーダを使っている知人が、
操作したいレコーダ以外が反応して困っているらしいとのこと

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

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

しくみ
リモコン操作で送信された赤外線をリモコン受光ユニットで受けて、
No.1マイコンでデコードして、ESP-NOW Masterで送信する
No.2マイコンはESP-NOW Slaveで受信して、リモコン信号に戻し赤外線LEDから送信する。
リモコン操作した動作がレコーダーで実行される。
赤外線が目標以外の機器で受信されないように配慮して使う。(遮蔽など)

スケッチ(プログラム)について
"IRremote"ライブラリと、ESP32ボードマネージャで追加されるサンプルスケッチ"ESPNow"使います。
スケッチ例"SendRawDemo"と"ESPNow_Basic_Slave"の合体(?)
それぞれのセクションごとに注意深く合体させてください。
ライブラリ読み込み部分、変数の定義や初期化の部分、setup()部分、loop()部分

次に追加や変更が必要な部分を書いておきます。
赤外線送信(SendRawDemo)&ESP-NOW Slave
//省略
//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;
//setup()のSerial.begin(115200)の次あたりに
delay(4000);//<追加>シリアルモニタ出力が出ない対策

//中略

/*/ callback when data is recv from Master*/
// マスターからデータを受信したときのコールバック関数 <変更>部分的に改変追加しています。
void OnDataRecv(const uint8_t *mac_addr, const uint8_t *data, int data_len) {
  char macStr[18];
  snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
           mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  Serial.print("Last Packet Recv from: "); Serial.println(macStr);
  memcpy(&IRSendData, data, sizeof(IRSendData));
  //Serial.print("Last Packet Recv Data: "); Serial.println(*data);
  Serial.print("Bytes received: ");
  Serial.println(data_len);
  Serial.print("IR_protocol: ");
  Serial.println(IRSendData.IR_protocol);
  String sProtocol = IRSendData.IR_protocol;
  Serial.print("IR_address: ");
  Serial.println(IRSendData.IR_address, HEX);
  Serial.print("IR_command: ");
  Serial.println(IRSendData.IR_command, HEX);
  Serial.print("IR_repeat: ");
  Serial.println(IRSendData.IR_repeat);
  Serial.print("IR_bit: ");
  Serial.println(IRSendData.IR_bit);
  //Serial.println("");
  if (sProtocol=="SONY") {
  Serial.println("sendSony");
  //ex. IrSender.sendSony(0x1, 0x10, 2, 12);
//赤外線送信データに戻し送信する
  IrSender.sendSony(IRSendData.IR_address,IRSendData.IR_command,IRSendData.IR_repeat,IRSendData.IR_bit);
  }

//loop()ではなにもしないのでloop()次あたりにreturn;入れてください
return;//<追加>
以上ですが解りにくいかな?間違えているかもですごめん
投稿したコードで大体の感じを掴んでもらえればと思います。
マスターからデータを受信したときに実行されるコールバック関数の中で
構造体で受け取ったデータを、"IRremote"の赤外線コードを送る関数の引数として与え赤外線送信しています。

これで全部書いたかな?終わりの予定



最新の画像もっと見る

コメントを投稿