ゆけッ! やっせんぼ・とよちゃん!

電子ボリュームの自作記録 (2010年02月28日)



ENGLISH
JAPANESE


どして?

タイムドメインスピーカーの製作を終えた後, オーディオボリュームを簡単に変えれないかと考えいていました。タイムドメインスピーカーのレポートで説明したと思いますが、現在 BEHRINGER FBQ1502 と ALESIS RA150を使用しています。 どちらもリモコンでボリュームを簡単に変える機能がなくて、いちいちボリュームを変えるのが鬱陶しくてしょうがないのです。 そういうわけで、今回電子ボリュームを製作することにしました。




基本機能

基本的な機能としては

  • 50段階のアッテネーション、
  • 2桁の7セグメントLED (アッテネーションレベル表示用)、
  • ロータリーエンコーダーと赤外線リモコンによるアッテネーションの変更、
  • アップ、ダウン、ミュート及び5つプリセットレベル、
  • 赤外線リモコンコードとプリセットレベルの学習機能、及び
  • 30秒更新が無かった場合、7セグメントLEDをオフにする (オプション)
とう感じです。

代表的なアッテネータ TC9210 と LM1972/3 は -80dB までアッテネーションできます. 50段階のレベルがあれば十分だと思います。

アッテネーションレベルは常に減衰方向なので、マイナス(-)符号は表示しないことにしました。

通常ボリュームのコントロールは赤外線リモコンで行うのですが、学習モードにおいてはロータリーエンコーダーでアッテネーションレベル設定をするようにします。

色々なリモコンに対応できるように 赤外線コードの学習機能は必須だと考えます。 学習機能をつけておけば 実際にリモコンからどのようなコードが送信されているかを気にする必要が無く、リモコンから送信されてきた信号パターンをそのまま記憶させてしまえばよいのです。




ハードウエアデザイン

アッテネーターは LM1973 を使うことにしました。 本当のところ LM1972 を使いたかったのですが、入手できませんでした。 LM1973 は LM1972 とほぼ同じです。 違いは、LM1973 は3つオーディオチャネルがあるのに対して LM1972 には2チャンネルしかないというところだけです。 今回は、1チャネルは必要ないので 適当にグランドに落としておきます。

メインプロセッサには PIC16F88 を使うことにしました。 理由は、

  1. 安い
  2. 容易に手に入る、そして
  3. フリーで簡単操作の開発ツールが手に入る
ってことです。

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




ソフトウエアデザイン

基本的な機能は

  • TIMER0 の割り込みを使用した2ミリ秒毎のタスクスイッチング、
  • TIMER1 カウンタと割り込みを使用したフリーランタイマー、
  • ソニータイプの赤外線コードのサポート、
  • 4つのI/O制御タスク (7セグメント、ロータリーエンコーダー、赤外線受信、押しボタンスイッチ)、
  • 2種類のライブラリ (LM1973 のアッテネーションの設定、TIMER1 の読み出し)、及び
  • 赤外線コードとプリセットレベルの記憶用 EEPROM の読み書き
という感じです。

今回のように小さなシステムにおいてはタスクスイッチング機能は必須ではないですが、タスクごとに機能分けできるとタイミングの調整やI/Oコントロールのデザインが容易になり、またバグが少なくなります。 PIC16F88 ではプログラムカウンタの制御ができないっぽいので、タスクスイッチングは簡易型になります (タスクが終了しないとスイッチングが発生しない)。 メイン関数 main() はタイマー割り込み及びポートBチェンジ割り込みの初期設定後タスクスイッチングの永久ループにはいります。

I/Oポート数を稼ぐために、システムクロックは内部の発信器を使用します。 発振周波数は 8MHz です。

TIMER0 割り込みは 2ミリ秒に設定され、タスクスイッチングに使用されます。

TIMER1 はフリーランカウンターに使用されます。 カウンタは TIMER1 割り込みを使用して 上位8ビット分拡張されています(全部で16ビット)。 4マイクロ秒毎にカウントアップされ、約60秒まで計ることが出来ます。

押しボタンスイッチとロータリーエンコーダーは、単純に一定間隔で ポートAをモニタリングすることにより制御されます(詳細はソースコードを参照)。

赤外線受信素子 PL-IRM0101-3 からの信号は ポートBチェンジ割り込みと TIMER1 フリーランカウンタを使用して制御します。

赤外線コードとプリセットレベルは EEPROM に保存され、電源投入直後の初期化処理で読み込まれます。

詳細は、Software Designsource code 参照してください。




既知のバグと問題点

このシステムには、

  • 7セグメントLEDが突然消える、及び
  • 赤外線のコード解析が正しくない(2010/09/04追記)
という問題があります。

赤外線リモコンから受信されたりロータリーエンコーダーが操作されたりすると 時たま7セグメントLEDが消灯してしまいます。 原因は TIMER1 フリーランカウンタを用いた時間間隔算出のバグだと考えられます。 この問題は、7セグメントLEDが消えるだけで 他の機能にはいっさい影響しません。 また、再び赤外線リモコンからの受信があったりロータリーエンコーダーを操作すると直ちに回復します。 もし気になるようなら、ソースコードの7セグメント制御タスクの消灯機能部分をコメントにしてください。

2010/09/04追記
最近オーディオプロセッサを製作していて 赤外線コードの解析に問題があることに気が付きました。 原因は、割り込みの検出時のポラリティが間違っていたところにあります。 つまり、信号がオンになるタイミングとオフになるタイミングが逆になっています。 ただ、私の赤外線コードを解析するアルゴリズムでは オン時間とオフ時間の総和のみを使用していますので、赤外線はほぼ問題なく受信できています。 気になる人は 自分で修正してください。m(__)m




ノイズに関する再考

ハードウエアデザイン のところで書いたノイズの原因は、デジタルグランドレベルの間違った設定にあるかも知れません。 この人(ALTOR.SYTES.NET のミラーも参照) の回路図では、デジタルグランドはアナロググランドと共通に接続されています。 未確認ですが、右の回路図なら LM1973 のオーディオ入力の前段にある2組の 120&Omega レジスタは無くても動作するかもしれません。

データシートによると、LM1973 のデジタル回路とアナログ回路は完全に分離されているように記述されているように読めたので、上記の点については気にしていませんでした。




結論

今回初めて PIC を使用しての電子工作でしたが、とっても楽しかったです。 殆どの時間はハードウエアの工作と赤外線コードの学習に費やしましたが、新しいことを会得するのは楽しいものですね。

下の写真が完成品です。


今すでに次の工作について考えていますが・・・もうすこし難しいのに挑戦したいですね。

この記事が PIC マイコンをこれから始めようと思っている人の役に立てば嬉しいです。




リファレンス

ボリュームコントロール関連:

Mirror of the ALTOR.SYTES.NET

PICマイコンで作るリモコン電子ボリューム

オーディオクラフト工房


PIC 関連:

PICで遊ぶ電子工作

オーディオクラフト工房

Welcome to Einstein's electronic lab!

TekuRobo工作室

電子工作の実験室


開発環境関連:

MPLAB Integrated Development Environment

SDCC - Small Device C Compiler

gputils - GNU PIC Utilities

フリーのCコンパイラ(SDCC)でPICを使おう

SDCCの使い方


赤外線コード関連:

赤外線リモコンの解析

赤外線リモコンについて


PIC のアセンブリ言語を知りたければ:

PICのアセンブラ命令の解説




ダウンロード

ソースコードのダウンロードは ここ をクリックしてください。