Arduino (ProMicro)で家用のマルチリモコンを作る  その2

 前回の続きです。

moutakusan.hatenablog.com

 ↓こういうデータがダンプできたわけですが、どういう規格になってるんでしょうか。

f:id:moutakusan:20200908223306p:plain
ダンプされたデータ

 規格についてはこちらのサイトやこちらのサイトが参考にさせていただきました。 あと、Arduinoを使用した解析についてはdok kozoさんの記事jumbleatさんのブログも参考にさせていただきました。
 ポイントは、

  • 赤外線規格には数種類ある
    • 出力結果のEncodingってとこですね。
  • いずれの規格も全体の流れはリーダー→データ→リピート→データ→リピート→… の流れ
    • 出力結果のTimingの"+3450, -1600"がリーダー、その後の"500, -300"と"+550, -1150"がデータ。数字には少しばらつきがある。
  • データはHi期間とLow期間の比であらわされる
    • 出力結果のTimingの"+"がHigh期間、"-"がLow機関に対応している。

の三点ですかね。
 加えて、EncodingのフォーマットがPanasonicの場合は、アドレスが信号に含まれるみたいです。
 ここでちゃんとEncodingフォーマットが表示されていて、上手くデコードできている場合は、IRRemoteライブラリを使えば簡単に送信側もできそうですね。先にそっちをちょっとやってみることにします。

テレビの赤外線送信部を作ってみる

 テレビの赤外線信号はIRRemoteライブラリをそのまま使えば上手くデコードできてたみたいなので、デコードしたデータを参考に赤外線送信部を作ってみます。
 とりあえず、下記にデコードした結果の一部を書いてみました。

リモコンキー デコード結果
電源 0x555A F148688B
1ch 0x555A F148724C
2ch 0x555A F148F244
録画 0x555A F148C9F7

 デコード結果の前半の0x555Aがアドレス、後半がデータです。では試しにこれらのデータをテレビに投げてみましょう。

回路

回路はこう。

f:id:moutakusan:20200917165515p:plain
送信部回路図、 ピン5の先は前回作った受光部の回路につながってる
 赤外LEDはコレを使いました。赤外LEDの順方向電圧はTyp. 1.35V、最大定格電流はPulse駆動の場合は1000mAなんで、
    RIR = (5-1.35)V/1A = 3.65 ohm
ということで、3.65ohm以上ならOK。実際にはUSBの供給電流は最大500mAなので、余裕をもって100mA (RIR=36.5 ohm)くらいで使うことにします。1000 mA流したければ、別電源いりますね。これに合わせてトランジスタ2SC1815を使うことにしました。150mAまで流せるやつです。
 注意点として、定電流のときのLEDの最大定格は100mAなので、前のスケッチが残っていたりしてD5ピンがHighになっている状態で回路の電源入れるとLEDが壊れます。スケッチを書き込んでからLEDを接続するようにするなどして対策してください。

コード

 コードはスケッチ例のIRSendDemo.inoを編集して、テレビのON/OFF信号を5秒に1回投げるようにしました。

#include <IRremote.h>

IRsend irsend;

void setup() {
    pinMode(LED_BUILTIN, OUTPUT);

    Serial.begin(115200);
    // Just to know which program is running on my Arduino
    Serial.println(F("START " __FILE__ " from " __DATE__));
    Serial.print(F("Ready to send IR signals at pin "));
    Serial.println(IR_SEND_PIN);  //IR_SEND_PIN=5
}

void loop() {
    unsigned long tAddress = 0x555a;  //TV address
    unsigned long tData = 0xf148688B;  //Power ON/OFF
    
    for (int i = 0; i < 3; i++) {
        irsend.sendPanasonic(tAddress, tData);
        Serial.print(F("sendPanasonic(0x"));
        Serial.print(tAddress,HEX);
        Serial.print(F(", 0x"));
        Serial.print(tData,HEX);
        Serial.println(F(")"));
        delay(40);
    }

    delay(5000); 
}

結果

 スケッチを回路に書き込むと赤外LEDがチカチカ(目視ではもちろん見えませんが、スマホのカメラ越しだと赤外LEDの光が見えます。)

f:id:moutakusan:20200917164434g:plain
赤外LEDチカチカ
 赤外LEDをテレビの方に向けると…ちゃんとテレビがON/OFFしてくれました!!ちなみに、テレビからどれくらい離れても届くか試したところ、だいたい4.5mくらいまでは反応してくれました。家の中で使う分には十分なので、回路はこのまま進めようと思います。

 次回はもう少しIRremoteライブラリをいじってみようかなぁ。


つづく