赤外線学習リモコンの信号定義データの合成
(松下デジタルチューナー編)

はじめに

クロッサム2+などのプログラマブルな学習リモコンの信号データを、リモコン同士ツノつき合わせて学習させるのではなく、PC上で理想的な波形に合成するためのノウハウです。

信号データが合成できると、以下のようなメリットが期待できます。

・ なまっていない、きれいな信号が出せるようになるので、機器の反応が良くなる。
・ いつでも欲しいときにデータが合成できるので、学習したデータの保存に気を使わなくてもよくなる。
・ 機器付属のリモコンでは送れない、未知のコマンドを探求できる(笑)。

本稿では、松下製 BS/110度CS/地上デジタルチューナーのリモコンを取り上げます。
(動作確認は TU-MHD500 で行ないました)

もくじ

リモコン信号の詳細
クロッサム2+用信号定義データへの変換方法
N504iS用データへの変換方法(調査中)
松下製デジタルチューナーのリモコンコード

リモコン信号の詳細

「家電製品協会(家製協)フォーマット」と呼ばれているもの。

フォーマット

┌─────┬──────────┬──────┐
│リーダー部│   データ部   │トレーラー部│
└─────┴──────────┴──────┘

・ リーダー部

ON(8T)→OFF(4T)
Tは0.35〜0.5msと規定されている。典型的には中央値0.425msを使用する。

・ データ部

3バイト以上・任意バイト数の送信データ。各バイトは LSB first。
データ「0」は ON(1T)→OFF(1T)
データ「1」は ON(1T)→OFF(3T)

なお、データの内容は

・ 1〜2バイト目がカスタムコード(ベンダー/機器の識別)
・ 3バイト目以降がデータコード(コマンド等)

コードの具体的な値は後述。

・ トレーラー部

ON(1T)→OFF(nn)
nnは8ms以上と規定されている。松下製デジタルチューナー付属のリモコンの場合は約75ms。

キャリア周波数

赤外線LEDの発光時(ON時)の点滅周波数。
33〜40kHzが推奨されている。典型的には中央値に近い36.7kHzを使用する。

クロッサム2+用信号定義データへの変換方法

家製協フォーマットのクロッサム2+用信号定義データは以下のようになる。
(キャリア周波数 36.7kHz、T=0.425ms、トレーラー長 75msの場合)

00            ; おまじない。
04            ; 信号波形定義の数。
                ひと組の波形定義で「ON→OFF→」の一周期分を定義する。
22            ; キャリア周波数を決める分周比
                 [2.5MHz/36.7kHz/2=34.1≒0x22]。
              ; --- ここから信号波形定義 ---
260400 260400 ; データ「0」の波形。ON(1T)→OFF(1T)、すなわち
                ONが0x000426クロック継続したあとOFFが0x000426クロック継続
                 [1T=0.425ms*2.5MHz=1062.5≒0x426]。
260400 730c00 ; データ「1」の波形。ON(1T)→OFF(3T)。
342100 9a1000 ; リーダーの波形。ON(8T)→OFF(4T)。
260400 6cdc02 ; トレーラーの波形。ON(1T)→OFF(75ms)。
              ; --- ここから送信信号の定義 ---
2             ; リーダー(波形「2」)
01101001      ; データ1バイト目(0=波形「0」/1=波形「1」)
10010110      ; 2バイト目
01101001      ; 3バイト目
  :
10010110      ; nバイト目
3             ; トレーラー(波形「3」)
feXX          ; 直前のXX波形を永久に繰り返す、という制御コード。
                XXには直前の「2...3」の文字数を入れる。
                これにより、ボタンを押している間リーダー〜トレーラーの信号が出続ける。

参考

上記変換を実現する perl スクリプト

#! /usr/bin/perl
sub b8 {
    local($_) = shift;
    return join("", reverse(split("", sprintf("%08b", $_))));
}
sub hh3 {
    local($_) = shift;
    return join("", (split("", sprintf("%06x", $_)))[4,5,2,3,0,1]);
}

