照明用赤外線リモコン


はじめに

部屋の照明のスイッチが不便な場所にあったので,赤外線で照明をON/OFFできる機器を取り付けましたが,もう一つリモコンが欲しかったので,AVRを使い自作しました.
 付属のリモコン 付属のリモコン

製作

回路図 回路図 

回路図は上図のとおりです.回路が簡単なのとケースにスペースが無いため,空中配線しました.
リモコンの送信距離を得るため,赤外線LEDをFETでドライブして1.1Aほど流しています.

赤外線リモコンを作るにはまず送信信号の波形が必要になるため,LIRCを作成してリモコンの波形を調べましたが,信号のフォーマットが一般的なものとは異なり独自のものであったためにうまくキャプチャできませんでした.
そのため付属のリモコンを分解して送信用LEDの電圧をオシロスコープで測定して波形を得ました.

ケースには,100円ショップで売っていた単三電池2個の電池ボックスが付いている3V→5V(USB)変換器のケースを使用しました.
完成した写真は次のとおりです:

完成写真(内部) 完成写真(内部)  完成写真(外観) 完成写真(外観)

ファームウェア


改造

このリモコンを制作して9.5年が経ちましたが,電池を確か一度だけ交換してずっと使い続けてきました.最近このリモコンで使ってきた蛍光灯のペンダントライトから異音が聞こえるようになってきたので,この機会にLEDのシーリングライトに交換しました.AGLEDのACL-6DGという型番のものでリモコンでコントロールできますが,一つしかリモコンが付属していなかったので昔作ったこのリモコンを新しい照明に対応させました.

まずは赤外線の信号のプロトコルを知る必要があるので,やはり昔作成した赤外線LEDリモコンの受信機を使って信号をPCに取り込みました.信号を取り込んでからAVRのコードを自動的に生成するツールを作成しました.以下のように使います.

  1. リモコン受信機から信号を取り込む
    この受信機は受信した赤外線パルスのHレベル,Lレベルの長さを交互にRS-232Cで"0123 ff00 ..."のように送信します."0123"というのは,パルス幅が0x0123 * (1 / (8,294,400 / 64))秒であることを意味します(8,294,400はクロック周波数で64はカウント用タイマーのプリスケーラー).なおノイズが入るので軽くセンサーを手で覆っておくのがよいです.
    10回以上データを取り込んで,1行に1データが格納されたテキストファイルを用意して"input.txt"としておきます.
  2. 取り込んだ信号を平均化してノイズを減らす
    "ir_decode.py < input.txt > signal.txt"とすることで,複数のデータから平均を求めるとともにパルス幅の単位をマイクロ秒に変換します.この時,得られた平均との誤差が表示されるのでそれが5%程度より大きい場合はサンプル数を増やすか外れ値のデータを除去します.
  3. 信号を圧縮する
    "ir_compress.py 7 < signal.txt > code.txt"とすることで信号を圧縮します.指定する数字は小さいものから試して,誤差が5%以下程度になるまで増やしていきます.赤外線リモコンの信号はいくつものパルスから構成されていますが,使われるパルスの長さは限られているのでリモコンではその決まった長さだけを生成します.分割型のクラスタリングのようなことを行います.
  4. アセンブラコードを出力する
    "ir_generate.py < code.txt"とすることでアセンブラのコードを出力します.パルス幅の情報をフラッシュ領域やEEPROMにデータとして保持する方がすっきりしていますが,デッドストックになっているAT90S1200で使うことも考えて直接コードを生成するようにしました.

生成されたAVRのコードはここにあります.この自作リモコンには2つスイッチがあるので,ON/OFFと常夜灯に割り当てました.かなり久しぶりにAVRのアセンブラを使いましたが,avrasm2は今使っているマシンにインストールしていなかったので,Arduinoに含まれているavr-asを使うことにしました."#include <avr/io.h>"としてヘッダファイルを読み込む前に"#define __ASSEMBLER__"としておかないとアセンブラ用のコードが生成されない問題に時間を使ってしまいました.


[戻る]

2020-06-11 ページ更新
2011-01-30 ページ作成
(2010-11 製作)
T. Nakagawa