自作オーディオアンプに組み込んだ赤外線リモコン電子ボリュームの製作記です。 送信器は市販のリモコン送信器を使い、自作アンプの音量を調整するものです。 赤外線リモコン方式とコードの解析など、ソフトを解説します。
リモコン送信器には市販のものを使うこととしたので、 その信号を解析しないといけない。 インターネット上に FUTABA HOMEの 「赤外線リモコンについて」に概説がある。 送信される赤外線は約38kHzで断続されているが、 受信センサからの出力にはこの38kHzは現れない。 断続する赤外線を受け取るとセンサ出力はLow、無入力のときHighとなる。 マイコンではこれを受け取って処理する。 各社の信号形式を調べると、NECフォーマットに依っているものが多く、 今回はこれを扱う。 SONYや松下はこれとは違う独自フォーマットを用いている。
NECフォーマットについてはe電子工房の コンピュータ制御学習リモコン(その2)のページが詳しい。 信号の最初にリーダー部と称するものがあり、 数msのON(センサ出力Low)、続いてそのおよそ半分の時間OFFとなる。 リーダー部に続き、0/1の信号が始まる。 0/1とも0.5ms程度のONがあり、それに続くOFF時間が同じ長さだと0、 OFF時間が3倍程度だと1を表す。
データは8ビットごとに、これを0/1反転したものを続けて送り、計16ビットがひとかたまりになる。 最初の8ビット(さきの資料で「カスタム・コード」としているところ)はメーカーID、 次にコマンド(さきの資料で「データ・コード」としているところ)が送られる。
それぞれのON時間、OFF時間はメーカによって異るし、送信器の個体差もあるだろう。 ソフト的にまずON時間を測り、それを基準にOFF時間を判別することで個体差をキャンセルできる。 OFF時間の長さがON時間の2倍より短かければ0、長ければ1と判定する。
こうしてNECフォーマットを採用する数社の信号を解析した結果がこちら。
| メーカ | メーカID | 音量↑ | 音量↓ | ミュート | 電源 | 入力切替 |
|---|---|---|---|---|---|---|
| 東芝 | 0x02 | 0x58 | 0x78 | 0x08 | 0xf0 | 0x48 |
| 日立 | 0x0a | 0x48 | 0xa8 | 0xd0 | 0x90 | 0xe8 |
| SANYO | 0x0c | 0x90 | 0x50 | 0xd0 | 0xa0 | 0x00 |
| NEC | 0x18 | 0x40 | 0xc0 | 0x90 | 0x50 | 0x10 |
ボタンを押し続けるとリピート信号が出るが、これはリーダー部のみが送られているようである。
搬送波の38kHzは受信センサで処理されるため、マイコンで処理が必要な時間単位は0.5ms程度。 PIC16F84Aを20MHzクロックで動かすと1命令クロックが約0.2usだから、 時間的にはソフトで対応可能。 今回はPIC16F84A内蔵のハードウェアタイマを使って50usおきに割り込みを発生させ、信号の時間幅を測定するときの基準としている。
オーディオクラフト工房の (13)「電子ボリュームを作ろう」のページに 東芝製の電子ボリュームTC9260が紹介されている。 今回入手したのは同じ東芝製TC9210Pで、使い方はよく似ている。
電源回りが少しややこしい。 アナログ側はメインアンプが15Vの単一電源で動いている。 その+15Vを電子ボリュームICのVDDに、0VをVSSに、 これらを抵抗で2分割してその中点を電子ボリュームICの(L/R-)A-GNDに接続する。 デジタル側のマイコンは5Vで動いているが、その0Vはアナログ側の0Vと共通で、 すでに電子ボリュームICのVSSに継っているが、別にデジタルGNDにも接続する。
音量は0dB〜-78dBの範囲を2dBステップ40段階で設定できる。 リモコンボタンの使い勝手から、そのうち0dB〜-40dBの20段階を使うこととした。 このあたりは実際に使ってみてからソフトの修正で対応できる。
TC9210PにはCS端子が2つある(CS1,CS2)。 いずれもデジタルGNDに接続したのでチップセレクトビットC1,C2ともに0だが、 残るC3,C4は0ではなく1をセットしないといけない(C1:C4は0011)。
ボリュームの現在値を表示するのに7素子のLEDバーを用いた。 20段階を7つのLEDで表示するので、ボリューム値と点灯するLEDの数は1対1では対応しない。 だからボリューム値が変化しても点灯するLEDの数は変化しないことがある。 それでは分かりにくいので、信号を受け取ったら、LEDの列の先頭を必ず点滅させることとした。
ボリューム値に応じてLEDの点灯が左から右へ伸びるとすると、 たとえば音量アップの信号が来たら、現在点灯しているLEDの右端のさらに右隣のLEDをいったん点灯させる。 ボリューム値がその閾値を超えると新しく点灯したLEDはそのままだが、 閾値以下だとそのLEDは消灯する。点灯するLEDの列がいったん伸びて、またもとの長さに縮むといったように見える。 音量ダウンのときは現在点灯しているLEDの右端のものをいったん消灯させる。 LEDの列がいったん縮む動きを見せる。
音量最小あるいはミュート時にLEDを全部消灯すると電源が入っているかどうか分かりにくくなるので、 このときは左端のLED1個を2秒周期でゆっくりと点滅させることとした。
ロータリーエンコーダを用い、 ツマミを回すことでも音量調節できるようにした。 エンコーダからはA/B 2相の信号が出ており、 これらの位相差により右回転か左回転かを知る。 ソフト的には、どちらかの相信号を監視しておき、 その立ち上がりあるいは立ち下がり(のどちらか一方)のタイミング で他相を見て、それがHighかLowかで回転方向が分かる。
立ち上がり(あるいは立ち下がり)エッジを見るので、 PIC16F84AによるLEDの点滅のときのスイッチの処理のように、 入力信号にはソフト的に積分を掛けている。 これが無いと妙な動きをしたからだが、 このピンは入出力を切替えながら使っているので、そのせいで要らぬ信号が入っているのかもしれない。 出力から入力に切替えた直後の入力信号は読み捨てるということでもよいかもしれない。
C言語で書いたプログラムはこちら。 けっこう盛り沢山で、PIC16F84Aのプログラムメモリ1kワードをほぼ使いきっている。
電源をON/OFFしたときのポップ音が大きい。メインアンプICのTA8232Hにはスタンバイ端子のほかにミュート端子があり、 これをコントロールしたほうがよかったはず。 消費電力はしれているので、常時電源を入れておくという運用で逃げている。
そのほかは順調。 学習リモコン(SONY製RM-PL500D)のおかげでシステム全体の操作感も快適である。 が、家族の中での評判はというと、何の評価もない。 アンプの音量をリモコンで操作できるということは、まったくあたりまえの機能なのである。 ひとり淋しく、はじめてのマイコン応用機器を自作できた満足感に浸っている。
ご意見、お問い合わせは Linux掲示板 へ