赤外線(IR)信号の取得
環境
取得
スケッチ例にある"IRrecvDumpV3"を使用して赤外線コードを取得。なお、"ESPr® IR 赤外線リモコン"の場合kRecvPinは5に書き換える。
今回再現するリモコンはチャンネル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()のデフォルトnbitsは48bitであることも判った。つまり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
Hideyuki Tabata
200
200
72
72