DENON CS-PCMチューナー(DTU-1600AL)のリモコンコード解析

左写真の上段がDTU-1600ALで写真右がリモコンです。
1998年に購入の、まだデノンになる前の頃のCS-PCMチューナーです。
引っ越し先でもミュージックバードは絶対に聴きたかったので、真っ先にアンテナを設置しました。
8畳の洋間をオーディオ部屋にして、放送もそこで聴くことを想定していたので、同軸ケーブルも
その部屋のエアコンから引き込みました。
しかし、実際には隣の仕事部屋にいる事がほとんどなので、音声信号を平たいモジュラー線で廊下をはわせて
仕事部屋のミニコンポで聞いています。(驚いたことに、思ったほど音が劣化しません)
しかし、当然リモコンが届かないので選曲が出来ません。
そこで、同梱リモコンと同様の機能をする赤外線発生器を作り、キー情報を仕事部屋から何らかの通信
手段で送り、リモート操作をしようと思いつきました。


以下、誤りです。

リモコンコード解析結果
リモコンから出た信号をフォトTrで受信し、キャリア周波数やデータ構成を解析しました。
一回のキー押下しに対して以下の様な波形であることが解りました。

キャリア周波数:40KHz
同期信号:キャリア(9mS)
データ0:無信号(1120uS)
データ1:キャリア(560uS)+無信号(560uS)

キーを押すと、最初の9mSは受信側を起動する同期信号と思われる連続したキャリアが出ます。
それ以降7バイト分のビット情報が続きます。
1ビットの時間は1120uSで、各ビットはキャリア(560uS)+無信号(560uS)で論理1を示し、
無信号(1120uS)で論理0を示します。(論理1,0は反対かも知れません)
以下各キーに対する、データ構成を示します。(MSB先頭の順です)

キー キーに対するデータ構成(HEX)
POWER 0A EF AB 57 BE AD 54
0A EF AB 57 DE AB 54
0A EF AB 55 EF AB 54
0A EF AB 56 EF 6B 54
0A EF AB 55 77 EB 54
0A EF AB 57 6F 5B 54
0A EF AB 55 B7 DB 54
0A EF AB 56 B7 BB 54
0A EF AB 55 5B FB 54
0A EF AB 57 AF 57 54
10 0A EF AB 55 D7 D7 54
11 0A EF AB 56 D7 B7 54
12 0A EF AB 55 6B F7 54
SOUND 0A EF AB 55 55 FF 54
0A EF AB 57 FD 55 54
0A EF AB 55 FF 55 54

以下2004/5/24の作品のよって読み取った結果です。

キー キーに対するデータ構成(HEX)
POWER EE 13 F7 08
EE 13 EF 10
EE 13 EE 11
EE 13 ED 12
EE 13 EC 13
EE 13 EB 14
EE 13 EA 15
EE 13 E9 16
EE 13 E8 17
EE 13 E7 18
10 EE 13 E6 19
11 EE 13 E5 1A
12 EE 13 E4 1B
SOUND EE 13 E0 1F
EE 13 FF 00
EE 13 FE 01


解析結果確認
上の解析結果を確認するため、赤外線でコードを出力するボードを作りました。
タイミングをきっちり合わせたのが良かったのか、実際のチューナーでもあっさり受信成功でした。

解説
回路図ではRS-232Cのコネクタが配置されていますが、まだ実装していません。
ソフトもSIO部分は、まだ出来ていません。

マイコンはROM2KのAT90S2313を使いました。
40KHzのキャリア信号を作るのにタイマー/カウンター1が便利です。
ボード上の4つのSWはそれぞれリモコンSWのPOWER、1、+、−に対応します。
各ビットの信号送出時間などはダミーループで時間稼ぎします。
リモコンコードなどの固定データはEEPROMに格納します。
肝心の赤外発光ダイオードは東芝のTLN105Bというピーク波長が950nmのタイプです。
これに約50mA流して発光させます。

コンパイラは前回も使ったGCC-AVRです。今のところバグには遭遇せず順調に使えています。
最適化を抑止しているので結構ROMを喰いました。

ダウンロード

ファイルの種類 ファイルの形式 コメント
出力ボード回路図 PDF
ソースファイル WINZIP コンパイラはAVR-GCC



パソコンと接続
上記AVRの赤外線発光ユニットにSIO機能を持たせ、パソコンからのRS-232Cを通して
選曲出来るように改良しました。

パソコン側画面はこのようになります。


さすがに2KのAVRでもSIO機能を入れると、足りなくなり最適化オプションを有効にしました。
最適化無しで2Kを越えていたのが、1740バイトほどになります。
一挙に300バイトも減ってしまうのは強力ですが、大丈夫かなという不安も残ります。
問題なく動作していますが、一つだけ以下の点が気がかりです。

GCC-AVRの割込みは、
INTERRUPT(SIG_OVERFLOW0)
{//割込み許可有り
   foo();
}

SIGNAL(SIG_UART_RECV)
{//割込み許可無し
   foo();
}


のようにINTERRUPTで宣言された割込み関数は、その関数が呼ばれた直後に
多重割込みが出来るようにマスター割込みを許可します。
一方SIGNALで宣言された割込み関数は禁止のままです。

最初、SIOの受信割込みをINTERRUPT(SIG_UART_RECV)のように割込み許可にしていたら、
意図通りに動作せず、試しにSIGNAL(SIG_UART_RECV)と宣言したら正常に動作しました。
これが、最適化によるものかどうかは、サイズオーバーで最適化がはずせないので確認出来ませんでした。

ダウンロード

ファイルの種類 ファイルの形式 コメント
改良後のAVR側Cソース WINZIP コンパイラはAVR-GCC
パソコン側VCプロジェクト WINZIP コンパイラはVC6.0