Panasonic照明の赤外線信号をリモコンに学習させる

# はじめに

Panasonicの天井照明の赤外線信号を格安学習リモコンに学習させました。  
親信号は純正リモコンではなく、ネットで拾ってきた信号コードをM5stickCで出力したものです。
ハマりポイントは、M5stickCの出力の仕方と格安学習リモコンの学習方法です。

# 結論
1. M5stickCの出力関数の引数には、ビット数を40ではなく、デフォルトの48にする。  
    スケッチは以下参照。
1. 学習リモコンの学習方法
    - 親信号を出してから、LED点滅パターンが速い点滅からゆっくりの点滅に変わるまで3秒ほど待ってから、次の操作を行うこと。  
    - m5stickCのIR remoteデバイスと学習リモコンの間は0.5~1cm程度まで近づける。

# 背景

- Amazonで購入した格安学習リモコンを純正リモコンで学習させ、通常ONと常夜灯の2ボタンのみを使用していた。
    消灯は壁スイッチで実施。
- 今回格安リモコンの電池が切れたので、電池交換だけで行けると思ったら、再学習が必要となった。
    厳密に言うと、使用していた格安リモコンの動作も異常になったので、新しく格安リモコンを買い直した。
- 純正リモコンは紛失しており、親信号には使えない。
- M5stickC+IRremoteデバイスを持っている。
- ネットでリモコンの制御信号を調べてM5stickCで出力したものでリモコン学習させたいと思って調べた。

# ツール類

