クロッサム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+用信号定義データは以下のようになる。
(キャリア周波数 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 | 元の画面 |
| 60 | 1 |
| 61 | 2 |
| 62 | 3 |
| 63 | 4 |
| 64 | 5 |
| 65 | 6 |
| 66 | 7 |
| 67 | 8 |
| 68 | 9 |
| 69 | 10/0 |
| 6a | 地上 |
| 6b | BS |
| 6c | CS 1/2 |
| 6f | 11/# |
| 70 | 12/* |
| 71 | チャンネル番号入力 |
| 72 | 放送切替 |
| 73 | サービス切替 |
| 74 | チャンネル+ |
| 75 | チャンネル- |
| コード | ボタン |
| 76 | 前選局 |
| 77 | お好み選局 |
| 80 | 音声切替 |
| 81 | 字幕 |
| 85 | 番組ナビ |
| 87 | 便利機能 |
| 89 | 文字切替 |
| 8a | Tnavi |
| 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日)