半年ぐらい前に行った作業なのですが、忘備録のために書いておきます。
ESP32にはリモコン解析のライブラリがあります。
ちなみに
ESP32というのは、WiFi+BT+ LX6(CPU)x2のSOCチップの名前で、以下のような評価ボードが沢山出回っています。
開発ツールも沢山リリースされているので、ちょっとした装置を作りたい場合は、簡単に作れてしまいます。
Raspberry Piのように重いLinuxは動かさないけど、色んなライブラリが揃っており、WiFI+BTも使えるので、IoTなんかに良く使われています。
(一応、Linuxも動くみたいです)
そして、その評価ボードのGPIOにリモコンの受光部の出力を接続すると、リモコン解析機が出来上がりです。
Arduinoのライブラリは、
IRremoteESP8266を使います。
そして、赤外線解析ソフトは、
IRrecvDumpV3というexamplesディレクトリに入っているものを使います。
○Panasonicの場合例えば、Panasonicのライトのリモコンの場合、以下のような結果が得られます。
21:05:49.941 -> Protocol : PANASONIC
21:05:49.941 -> Code : 0x344A90F464 (40 Bits)
21:05:49.941 -> uint16_t rawData[83] = {3470, 1732, 434, 430, 434, 430, 434, 1298, 436, 1296, 436, 430, 434, 1298, 434, 430, 436, 430, 434, 430, 434, 1298, 436, 430, 434, 430, 436, 1298, 436, 430, 434, 1298, 436, 430, 434, 1298, 434, 430, 436, 430, 434, 1298, 434, 430, 436, 430, 434, 430, 434, 428, 434, 1298, 440, 1294, 434, 1298, 436, 1298, 436, 430, 432, 1298, 434, 430, 434, 432, 434, 432, 436, 1298, 436, 1298, 434, 430, 436, 428, 434, 1300, 436, 430, 432, 432, 436}; // PANASONIC 344A90F464
21:05:49.984 -> uint32_t address = 0x34;
21:05:49.984 -> uint32_t command = 0x4A90F464;
21:05:49.984 -> uint64_t data =0x344A90F464;
そこで得られた値をこんな感じでsendPanasonic64関数に渡せばリモコンの送信となります。
const uint64_t data=0x344A90F464;
sendPanasonic64( data, kPanasonic40Bits , 2);
○アイリスオーヤマの場合では、
リモコン送信用の関数が用意されていないようなメーカの場合、どうなるのでしょうか?例えば、私の家でアイリスオーヤマのライトが一つだけあります。
これを解析すると以下のような値が得られます。
21:16:07.962 -> Protocol : EPSON (Repeat)
21:16:07.962 -> Code : 0x7B019A65 (32 Bits)
21:16:07.962 -> uint16_t rawData[271] = {8942, 4426, 584, 530, 582, 1640, 580, 1638, 584, 1638, 584, 1636, 584, 528, 580, 1638, 584, 1638, 582, 528, 582, 530, 582, 526, 584, 528, 582, 530, 584, 526, 584, 528, 584, 1636, 584, 1636, 584, 528, 584, 528, 582, 1638, 582, 1638, 584, 528, 584, 1638, 582, 526, 584, 528, 584, 1636, 584, 1640, 582, 528, 584, 526, 584, 1636, 584, 526, 582, 1640, 582, 41530, 8948, 4428, 584, 528, .............. }; // EPSON (Repeat) 7B019A65
21:16:08.106 -> uint32_t address = 0x80DE;
21:16:08.106 -> uint32_t command = 0x59;
21:16:08.106 -> uint64_t data = 0x7B019A65;
プロトコルがEPSONと表示され、正しく認識されていないのがわかります。
この場合、
sendGeneric関数を呼びます。
その際に
データのフォーマットを指定する必要があり、そのために得られたデータを理解する必要があります。
(リモコンフォーマットの詳しい情報は
こちらのHPに記載されています。)
上記のデータの最初の値のペアがはLeader部分でHigh=8942, Low=4426を表していることがわかります。
次に、High=580, Low=1640のペアがデータ1、High=580, Low=530のペアがデータ0ということがわかります。
また、コマンドとコマンドの間に41530分のLow区間であることがわかります。
それを変数にすると以下のようになります。
const uint16_t kIrisHdrMark = 8942; ///< uSeconds. [Leader High]
const uint16_t kIrisHdrSpace = 4426; ///< uSeconds. [Leader Low]
const uint16_t kIrisBitMark = 580; ///< uSeconds. [Data 1 High]
const uint16_t kIrisOneSpace = 1640; ///< uSeconds. [Data 1 Low]
const uint16_t kIrisZeroSpace = 530; ///< uSeconds. [Data 0 Low]
const uint32_t kIrisCommandLength = 120000; ///< uSeconds.
const uint32_t kIrisMinGap = 41530; ///< uSeconds. [stop bit Low]
const uint16_t kIrisFreq = 36700;
そして、sendGenericを呼ぶ時に以下のように指定すれば良いわけです。
const uint64_t data = 0x7B019A65;
sendGeneric(kIrisHdrMark, kIrisHdrSpace, kIrisBitMark,
kIrisOneSpace, kIrisBitMark, kIrisZeroSpace,
kIrisBitMark, kIrisMinGap, kIrisCommandLength,
data, 32, kIrisFreq, true, 0, 50);
以上、参考までに。