IR Remote (5)
October 12th, 2006赤外線信号を再生するには、パルス幅をまず測って、タイマーでそれを真似すればよいみたい。
IR Remote (3)のようなプログラムで信号を読み取り、各信号のパルス幅を記録。それを再生するようにタイマーを適当な間隔で動かす。
たとえば、ボクのテレビのリモコンは52回(26回HIGHで26回LOW)波をおくっていることがわかったので、それぞれのパルス幅をタイマーで測り、それを再生することにし、52のパルス幅をあらかじめリストに登録する。
unsigned long ir_1[52] = {
0×28, 0×26,
0×05, 0×13, // 1 start
0×05, 0×13, // 1 start
0×05, 0×09, // 0 start
0×05, 0×13, // 1 start
0×05, 0×09, // 0 start
0×05, 0×09, // 0 start
0×05, 0×13, // 1 start
0×05, 0×13, // 1 start
0×05, 0×09, // 0 command 1
0×05, 0×09, // 0 command 2
0×05, 0×09, // 0 command 3
0×05, 0×13, // 1 command 4
0×05, 0×09, // 0 header
0×05, 0×09, // 0 header
0×05, 0×13, // 1 header
0×05, 0×09, // 0 header
0×05, 0×13, // 1 header
0×05, 0×13, // 1 header
0×05, 0×09, // 0 header
0×05, 0×09, // 0 header
0×05, 0×13, // 1 command 1
0×05, 0×13, // 1 command 2
0×05, 0×13, // 1 command 3
0×05, 0×09}; // 0 command 4
上は”1”を押したときに発信されるべき信号。数字はタイマーカウント。1列に2つずつ数字があるけれど、最初のほうがHIGHである時間、2つ目のほうがLOWである時間。このHIGHとLOWの組み合わせの違いでそのビットが0であるか1であるかが決まるとは前に書いた通り。(つまりボクのリモコンは26ビット分のデータを送っているといえる。)
headerとあるのはこのリモコンに特有のデバイスIDのようなものだと理解。このリモコンはcommand部分の4ビットでキーの情報を送っているみたい。commandが2回出てくるけれど、2回目は1回目の信号を反転させたものであることに注目。
プログラムでは、信号を送りたいときにタイマーのPeriodを設定し、タイマーをスタートし、タイマーの割り込みを待つ。
if(~PRT2DR & 0x02){
Timer16_1_WritePeriod(ir_1[index++]-1);
Timer16_1_Start();
}
Periodは当然上に書いたリストの最初のもの。あとは、タイマーの割り込みがかかるたびに、リストの次のPeriodを設定し、また割り込みを待つ。
Timer16_1_WritePeriod(ir_1[index++]-1);
PRT0DR ^= 0×02; // これがダーリントントランジスターアレイをON,OFFし、信号のHIGH,LOWを切り替える。
これを52回繰り返すことで、 HIGHとLOWを決まったタイミングで送ることができるというわけ。
ボクは見た目のよいリモコンの中身を自作のPCBをと入れ替えることで世界にひとつしかないボクだけのスペシャルリモコンをつくることに成功!
![]()
(PCBは前回の回路図をもとにつくる)
しかし、いざ使ってみると、見た目は良いのだけれど信号がやや弱いような感じで、テレビにかなり近寄らないとうまく信号を送れない。電池が切れているのだろうかと思い新し物と交換してみたけれど、あまり変わらない様子。むむむ。
しばらく頭をひねっていたのだけど、ふとひらめいてPWMの周波数を38KHZから40KHZに変えてみると、格段に動きが良くなる。どうやらボクのテレビは40KHZが好きなよう。受信は少々ずれていても良いようだけれど、送信はやはりそのリモコンにあったものを選んだほうが良いみたい。
このプロジェクトのファイル: ir_emitter_101206.zip