目次へ

赤外線リモコンの複製(リモコンコピー機)

テレビやビデオはもちろんのこと、最近ではエアコンや扇風機、蛍光灯に至るまで、 多くの家電製品にリモコンが標準装備されるようになりました。 ほとんどのリモコンは赤外線のLEDがリモコン側に組み込まれており、 本体の受信機に点滅信号を送信して動作させる仕組みとなっています。 今回は、こうした汎用のリモコンをコピーして、 様々な家電製品を制御する仕組みを提案します。 大きな家電量販店に行けば、TV用の「学習機能付きリモコン」が 販売されています。そうした機能を電子工作で実現できれば、 他のセンサーとの組み合わせで携帯電話や電子メールで 家電製品をon/offしたりすることが可能となります。 赤外線リモコンについては FUTABA WEB さんのサイトが非常に分かりやすく書かれており、私の製作過程でも 何度も参照させていただきました。

Updated on Mar 28, 2010.
動作状況の動画(YouTube)
(90度横に向いていてすみません。)。
Arduinoのリセットボタンでon/offしている様子です。

http://www.youtube.com/watch?v=txfOeC0Xm80

背景:デジタルフォトフレームの制御

デジタルフォトフレームを愛用しています。 デジタルカメラで撮影した写真を順番に表示するデジタルの写真立てで 画質、デザインともに気に入って使っています。もともと、 こうした、生活必需品でない電子機器の使用には違和感があったのですが、 親しい友人からギフトとして頂き、使い始めると 非常に楽しく、私も他の友人にしきりに宣伝しております。 (SONYの DPF-V700 という型番です。) 私の両親の家にも置いてありまして、 時々SDカードに写真を入れて郵送しています(データ容量から 考えて、写真をデータ転送するのはやや大変ですね。 相手方にも処理作業を強いてしまいますし。)。 カードを交換するだけで写真データが全て変わりますので、 機械に詳しくない人でも簡単に使うことができます。

画質やデザインなどは文句のつけどころがないのですが、 一つだけ使い勝手の悪いところがあって、電源をonにすると入りっぱなしで、 その部屋に人がいてもいなくても、常時写真を表示し続けています。 一人暮らしや共働きのご家庭の昼間はもちろん、夜間にも 液晶にはバックライトが入っておりますので、この電力が無駄になっています。 付属のACアダプタは8.4 V、1.7 Aでおそらく、10 W程度の電力を 常時消費していると予想されます。一日のうち、12時間をoffに することができれば、一か月に10*12*30=3. 6kWhの電力を省くことができます。 1kWhは約22円ですので、一か月に80円ほどの節約になります。他方、 二酸化炭素排出量に関しては 財団法人 省エネルギーセンターによりますと、1 kWhごとの二酸化炭素排出量は0.555 kgとなっておりますので 2kg/月程度の二酸化炭素排出を抑制することができます。 どちらも大したことはないですが、電子工作の勉強も兼ねて、 リモコンコピー機を作製することにいたしました。

最初はACアダプタのon/offをリレーで制御する方法を考えましたが、 残念ながら、ACアダプタをonにしても、本体かリモコンの電源ボタンを 押さない限りは電源がonにならないことが判明いたしました。 つまり、デジタルフォトフレームのボタンを押さない限りは、 電源をon/offできないのです。そこで、付属のリモコンと同じ機能を 有する装置を作製することで、この課題を解決することにしました。 前置きが長くなりましたが、 赤外線リモコンのコピー機の作製手順(方法)を以下に示します。


赤外線の信号を解析する

