ゆけッ! やっせんぼ・とよちゃん!
電子ボリュームの自作記録 (2010年02月28日)
|
|
どして?
タイムドメインスピーカーの製作を終えた後, オーディオボリュームを簡単に変えれないかと考えいていました。タイムドメインスピーカーのレポートで説明したと思いますが、現在 BEHRINGER FBQ1502 と ALESIS RA150を使用しています。 どちらもリモコンでボリュームを簡単に変える機能がなくて、いちいちボリュームを変えるのが鬱陶しくてしょうがないのです。 そういうわけで、今回電子ボリュームを製作することにしました。
基本機能
基本的な機能としては
とう感じです。
代表的なアッテネータ TC9210 と LM1972/3 は -80dB までアッテネーションできます. 50段階のレベルがあれば十分だと思います。
アッテネーションレベルは常に減衰方向なので、マイナス(-)符号は表示しないことにしました。
通常ボリュームのコントロールは赤外線リモコンで行うのですが、学習モードにおいてはロータリーエンコーダーでアッテネーションレベル設定をするようにします。
色々なリモコンに対応できるように 赤外線コードの学習機能は必須だと考えます。 学習機能をつけておけば 実際にリモコンからどのようなコードが送信されているかを気にする必要が無く、リモコンから送信されてきた信号パターンをそのまま記憶させてしまえばよいのです。
ハードウエアデザイン
アッテネーターは LM1973 を使うことにしました。 本当のところ LM1972 を使いたかったのですが、入手できませんでした。 LM1973 は LM1972 とほぼ同じです。 違いは、LM1973 は3つオーディオチャネルがあるのに対して LM1972 には2チャンネルしかないというところだけです。 今回は、1チャネルは必要ないので 適当にグランドに落としておきます。
メインプロセッサには PIC16F88 を使うことにしました。 理由は、
ってことです。
LM1972/3 は+12Vの単電源で動作する様ですが、+12V,と+6V (または +6V と -6V) を供給するようにしました。 LM7806 等2つのレギュレータを使用するのが理想的ですが、今回は単純に10kΩ のレジスタを使用して+12Vから+6Vを分圧して、LM1973 のアナロググランドレベルとして供給します。
LM1973 のオーディオ入力の前段にある2組の 120&Omega のレジスタは、オーディオ入力を予め 6dB 減衰させるためです。 ブレッドボードでテストしているとき ノイズが発生することに気が付きました。 ノイズは高いレベルの入力信号に対して起こるので 入力レベルを 6dB 抑えるようにしたのです。 ノイズの本当の原因は不明ですが、とりあえずの対策としました。
赤外線受信素子 PL-IRM0101-3 の 10k&Omega のプルアップレジスタとのデカップリング回路 (240&Omega と 4,7μF) はデータシートから参照しました。 PL-IRM0101-3 を使用する場合、デカップリング回路は必須の様です。
PIC16F88 のポートのアサインは以下のようになっています
PORT NAME | Input/Output | Function |
---|---|---|
RA0 | O | Seven segment selection (lower digit) |
RA1 | O | Seven segment selection (higher digit) |
RA2 | I | Rotary encoder phase A |
RA3 | I | Rotary encoder phase B |
RA4 | O | LM1973 Load/Shift |
RA5 | I | Push button |
RA6 | O | LM1973 Data |
RA7 | O | LM1973 CLOCK |
RB0-6 | O | Seven segment control (a-g) |
RB7 | I | IR receiver PL-IRM0101-3 |
ソフトウエアデザイン
基本的な機能は
という感じです。
今回のように小さなシステムにおいてはタスクスイッチング機能は必須ではないですが、タスクごとに機能分けできるとタイミングの調整やI/Oコントロールのデザインが容易になり、またバグが少なくなります。 PIC16F88 ではプログラムカウンタの制御ができないっぽいので、タスクスイッチングは簡易型になります (タスクが終了しないとスイッチングが発生しない)。 メイン関数 main() はタイマー割り込み及びポートBチェンジ割り込みの初期設定後タスクスイッチングの永久ループにはいります。
I/Oポート数を稼ぐために、システムクロックは内部の発信器を使用します。 発振周波数は 8MHz です。
TIMER0 割り込みは 2ミリ秒に設定され、タスクスイッチングに使用されます。
TIMER1 はフリーランカウンターに使用されます。 カウンタは TIMER1 割り込みを使用して 上位8ビット分拡張されています(全部で16ビット)。 4マイクロ秒毎にカウントアップされ、約60秒まで計ることが出来ます。
押しボタンスイッチとロータリーエンコーダーは、単純に一定間隔で ポートAをモニタリングすることにより制御されます(詳細はソースコードを参照)。
赤外線受信素子 PL-IRM0101-3 からの信号は ポートBチェンジ割り込みと TIMER1 フリーランカウンタを使用して制御します。
赤外線コードとプリセットレベルは EEPROM に保存され、電源投入直後の初期化処理で読み込まれます。
詳細は、Software Design と source code 参照してください。
既知のバグと問題点
このシステムには、
という問題があります。
赤外線リモコンから受信されたりロータリーエンコーダーが操作されたりすると 時たま7セグメントLEDが消灯してしまいます。 原因は TIMER1 フリーランカウンタを用いた時間間隔算出のバグだと考えられます。 この問題は、7セグメントLEDが消えるだけで 他の機能にはいっさい影響しません。 また、再び赤外線リモコンからの受信があったりロータリーエンコーダーを操作すると直ちに回復します。 もし気になるようなら、ソースコードの7セグメント制御タスクの消灯機能部分をコメントにしてください。
2010/09/04追記
最近オーディオプロセッサを製作していて 赤外線コードの解析に問題があることに気が付きました。 原因は、割り込みの検出時のポラリティが間違っていたところにあります。 つまり、信号がオンになるタイミングとオフになるタイミングが逆になっています。 ただ、私の赤外線コードを解析するアルゴリズムでは オン時間とオフ時間の総和のみを使用していますので、赤外線はほぼ問題なく受信できています。 気になる人は 自分で修正してください。m(__)m
ノイズに関する再考
ハードウエアデザイン のところで書いたノイズの原因は、デジタルグランドレベルの間違った設定にあるかも知れません。 この人(ALTOR.SYTES.NET のミラーも参照) の回路図では、デジタルグランドはアナロググランドと共通に接続されています。 未確認ですが、右の回路図なら LM1973 のオーディオ入力の前段にある2組の 120&Omega レジスタは無くても動作するかもしれません。
データシートによると、LM1973 のデジタル回路とアナログ回路は完全に分離されているように記述されているように読めたので、上記の点については気にしていませんでした。
結論
今回初めて PIC を使用しての電子工作でしたが、とっても楽しかったです。 殆どの時間はハードウエアの工作と赤外線コードの学習に費やしましたが、新しいことを会得するのは楽しいものですね。
下の写真が完成品です。
今すでに次の工作について考えていますが・・・もうすこし難しいのに挑戦したいですね。
この記事が PIC マイコンをこれから始めようと思っている人の役に立てば嬉しいです。
リファレンス
ボリュームコントロール関連:
PIC 関連:
Welcome to Einstein's electronic lab!
開発環境関連:
MPLAB Integrated Development Environment
SDCC - Small Device C Compiler
赤外線コード関連:
PIC のアセンブリ言語を知りたければ:
ダウンロード
ソースコードのダウンロードは ここ をクリックしてください。