hiro yamamoto works

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

赤外線リモコンをWi-Fiで中継する(2号機テレビ用悩むチャタリング類似現象)

2024-07-06 20:14:19 | 赤外線リモコン

この投稿は書きかけです。
スケッチは参考程度に見てください。
SONY新型テレビのリモコンは、電源ボタンのみ赤外線で、
それ以外のボタンはデフォルトがbluetooth接続とのこと(赤外線にも設定可能)

ポイント
 赤外線リモコンWi-Fi中継テレビ用
 チャタリング類似現象の解決できたか?・・・できた

タイトルでは"Wi-Fiで"と表現していますが、正しくは"ESP-NOW"です。
だれでもイメージしやすいように"Wi-Fiで"と表現しています。

SONY製レコーダーのリモコンモード変更設定可能台数不足解決から
派生したプロジェクトです。
同室に複数設置されたSONY製テレビの赤外線リモコン操作で、
目的テレビ以外が反応してしまう問題解決に役立ちます。

テレビリモコンを中継してみて使いにくいことは
① 操作が遅れる
② 1回押しが2回押し(チャタリング的)になることがある
③ 準備OK・NG(中継可否)がわからない


①・・・赤外線受信してESP-NOW送信時に毎回再接続する。
起動時に接続して状態を維持する。・・・操作レスポンス向上
loop()の中に下記を見つけてsetup()の最後へ移動
  ScanForSlave();   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 {
      Serial.println("Slave pair failed!");// スレーブペア失敗
      delay(3000); // 追加 
      ESP.restart(); // 追加スレーブペア失敗 3秒後再起動
    }
  } else {
    /*処理するスレーブが見つからない No slave found to process*/
    delay(3000); // 追加
    ESP.restart(); // 追加 スレーブが見つからない 3秒後再起動
  }

②・・・リモコンからの赤外線が"リピート2"影響もあるのかな?
 "チャタリング的"改善の"接続維持"により、操作レスポンスが
 向上したのは良かったが、チャタリングは悪化
 ・・・赤外線受信回数をカウントして、送るタイミングを制御します。
 ボタンを押し続けた時はカウント0回(初回)と10回以上の時だけWi-Fi送信します。
 ボタンを離して300mS経過したらカウント値をリセットします。
 カウント0回と10回以上の時"?理由は
 テレビ付属リモコンをテレビに向けて"入力切換"押し続けてみるとわかります。
//中略
uint8_t repeatCount = 0;
uint32_t LastSendMillis = 0;
//中略
loop(){
   if (IrReceiver.decode()) {  // Grab an IR code
    if (IrReceiver.decodedIRData.protocol == SONY) {
    //さっき送ったのと今送った時間差300mS以上のときにカウントをリセットする
      uint32_t SendMillis = millis();
       if (SendMillis - LastSendMillis >= 300) { //
        repeatCount = 0;
      }
      strcpy(IRSendData.IR_protocol, "SONY");
      IRSendData.IR_address = IrReceiver.decodedIRData.address;
      IRSendData.IR_command = IrReceiver.decodedIRData.command;
      IRSendData.IR_repeat = 2;//2で固定
      IRSendData.IR_bit = IrReceiver.decodedIRData.numberOfBits;

      LastSendMillis = SendMillis;
       //リモコンボタン押し時間が長め(**mS超え)の時 1発目送って少し待って(**mS)2発目送る
      //以降は少ない待ち時間で繰り返し
      if (repeatCount == 0 || repeatCount >= 10) {
        sendData();//ESP-NOW送信
      }
       repeatCount++;//どこに入れたら良いか暫定
    } else if (IrReceiver.decodedIRData.protocol == UNKNOWN) {
      Serial.println(F("Received noise or an unknown (or not yet enabled) protocol"));
    }
    IrReceiver.resume();
  }
}//loop()

間違いがあるかもしれません。どんなことをやっているのか参考程度に見てください。
③・・・LED追加で表示(今後)
 ・・・ 中継できていない時は
 赤外線送信器側(Wi-Fi受信側)準備完了まで、赤外線受信側(Wi-Fi送信側)が
 待って接続を完了します。(再起動繰り返します)①のスケッチとダブります。
void InitESPNow() {
   WiFi.disconnect();
   if (esp_now_init() == ESP_OK) {
     Serial.println("ESPNow Init Success");
   } else {
     Serial.println("ESPNow Init Failed");
     // Retry InitESPNow, add a counte and then restart?
// InitESPNow();
     // or Simply Restart
     ESP.restart();
   }
}


もう少し伸びしろがあるのか?
つづく



最新の画像もっと見る

コメントを投稿