IRremoteで40ビットのパナソニック赤外線信号を送る

赤外線(IR)信号の取得

環境

取得

スケッチ例にある"IRrecvDumpV3"を使用して赤外線コードを取得。なお、"ESPr® IR 赤外線リモコン"の場合kRecvPin5に書き換える。

今回再現するリモコンはチャンネル3に設定されたパナソニック(Panasonic)のHK9327Kというリモコンの"全灯"ボタン。

Protocol  : PANASONIC
Code      : 0x344A903CAC (40 Bits)
uint16_t rawData[83] = {3514, 1680,  506, 348,  510, 348,  506, 1226,  502, 1222,  506, 354,  480, 1246,  506, 352,  506, 354,  506, 348,  506, 1222,  506, 348,  506, 348,  486, 1250,  502, 352,  486, 1248,  506, 348,  480, 1248,  506, 348,  506, 354,  502, 1226,  482, 374,  508, 348,  506, 352,  506, 348,  508, 352,  510, 348,  506, 1226,  480, 1252,  502, 1226,  506, 1226,  502, 348,  486, 374,  480, 1252,  502, 352,  508, 1226,  506, 348,  506, 1222,  508, 1220,  506, 348,  506, 358,  480};  // PANASONIC 344A903CAC
uint32_t address = 0x34;
uint32_t command = 0x4A903CAC;
uint64_t data = 0x344A903CAC;

これをsendPanasonic()に渡してみたのだが、うまく行かない。

ソースコードを調べる

ヒントかあわよくば答えを探りにIRremoteESP8266ライブラリのソースコードを読んだ。

/v2.8.6/src/ir_Panasonic.cpp#L65-L92
/// Send a Panasonic formatted message.
/// Status: STABLE / Should be working.
/// @param[in] data The message to be sent.
/// @param[in] nbits The number of bits of message to be sent.
/// @param[in] repeat The number of times the command is to be repeated.
/// @note This protocol is a modified version of Kaseikyo.
/// @note Use this method if you want to send the results of `decodePanasonic`.
void IRsend::sendPanasonic64(const uint64_t data, const uint16_t nbits,
                             const uint16_t repeat) {
  sendGeneric(kPanasonicHdrMark, kPanasonicHdrSpace, kPanasonicBitMark,
              kPanasonicOneSpace, kPanasonicBitMark, kPanasonicZeroSpace,
              kPanasonicBitMark, kPanasonicMinGap, kPanasonicMinCommandLength,
              data, nbits, kPanasonicFreq, true, repeat, 50);
}

/// Send a Panasonic formatted message.
/// Status: STABLE, but DEPRECATED
/// @deprecated This is only for legacy use only, please use `sendPanasonic64()`
///   instead.
/// @param[in] address The 16-bit manufacturer code.
/// @param[in] data The 32-bit data portion of the message to be sent.
/// @param[in] nbits The number of bits of message to be sent.
/// @param[in] repeat The number of times the command is to be repeated.
/// @note This protocol is a modified version of Kaseikyo.
void IRsend::sendPanasonic(const uint16_t address, const uint32_t data,
                           const uint16_t nbits, const uint16_t repeat) {
  sendPanasonic64(((uint64_t)address << 32) | (uint64_t)data, nbits, repeat);
}

コードを見てみると、sendPanasonic()はすでに非推奨"deprecated"とのこと。いまはsendPanasonic64()を使うのだそう。

/v2.8.6/src/IRsend.h#L389-L391
  void sendPanasonic64(const uint64_t data,
                       const uint16_t nbits = kPanasonicBits,
                       const uint16_t repeat = kNoRepeat);
/v2.8.6/src/IRremoteESP8266.h#L1336
const uint16_t kPanasonicBits = 48;

そしてsendPanasonic64()のデフォルトnbits48bitであることも判った。つまりPanasonicフォーマットは通常48bitの信号だということ。

なるほど、今回受信したコード0x344A903CACは40bitだったので、言うなれば簡略版Panasonicフォーマットなのだろう。

/v2.8.6/src/IRremoteESP8266.h#L1339
const uint16_t kPanasonic40Bits = 40;

ソースコードを探れば、kPanasonic40Bitsという定数もきちんと用意されていた。

/issues/1976#issuecomment-1512924067 探すとIssueでも示されていた。答えはすべてここに載っていたのだった。

答え

パナソニック信号の送信はすべてsendPanasonic64()を使う。

IRremote.sendPanasonic64( IR_SIGNAL, kPanasonic40Bits );

そして40bit信号ならば第二引数に40の定数kPanasonic40Bitsを渡すこと!

これでちゃんとシーリングライトが動かせるようになった。

6895721871072291545 https://www.storange.jp/2023/11/send-40bits-panasonic-ir-with-irremote.html https://www.storange.jp/2023/11/send-40bits-panasonic-ir-with-irremote.html IRremoteで40ビットのパナソニック赤外線信号を送る 2023-11-25T16:24:00+09:00 https://www.storange.jp/2023/11/send-40bits-panasonic-ir-with-irremote.html Hideyuki Tabata 200 200 72 72