4. SHARP フォーマットの信号データ合成

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

  1. 赤外線リモコンの信号定義データの合成 [表紙]
  2. 家製協フォーマットの信号データ合成
  3. NEC フォーマットの信号データ合成
  4. ソニーフォーマットの信号データ合成
  5. SHARP フォーマットの信号データ合成 (このページ)
  6. リモコン信号定義データの相互変換
  7. リモコン信号の解析
  8. メーカー純正リモコンのコード

このページでは 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