# データはコマンド行引数に16進数の列で与える
@data = map { hex($_) & 0xff } @ARGV;

# 出力の作成
$f = 2500 / 36.7 / 2;   # キャリア周波数は36.7kHz
$t = 0.425 * 2500;      # T=0.425ms
$nn = 75 * 2500;        # トレーラー長は75ms
$out = "00\n";
$out .= "04\n";
$out .= sprintf("%02x\n", $f);
$out .= hh3(1*$t)." ".hh3(1*$t)."\n";
$out .= hh3(1*$t)." ".hh3(3*$t)."\n";
$out .= hh3(8*$t)." ".hh3(4*$t)."\n";
$out .= hh3(1*$t)." ".hh3($nn)."\n";
$out .= "2\n";
foreach (@data) {
    $out .= b8($_)."\n";
}
$out .= "3\n";
$out .= sprintf("fe%02x\n", @data * 8 + 2);

# ベタ書きにしたいとき (クロッサム・エクスプローラ風)
#$out =~ s/[^0-9a-f]//g;
#$out .= "\n";

# バイトごとに分かち書きしたいとき (Sweet Memories風)
#$out =~ s/[^0-9a-f]//g;
#$out =~ s/(..)/$&,/g;
#$out =~ s/.*/"$&"\n/;

print $out;

以上のようにして作成したデータを Sweet Memories 等によりクロッサム2+に転送する。

松下製デジタルチューナーのリモコンコード

全体構成

カスタムコードを含め、6バイトで構成されている。

・ 1〜4バイト目は「02 20 80 0f」で固定。
・ 5バイト目は、リモコンのボタンごとに異なる機能コード(下記)。
・ 6バイト目は、3〜5バイト目のパリティ。

各ボタンの機能コード

コードボタン
50画面表示
52戻る
53決定
54メニュー
55番組表
56文字クリア
58番組内容
5aカーソル↑
5bカーソル↓
5dカーソル←
5eカーソル→
5f元の画面
601
612
623
634
645
656
667
678
689
6910/0
6a地上
6bBS
6cCS 1/2
6f11/#
7012/*
71チャンネル番号入力
72放送切替
73サービス切替
74チャンネル+
75チャンネル-
コードボタン
76前選局
77お好み選局
80音声切替
81字幕
85番組ナビ
87便利機能
89文字切替
8aTnavi
8bネット操作
8d電源
90データ/d
91
92
93
94
9e機器操作
a0(BS) 1
a1(BS) 2
a2(BS) 3
a3(BS) 4
a4(BS) 5
a5(BS) 6
a6(BS) 7
a7(BS) 8
a8(BS) 9
a9(BS) 10/0
aa(BS) 11/*
ab(BS) 12/#
b0(CS) 1
b1(CS) 2
b2(CS) 3
b3(CS) 4
コードボタン
b4(CS) 5
b5(CS) 6
b6(CS) 7
b7(CS) 8
b8(CS) 9
b9(CS) 10/0
ba(CS) 11/*
bb(CS) 12/#
c0(地上D) 1
c1(地上D) 2
c2(地上D) 3
c3(地上D) 4
c4(地上D) 5
c5(地上D) 6
c6(地上D) 7
c7(地上D) 8
c8(地上D) 9
c9(地上D) 10/0
ca(地上D) 11/*
cb(地上D) 12/#

参考

上記クロッサム2+用 perl スクリプトの入力部分、すなわち

# データはコマンド行引数に16進数の列で与える
@data = map { hex($_) & 0xff } @ARGV;

の部分を以下のように改変すれば、機能コードを与えるだけで特定ボタンのリモコン信号定義を自動生成できる。

# 機能コードはコマンド行引数に16進数1個で与える
@data = ( 0x02, 0x20, 0x80, 0x0f, hex(shift) & 0xff );
$data[5] = $data[2] ^ $data[3] ^ $data[4];    # 6バイト目はパリティ

以上は独自の調査・解析の結果にもとづくものであり、内容の正確性については保証いたしません。自己責任にてご利用ください。

(最終更新: 2004年1月20日)