赤外線リモコンからどのような信号が出ているか解析することが リモコン作成の第一歩となります。 通常のリモコンは940 nm付近の赤外線LEDを使用しています。 これを38 kHzでon/offさせて、この信号を1msec程度の周期でさらに on/offすることでテレビのチャンネルを変更したり、 音量を調整したりする命令を区別して送信しています。 38 kHzという基礎周波数に関してはメーカーによらず、同じ規格が使われています。 そのため、この周波数のみに反応する受信素子(赤外性フォトダイオード)は安価に販売されています。 今回使用したのは、秋月電子で購入した 赤外線リモコン受信モジュール(PL-IRM2121, 38 kHz)です。 単なるフォトダイオードではなく、 940 nm付近の赤外線で、なおかつ38 kHzに変調された(振動している) 信号を受信して、onの時に0 V, offの時に電源電圧(5 V)を出力する 仕組みとなっています。配線は以下の通りです。

  1. Vout= 出力信号
  2. GND= 電源のGND(0V)
  3. Vcc= 電源の5V

です。太陽光や蛍光灯にも赤外線の成分は入っています。 38 kHzに変調させるのは、こうした、リモコン以外からの 一定の赤外線を除去することで、誤動作を防ぐためです。

下の写真にマイコン(Arduino)を用いた 赤外線リモコン解析用の装置図を示します。 上のVoutを2番端子に接続しています。GNDはGNDを、Vccには 5 V端子を接続しています。


リモコンと信号解析用回路

上述の受光素子を用いることで、38 kHzのみを選択的に取り出す 回路がが不要となりますので (この振動分を無視して、0.1 msec程度のon/offが 反転されてVoutに出力されます。) 解析用のソフトウェアも非常にシンプルなものになります。

まずは、リモコンの信号がどのようなものか解析してみましょう。 最初に、信号(LEDの点滅)がlowからhighに変化した時間を シリアルで出力させることにしました。 1 msecはそれほど短い時間ではないですが、 この周期で信号をやりとりするために いくつか工夫が必要でした。例えば、シリアル通信の速度を上げる、 なるべく簡潔で早いスケッチ(ソフトウェア)とする、といったものです。 以下にArduinoで書いたプログラムを示します。これだけで全体です。 シリアルに流すデータ容量を減らすために usec単位の秒数の1から5ケタ目だけに注目し、 さらにそれを、0.1 msec (100 usec)単位の値に変化させています。 これにより、必要な時間分解能(信号は0.5 msec、1.5 msec, 2.5msecの 3つの長さのみを持ちます。)で、offからonに反転した時刻を取得できます。 PCの性能によっては、ここまでする必要はなく、 反転した時間を全て転送しても問題ないかもしれません。


// This is the IR-remote controller signal reader //

boolean IR=LOW; //変数IRをboolean(HIGHかLOWの二値)で与える。

void setup(){
  pinMode(2, INPUT); //2番ピンをINPUT(入力)に指定。
  Serial.begin(115200); //シリアル通信の開始
}

void loop(){ //プログラム本体(ずっと繰り返す。)
  IR=digitalRead(2); // 2番ピンを読んでHIGHまたはLOWをIRに代入。
  delayMicroseconds(100); //100usec待つ。
  if(IR>digitalRead(2)){ //再び2番ピンを読み、300usec前がHIGH,今がLOWとなっていれば
    Serial.print((micros()%100000)/100); //Serialに0.1msec単位の時間を返す。3ケタだけ返す。
    Serial.print(",");
  }
}

このプログラムを動作させて、リモコンを受光機に向けてボタンを押しますと、 シリアルにデータが送信され、PC上に表示されます。データを 解析するためにエクセル上にコピーして計算したものが以下の写真になります。 low/high切り替えから次の切り替えまでの時間は3, 1.8, 1.2 msecに 区別できることがわかります。


リモコン送信コード解析。

FUTABAさんのページ等を参考にいたしますと、 信号にはそれぞれ、0.6 msecのoff時間がありますので、 3 msecはリーダーと呼ばれるこれからデータを送信することを伝える信号で、 2.4(high)+0.6(low)=3.0 msecからなり、 同様にデータの1は1.2(high)+0.6(low)=1.8 msec、データの0は0.6(high)+0.6(low)=1.2 msecから なることが分かります。データの受信が完ぺきではありませんが、0と1の中間の長さの1.5 msecを しきい値にして区別すると、今回のソニー製品のリモコンの電源ボタンは Leader+10101000101100111111の信号を送信していることがわかります。 最後の1bitはHighからLowへの切り替えを読まないと分かりませんね。 ボタンを一回押すと、この20bitの信号が3回繰り返し送信されます。 各データの間には600 usecが18回分(10.8 msec)のlowの時間があります。 実際には、最後のoffも入れて、単位時間の75回分(600 usec*74=45msec)が データ送信の単位のようです。


