4. SHARP フォーマットの信号データ合成¶
黒豆や IRKit, KURO-RS, クロッサム2+ などのプログラマブルな学習リモコン (スマートリモコン) の信号データを、リモコン同士ツノつき合わせて学習させるのではなく、PC 上で理想的な波形に合成するためのノウハウです。
- 赤外線リモコンの信号定義データの合成 [表紙]
- 家製協フォーマットの信号データ合成
- NEC フォーマットの信号データ合成
- ソニーフォーマットの信号データ合成
- SHARP フォーマットの信号データ合成 (このページ)
- リモコン信号定義データの相互変換
- リモコン信号の解析
- メーカー純正リモコンのコード
このページでは SHARP フォーマットを取り上げます。
4.1. リモコン信号の詳細¶
シャープ、DENONの古い製品や海外向けの製品で採用されているフォーマット。現行製品でも互換性維持のため使用できる場合がある。市販の汎用リモコンにはこのフォーマットの信号を出すものがある。
フォーマット¶
+---------------------------------------------------------
| データ部 | トレーラー | 反転データ部 | トレーラー | ...
+---------------------------------------------------------
リーダー部¶
存在しない。
データ部¶
15ビットの送信データ。
データ「0」は ON(320μsec)→OFF(680μsec)
データ「1」は ON(320μsec)→OFF(1680μsec)
または、T=260~270μsec として
データ「0」は ON(1T)→OFF(3T)
データ「1」は ON(1T)→OFF(7T)
とする実装も多く存在する (どちらが正しい「仕様」かは不明。実用上はどちらでも問題ない)。
なお、データの内容は
- 最初の5ビットが機器の識別コード (アドレス)
- 次の8ビットが機能コード (コマンド)
- 次の1ビットが拡張ビット
- 次の1ビットがチェックビット (データ部は 0, 反転データ部は 1)
である (LSB first)。コードの具体的な値は後述。
反転データ部¶
データ部をビット反転させたもの。ただし5bitのアドレスは反転させない。
トレーラー部¶
ON(320μsec)→OFF(40msec)
キャリア周波数¶
赤外線LEDの発光時 (ON時) の点滅周波数。38kHz。
4.2. 汎用信号定義への変換方法¶
黒豆, IRKit, Pronto 等の定義データへ変換する方法は「リモコン信号定義データの相互変換」を参照のこと。
データ形式¶
38 ; キャリア周波数 (kHz)
1 ; 信号送出の繰り返し回数。通常 1
; ---- データ部 ----
320 1680 ; 信号「1」。ON(320μsec)->OFF(1680μsec)
320 680 ; 信号「0」。ON(320μsec)->OFF(680μsec)
: ; (15bit分続く)
320 40000 ; トレーラー。ON(320μsec)->OFF(40msec)
; ---- 反転データ部 ----
320 1680 ; 信号「1」
320 680 ; 信号「0」
: ; (15bit分続く)
320 40000 ; トレーラー
サンプルコード¶
送信データを SHARP フォーマットにエンコードする perl のサンプルコードを示す。
#! /usr/bin/perl
#
# Usage: irsharp device command expansion
# データはコマンド行引数に10進数×3 (機器コード,コマンド,拡張)で与える。
($id, $com, $exp) = @ARGV[0..2];
$id &= 0x1f; $com &= 0xff; $exp &= 0x1; $check = 0x0;
# データを0/1列に変換
$data = $id + ($com << 5) + ($exp << 13) + ($check << 14);
$idata = $data ^ 0x7fe0;
$data = unpack ("b15", pack ("I", $data));
$idata = unpack ("b15", pack ("I", $idata));
# 出力の作成
$mark = 320;
$space0 = 680;
$space1 = 1680;
$trailer = 40000;
# ヘッダ
@run = (38, 1); # キャリア周波数 38kHz, 繰返し回数 1
# 信号部
# --- データ部 0:ON(320us)->OFF(680us), 1:ON(320us)->OFF(1680us)
foreach $bit (split ("", $data)) {
if ($bit eq "0") {
push (@run, $mark); push (@run, $space0);
} else {
push (@run, $mark); push (@run, $space1);
}
}
# --- トレーラー部 ON(320us)->OFF(40ms)
push (@run, $mark); push (@run, $trailer);
# --- 反転データ部 0:ON(320us)->OFF(680us), 1:ON(320us)->OFF(1680us)
foreach $bit (split ("", $idata)) {
if ($bit eq "0") {
push (@run, $mark); push (@run, $space0);
} else {
push (@run, $mark); push (@run, $space1);
}
}
# --- トレーラー部 ON(320us)->OFF(40ms)
push (@run, $mark); push (@run, $trailer);
print join (" ", @run), "\n";
このようにして作成した汎用信号定義は「リモコン信号定義データの相互変換」に示すスクリプトで黒豆, IRKit, Pronto 等の定義へ変換できる。
4.3. 例: シャープ製テレビ (AQUOS) のリモコンコード¶
各ボタンの機能コード (一部)¶
コードは「アドレス/コマンド/拡張」で示す。
コード | ボタン | コード | ボタン |
---|---|---|---|
1/1/1 | 1 | 1/20/1 | 音量+ |
1/2/1 | 2 | 1/21/1 | 音量- |
1/3/1 | 3 | 1/22/1 | 電源 (トグル) |
1/4/1 | 4 | 1/23/1 | 消音 |
1/5/1 | 5 | 1/26/1 | スリープ |
1/6/1 | 6 | 1/27/1 | 画面表示 |
1/7/1 | 7 | 1/196/1 | メニュー |
1/8/1 | 8 | 1/87/1 | カーソル ↑ |
1/9/1 | 9 | 1/32/1 | カーソル ↓ |
1/10/1 | 10 | 1/215/1 | カーソル ← |
1/11/1 | 11 | 1/216/1 | カーソル → |
1/12/1 | 12 | 1/82/1 | 決定 |
1/17/1 | チャンネル+ | 1/228/1 | 戻る |
1/18/1 | チャンネル- | 17/74/1 | 電源 ON |
1/19/1 | 入力切換 | 17/75/1 | 電源 OFF |