- パソコン: win10機
- [arduino ide](https://docs.arduino.cc/software/ide/)
- [M5stickC](https://www.switch-science.com/products/5517?_pos=5&_sid=ac9f5302c&_ss=r)
- [grove IR REMOTE デバイス](https://www.switch-science.com/products/5699)

# M5stickC + IRremoteデバイス

- arduino ideのインストールおよびセットアップは省略。
- 赤外線送受信ライブラリは[IRremoteESP8266]を使用。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304912/8e0f28cc-e8b5-2306-b564-35c16937d2cd.png)

- スケッチ例
    - AボタンをCH1の通常点灯に割り当てる。
    - BボタンをCH1の常夜灯に割り当てる。
    ```c
    #include <Arduino.h>
    #include <IRremoteESP8266.h>
    #include <IRsend.h>
    #include <M5StickC.h>

    const uint16_t kIrLed = 32;  // IR-REMOTE Unit の OUT

    IRsend irsend(kIrLed);  // Set the GPIO to be used to sending the message.

    void setup() {
      M5.begin();
      irsend.begin();
    #if ESP8266
      Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
    #else  // ESP8266
      Serial.begin(115200, SERIAL_8N1);
    #endif  // ESP8266
    }

    void loop() {
      M5.update();
      if ( M5.BtnA.wasReleased() ) {
        Serial.println("send an IR signal: A");
        // panasonic ceiling light: normal ON / CH1
        // irsend.sendPanasonic64(0x344A90B424, kPanasonic40Bits);
        irsend.sendPanasonic64(0x344A90B424, 48);
        delay(2000);
      }
      if ( M5.BtnB.wasReleased() ) {
        Serial.println("send an IR signal: B");
        // panasonic ceiling light: night on / CH1
        // irsend.sendPanasonic64(0x344A9074E4, kPanasonic40Bits);
        irsend.sendPanasonic64(0x344A9074E4, 48);
        delay(2000);
      }
    }
    ```

# リモコン信号に関する情報

以下の状況に応じた信号を送る。

[githubサイト](https://github.com/crankyoldgit/IRremoteESP8266/issues/1976#issuecomment-1531687356)より抜粋
```
Protocol : PANASONIC
Code : 0x344A9034A4 (40 Bits)
uint16_t rawData[83] = {3482, 1766, 408, 454, 406, 456, 406, 1336, 406, 1334, 408, 456, 406, 1336, 404, 456, 406, 456, 406, 458, 406, 1336, 406, 454, 406, 456, 408, 1334, 406, 458, 404, 1336, 406, 458, 406, 1336, 404, 456, 410, 454, 406, 1336, 406, 456, 404, 458, 404, 456, 406, 458, 406, 454, 406, 458, 404, 1336, 406, 1334, 406, 458, 406, 1312, 430, 456, 406, 454, 408, 1334, 406, 456, 406, 1336, 408, 454, 406, 456, 406, 1334, 408, 456, 406, 460, 402}; // PANASONIC 344A9034A4
uint32_t address = 0x34;
uint32_t command = 0x4A9034A4;
uint64_t data = 0x344A9034A4;
Only the code is listed below.
```

送出コード一覧
|command|CH1|CH2|CH3|
|---|---|---|---|
|on|0x344A90B424|0x344A90AC3C|0x344A90BC2C|
|full|0x344A9034A4|0x344A902CBC|0x344A903CAC|
|night|0x344A9074E4|0x344A906CFC|0x344A907CEC|
|high|0x344A9054C4|0x344A904CDC|0x344A905CCC|
|low|0x344A90D444|0x344A90CC5C|0x344A90DC4C|
|off|0x344A90F464|0x344A90EC7C|0x344A90FC6C|

# 格安学習リモコン

[こちら](https://www.amazon.co.jp/gp/product/B08J6LSFYH/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1)のリモコンを使用します。  
学習方法動画は[youtube](https://youtu.be/dNLIYUpYQYQ)。  
学習方法は以下の通り。  
1. 通常使用モードと学習モードの2つがあり、[POWER]と[CH UP]の2つのボタンの同時長押し(3秒ほど)で切り替えることが可能。
1. 通常使用モードではLEDは消灯状態だが、学習モードに入ると赤色LEDが速い点滅になる。  
1. 学習モードの状態で学習させたいボタンを押すと、親信号待ち状態となり、LEDは連続点灯状態(A)になる。
1. 上記A状態で親信号を格安リモコン受光・発光部に送出する。
    親信号受領に成功すると、LEDは連続点灯状態から遅い点滅になり3秒間継続した後、速い点滅に切り替わる。 
 
1. その次は、次のボタンの学習もできるし、学習モードから退出することも可能。
1. 次のボタンの学習は上記3.を実施。
1. 学習モードからの退出は、[POWER]と[CH UP]の2つのボタンの同時長押し(3秒ほど)する。
1. 学習モードのA状態にて、
    - 親信号受領に失敗するとLEDは連続点灯のまま変化しない。  
    - 約10秒経過すると、自然に通常使用モードに移行する。

# ハマり箇所

### 格安学習リモコンの学習方法

- 学習時には、
    - m5stickCのIRデバイスの発光部(トランスミッタ部)と、格安リモコン部の受光部の距離は0.5~1cm程度に近づける。  
    格安リモコン説明書には2~5cmとあるが、これでは学習が成功しない。  
    m5stickCの発光量が格安リモコン学習に対して不十分なためか。
    - 親信号受領成功後、格安リモコンのLEDは遅い点滅となるが、次に速い点滅になるまでそのまま約3秒間放置して、学習完了させる必要がある。
        この間に次の操作をしてしまうと、学習を完了できない。

### IR信号送出関数の引数

- [こちら](https://www.storange.jp/2023/11/send-40bits-panasonic-ir-with-irremote.html)のサイトによると、Panasonic製照明への送出ビット数はデフォルトの48ではなく40としなければならないとあるが、私のケースでは48である必要があった。  
    当初は40ビットで設定しており、40ビットでもm5stickCからPanasonic製照明の直接操作は問題なく反応した。  
    しかし、格安リモコンへの学習は何度やっても成功しなかった。  
    格安リモコンの仕様と思われる。
    <br/>
    Panasonic照明用の信号は以下のsendPanasonic64関数で送出可能。  
    ```
    irsend.sendPanasonic64(0x344A90B424, 48);
    ```
    送出データを第一引数、送出ビット数を第二引数に設定する。


# 参考サイト
- [Panasonic照明リモコン信号一覧](https://github.com/crankyoldgit/IRremoteESP8266/issues/1976#issuecomment-1531687356)
- [パナソニックの照明を制御する](https://days-of-programming.blogspot.com/2017/05/blog-post.html?m=1)
- [赤外線リモコンの通信フォーマット](http://elm-chan.org/docs/ir_format.html)
- [M5StickCを使って外出先からお家のエアコンを操作（前編）](https://qiita.com/jonxjon/items/af698107047e91d6a56f)
- [IRremoteで40ビットのパナソニック赤外線信号を送る](https://www.storange.jp/2023/11/send-40bits-panasonic-ir-with-irremote.html)