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

電子ボリュームの自作記録
(2012年09月15日 更新、2015年08月14日 改修)





どして?

オーディオプロセッサ ver.2.x を開発してからお蔵入りしてしまっていた電子ボリューム ver.1.0ですが、今回 ちょっとした事情により(笑) ver.1.2 として復活させることにしました。




基本機能

前回公開の ver.1.0 と重複になりますが、基本的な機能としては、

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

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

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

ボリュームのコントロールは、赤外線リモコンとロータリーエンコーダーで変更できるようにしました。

ver.1.0 からの変更点は、

  1. LM1973 のオーディオ入力の分圧用(-6dB)抵抗を 120Ω から 10kΩ に変更した、
  2. グランドの取り方が間違っていたので修正した、(2015年08月14日)
  3. プッシュボタンによる赤外線リモコンコードとプリセットレベルの学習機能を廃止した
の3点です。

入力の 120Ω はあまりにもインピーダンスが低すぎて 繋がらない機器があったので、インピーダンスを上げました。(笑)。 -6dB のレベル調整が必要な原因は、LM1973の歪みが酷いからです。(2015年08月14日 確認)

ボリュームの上げ下げだけであり、世の中の殆どのリモコンでは(おそらく)ソニータイプのコードを使用しているので、学習機能を廃止して ソフト的にシンプルにしました。

リモコンコードの定義は、infrared.h というファイルに

#define    IR_CODE_UP     0x00000490
#define    IR_CODE_DOWN   0x00000c90
#define    IR_CODE_MUTE   0x00000290
#define    IR_CODE_P1     0x986708f7
#define    IR_CODE_P2     0x98678877
#define    IR_CODE_P3     0x986748b7
#define    IR_CODE_P4     0x9867c837
#define    IR_CODE_P5     0x986728d7
と定義されています。 お手持ちのリモコンと合わない場合、適当に変更してください。




ハードウエアデザイン

ハードは、上記の 120Ω の抵抗の変更とグランドの修正点以外、基本的に ver.1.0 をそのまま使用しています。

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
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 カウンタと割り込みを使用したフリーランタイマー、
  • ソニータイプの赤外線コードのサポート、
  • 3つのI/O制御タスク (7セグメント、ロータリーエンコーダー、赤外線受信)
という感じです。

タスクスイッチング機能は、便利なので 改良版に差し替えました。

システムクロックは内部の発信器を使用します。 発振周波数は 8MHz です。

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

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

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

赤外線受信素子 PL-IRM0101-3 からの信号は、ポートBチェンジ割り込みと TIMER1 フリーランカウンタを使用して解析します(詳細はソースコード infrared.c を参照)。




結論

前回 ver.1.0 を公開した時は、初めて 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のアセンブラ命令の解説




ダウンロード

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

私の開発環境(MPLAB V8.70 + SDCC V3.0.0 を使用)を圧縮したものです。 使用する場合、適当に変更してください。