LogからHighに切り替わったタイミングの記録。

リモコン送信コード解析(1回分)。2.4+0.6=3.0 msecがリーダー、 0.6+0.6=1.2 msecが0, 1.2+0.6=1.8 msecがon、と名付けます。

このようにデータがhighとなった時間を一回ずつ送信するのは大変で、 データ処理にも少し手間がかかります。 そこで、少しArduino側に負担をかけて、0か1かを判断させて送信したり、保存 させることにしました。。 以下のプログラムにより、上述のon,offを判断して、0101101..のようなデータが送信されます。 Time1が前回offからonになった時間、Time2が今回の切り替わりの時間で、、 その差が1.5 msec以下ならoff,1.5 msec以上ならon、のように 区別します。1.2 msec(0)と1.8 msec(1)を明確に区別したいので しきい値を1.5 msecとしています。通信速度などによってお試しの環境に 合わせて100 usecの時間を調整すれば読み取れると思います。 うまくいかないときには連続する信号を読み取っていない可能性がありますので、 何度かトライしてみてください。


// This is the IR-remote controller signal reader //

boolean IR1=0;
boolean IR2=0;
unsigned long Time2=0;
unsigned long Time1=0;

void setup(){;
pinMode(2, INPUT); //2番ピンをINPUT(入力)に指定。
Serial.begin(115200); //シリアル通信の開始。
}

void loop()    //プログラム本体(ずっと繰り返す。)
{
  //delayMicroseconds(50);
  IR1=digitalRead(2);   //ある時刻の2番端子を読む(HIGH or LOW) 。
  delayMicroseconds(100);  // 100 usec 待つ。
  IR2=digitalRead(2);  //100 usec後の2番端子を読む(HIGH or LOW)。
  if(IR2 < IR1){  // HIGHからLOWへ反転していれば
   Time2=micros();  //その時の時間を読む。
   if((Time2-Time1) < 1500 ){Serial.print(0);} //前回に反転した時からの経過時間が1.5msec未満なら0を返す。
   else {Serial.print(1);} //1.5msec以上なら1を返す。
   Time1=micros(); //反転した時間を読み直す。
}
}

赤外線の信号を生成するハードウェア。

では、上に示された"Leader+10101000101100111111"の信号を 送信する回路を作製します。38 kHzの信号は555タイマーを使って以下の回路で 出力します。これに直列にArduinoからのon/offをつなぐことで、 信号を送信します。回路は以下の通りです。 実際には回路定数はアバウトに計算しておいて、Rを10KΩの 可変抵抗としておいて38kHzに調整します。 Pin2にArduinoからの5Vを加えた時のみ赤外LED(irLED)が 点灯しますが、それを555タイマーからの38kHzの矩形波で 変調する仕組みです。BCEの部分は2SC1815などのNPNトランジスタです。


赤外線発振部の回路図。

実際の回路は以下の通りです。38kHzに調整させるために 赤外線センサーと対向させています。デジカメでは 赤外線が薄く映っているのは興味深いですね(目では全く見えません)。 左のICが555タイマーです。


プレッドボード上で組み立てた発振回路。

ソフトウェアで信号を生成。

このプログラムで先ほどの信号を再現(生成)します。


動作写真。



戸田よろず研究所トップページへ

ここで公開するアイデア/装置は安全性を保障しておりません。 用途に応じた設計を行い、十分な安全検査を行ってからご利用ください。 本サイトの情報の営利目的での利用はご遠慮ください。 本サイトの内容の無断転載を禁じます。© 2009 TYK