作成日時:2016年10月25日 18時26分14秒
更新日時:2020年11月28日 16時59分21秒
この記事は8年ほど前に投稿されました。内容が古くなっている可能性がありますので更新日時にご注意ください。
毎回電子ボリュームを使ったりアナログボリュームだったりとまちまちだったので今回はオーディオ制作のいろいろな場面で使える汎用的な電子ボリュームモジュールを作りたいと思います。構成としては前回のHPAに電子ボリュームが生えた形になるので、これ単体でHPAとしても使えるようなものを作ろうと思います。
はじめに
オーディオ関係の電子工作を行っている場合、一番問題となるのがボリューム部分だと思います。
電子ボリュームを使うか、またまたアナログにするか。アナログなら抵抗値や品質はどの程度にするか…。音質を考えるうえでも割と重要な部品ですのでもちろん買える範囲で品質がいいものというのは当然としても。やはり何か基準になるものがほしい時がありますね。
そこで今回は汎用的に使える電子ボリュームを作ってみたいとおもいます。
お知らせ
こちらのICは、現時点でマルツオンラインのみと、入手性が悪くなってきましたので、別のICを使った電子ボリュームの制作も行っています。
難易度としては面実装のICを使うので、ちょっとこつがいるのと、プログラムが少し複雑になる位なので。今後新たに何かを作られる場合はこちらより以下の記事を参考にされた方が良いです。
制作条件
作っていくうえでまずどのようなボリュームにするかを考えます。
- 手軽にギャングエラーが解消できるように電子ボリュームとする
- ローコストでそこそこ音質の良いものを作る
- 「アナログボリュームの代替」を主とし、調節はアナログボリュームで行う
- 3の理由から液晶やLEDでの音量表示は不要。
- 可能な限り小型に作る。
ただし、趣味の電子工作を逸脱しない範囲で作りたいのでなるべくチップ部品や手に負えないほどの小型部品は使用しない。 - 音質にこだわれる部分を増やすためにバッファのOPアンプは外付けとする
- OPアンプでバッファを作るのでできればそのままHPAにもなるような感じで
という条件を設定しました。これに則って部品を選んでいくことにします。
部品の選択
電子ボリュームモジュールを作るためにまずは電子ボリュームICを決定し次に電源回りを設計。OPアンプはある程度の汎用性があるため一番最後に決めます。マイコンは性能とサイズの折り合いがつくところで決めます。日本の電子工作界隈ではPICが人気ですがAVRマイコンの方が開発コストは低めです。
その他コンデンサなどは利用するICによって決め、OPアンプや電子ボリュームのカップリングコンデンサはできればオーディオグレードやOS-CONなどを利用するべきでしょう。
電子ボリュームの選択
いろいろと電子ボリュームICはありますが。今回はコストと実績からNJW1159Dを使いました。
一応前回、前々回。D級アンプの音量制御に使用しまして、音質も問題ないレベルでしたので今回もこれを使いました。ほかの有名な電子ボリュームICを使ってもよいのですが意外と高い(1000円~)のでマルツでも300円で買えるこのICは重宝します。
今回はICは秋月で4つ入って500円くらいで売っているものを購入しました。秋月のサイトによるとディスコンマークがついていますが、メーカーサイトではまだ供給中となっており。マルツには在庫があるようなので今回もこれを採用しました。単に秋月が扱わなくなるだけっぽい?(未確認)
電源IC
電源の設計ですが。今回利用する予定だったNJM4558DDが5.7mA、採用したNJM5532DDが16mA。NJW1159Dが正負合計で18mAが最大となり。合計で最大34mAとなります。これに出力段の消費電力とマイコンの消費電力が必要になってきます。電源LEDなどをレギュレーター以降に付けるならそれも考慮に入れてください。
というわけで最低50mA。できれば片側100mA(正電源が少し多めで。)あれば十分なレベルとなると思われます。ヘッドフォン駆動を考えるなら最低電源容量は多いに越したことはないのですが。あまり大掛かりな電源を作るとサイズの問題が出てきますので今回は500mAもあれば十分なので正電源400mA、負電源100mA程度で設計をしました。
まずメインの電源として+5Vを生成するためのレギュレーターICを決めました。
前述のとおり、あまり大電流は想定していないので今回はサイズを優先し。小型であるTA48M05Fを利用しました。5V500mAまで流せます。もちろん通常の7805を使っても問題ありません。今回は秋月の周辺パーツ付きのものを買いましたのでついてきたコンデンサを使用しました。音質を考えるなら少し回路を盛って両端に0.1μFと100μFのコンデンサを取り付けてあげたほうがいいでしょう。今回は前回の回路からコンデンサ2個とダイオードを省いて簡素化しましたがそこそこ余裕があるのでフルスペックでもよかったかもしれません。
正電源はレギュレーターからとるとして、負電源はチャージポンプIC(以下CPIC)で生成することにしました。
今回採用したICはリニアテクノロジーのLTC1144CN8というICで。-5Vでたぶん50mAは流せると思います。
今回はOPアンプを使うので前回のCPICより大きなものと考えたのですが。まぁ正直言います。部品選択を間違えました。本当はLT1054CN8を使う予定でした。こちらは100mAほど流せるので本来はこっちを使ってください。回路の違いとしてはコンデンサの容量と+電源側に1つコンデンサが増えるだけです。あとは1番ピンを電源から切り離せばOKっぽい。次作るときはこっちを使う。
制御用マイコン
制御用マイコンは今回はATTiny85を使います。前回失敗した制御のリベンジです。(結局あれは配線ミスだったようです。)
今回の制御は前回と同じようにアナログボリュームの電圧値を読み込んで、それによって出力音量を決定するという方法。今回の回路でリセットピンを除けば1ピンしか余りません。今回は液晶やLEDなどは使わないのでこいつを選択しました。液晶表示器などをつけるのであればATmega328P必須かと思われますが、今回はあくまでアナログボリュームの代替なのでこいつを選択しました。Arduinoのマイコンとスケッチで楽したいというなら328Pでいいです。スペックが高い分には問題ないです。
とはいえさすがにラズパイ持って来たら助走をつけて殴られるかもしれないのであくまで8~30ピン程度のAVR/PICマイコンの中で選んでください。逆にラズパイの様なメディアプレイヤー部分も賄えるスペックがあるものであれば基板上にマイコンいらないと思いますのでシステム全体をマイコン制御とするのであればラズパイもありですが…。
OPアンプの選択
※画像は使いまわし
NJW1159DのデータシートによるとJ-FET入力のOPアンプが推奨されているようですが。ネットを探してみるとバイポーラ型を利用している人もいるようで。今回はNJM4558Dを購入しました。しかし、音質的に気に入らなかったのでNJM5532DDを選択しました。今回の回路は±5Vの電源なので±4V以下から利用できるICが必要になるかOPアンプだけ別電源を利用する必要があると思います。とはいえ±5Vで動かないアンプICはそうないし、MUSES02も動くので基本的には問題ないと思いますが。
使用IC一覧
上段左からチャージポンプIC OPアンプ AVRマイコン。
下段左がレギュレーター。右がNJW1159D。
使用するICはこの通り。8ピンICが3つもあるのでうっかり間違えないようにしてください。
プログラムの書き換えなどで抜き差しを行う可能性のあるマイコンと差し替えを楽しむ事も出来るようにOPアンプをICソケットを使って実装します。CPICはソケットを使う必要はないですが。万一間違えたときのために3つともソケットを使えば交換ができますね。
予めソケットに実装しておきます。
その他の使用部品
コンデンサやリード線、はんだなどのその他の部品は手に入るものを使ってください。
なるべく品質のいいものを使いましょう。予算を抑えるのであればカップリングコンデンサである1μFと4.7μFのコンデンサを良品質のものにすればよいですが。基本的にコンデンサというのはOSコンでも買わない限りあまり値段は変わりませんので。
基板は前回ヘッドフォンアンプに使った秋月の薄型タイプ。本当はサンハヤトが気に入っているのですが秋月にはないので。
使用部品一覧
今回使用している部品は以下の通りです。
部品 | 型番 | 購入店 | 単価 | 個数 | 税 | 計 |
2chステレオ電子ボリュームIC | NJW1159D | 秋月 | 112.5 | 1 | 込 | 113 |
2回路入りHiFiオペアンプ | NJM5532DD | 秋月 | 100 | 1 | 込 | 100 |
電圧コンバーター | LTC1144CN8 | 秋月 | 300 | 1 | 込 | 300 |
低損失三端子レギュレーター 5V 500mA | TA48M05F(S Q) | 秋月 | 100 | 1 | 込 | 100 |
電解コンデンサ 47μF | 付属品 | 秋月 | 0 | 1 | 込 | 0 |
セラミックコンデンサ 0.1μF | 付属品 | 秋月 | 0 | 1 | 込 | 0 |
AVRマイコン | ATTINY85-20PU | 秋月 | 160 | 1 | 込 | 160 |
ICソケット 8P 丸ピン | 2227MC-08-03 | 秋月 | 15 | 2 | 込 | 30 |
無極性電解コンデンサ 4.7μF | UES1E4R7MDM | 秋月 | 15 | 2 | 込 | 30 |
無極性電解コンデンサ 1μF | UES1H010MDM | 秋月 | 15 | 2 | 込 | 30 |
電解コンデンサ 10μF | UPM1H100MDD1TA | 秋月 | 8 | 4 | 込 | 32 |
電源用電解コンデンサ 100μF | 35ZLH100M6.3X11 | 秋月 | 15 | 2 | 込 | 30 |
金属皮膜抵抗 1/4W 2kΩ | MF1/4CC2001F | 秋月 | 3 | 2 | 込 | 6 |
金属皮膜抵抗 1/4W 12kΩ | MF1/4CC1202F | 秋月 | 3 | 2 | 込 | 6 |
金属皮膜抵抗 1/4W 22kΩ | MF1/4CC2202F | 秋月 | 3 | 2 | 込 | 6 |
ユニバーサル基板 72x48mm 片面 ガラス | P-04718 | 秋月 | 60 | 1 | 込 | 60 |
小型ボリューム 10KΩA | SH16K4A103L20KC | 秋月 | 40 | 1 | 込 | 40 |
合計 | 1043 |
電子ボリュームは4個入り450円
10μFの電解コンデンサは10個入り80円
抵抗は100本入り300円のものを購入。それぞれ個数で割った単価を記載。
使用部品一覧
今回使用する部品の一覧です。今回は比較的多いので役割ごとに分けました。
オーディオ部
まずメインである音響関係の部品はこんな感じ。
コンデンサはカップリングコンデンサにオーディオグレードの無極性電解コンデンサを採用しまして。あとは可能な限り耐圧を落として16V耐圧とし、省スペースな部品を採用しました。
抵抗は前回使った金属皮膜抵抗がかなり余っているのでそれを流用。
この写真ではOPアンプはNJM4558DDとなっていますが前述のとおりNJM5532DDを採用しました。完成品はさらに変えるかもしれません。
制御部
マイコンとアナログボリューム、それとソケットを使いました。
写っているセラミックコンデンサは使っていません。(つけ忘れたとかそういうやつです)
今回はボリューム制御に特化した形なので必要最低限のATTiny85を使いました。正直もっと性能の低いマイコンでもAD変換とIOピンが3本あれば使えます。こいつでも1ピン余るのでさらにポップノイズ除去用の遅延出力端子なんかもつけてよさそうです。
電源回り
電解コンデンサはレギュレーター付属のものに。今回は逆電流が発生する可能性が高くないので保護用のダイオードは省略しました。レギュレーターのコンデンサは入力側のセラミックは0.1μF固定。出力側は33μF以上となっています。
コンデンサが付属していればそれを使っていいと思いますし。なければ電子ボリュームの電源に使っている100μFでいいと思います。
負電源に使っているCPICのスペックシートによれば電解コンデンサかタンタルであれば容量さえ問題なければ品質は問わないらしいので省スペースを考えるならタンタルコンデンサを採用するべきですが。今回は電子ボリュームの10μFと共通化させました。(逆に電子ボリュームのコンデンサもタンタルでいいと思うんだけど)
基板について
マイコンやOPアンプの抜き差しを考慮すると。紙よりはガラスを、薄いよりは厚めの基板を採用するべきでしょう。
正直コストと入手性で考えていいと思いますが、このサイズなら価格差も大きくないのでガラスエポキシ基板で問題なと思います。
回路図
今回のアンプの回路図は以下のようになります。
基本的にメーカーデータシートの参考回路の寄せ集めですが。
OPアンプ回路についてはChumoy低インピーダンス版の回路を利用しました。GNDはすべて共通ですが電子ボリュームとOPアンプはC11・12の後にくっつけてください。これは基本的には電子ボリュームに書いてあったノイズフィルタとなるのですが流用しています。スペースを気にしないのならOPアンプの電源をC11・12の手前からとって別途470μFのコンデンサを入れてあげるのが理想です。
CPICのデータシートによればこのICのスイッチング速度は10kHzでBOOSTピンに電源を流すことによって10倍の速度で動くらしい。前回のオシロで波形を見たところこの回路でとりあえずノイズっぽい動作はなかったので問題なと思うけど。昨今のハイレゾ化を考慮すると動作速度100kHzじゃアレなので外部クロック使った方がいいんでしょうかね。
回路試作
最初はスプリッタとして利用する予定で回路を試作していましたが。
後々になってどうもマイコンとのデータ転送に問題が出てくるので後で基板上で負電源コンバーターとしました。(アダプタに接続している+端子をレギュレーターにつないでGNDの位置を変えるだけ。簡単。)
他のICをつけてテスト。この状態ではうまくいったんですけどねぇ。この後OPアンプをつけたらうまくいかなくなりました。
電源を+15Vとしてレギュレーターを正電源側に盛り込むなどの工夫がいりそうです。っていうか逆になんでこれ成功したんだろう?
基板レイアウト思考中の状態。意外と余裕がありそうでないです。結局何か所かジャンパー接続になってしまった。
基板完成
完成した基盤はこんな感じになりました。
配線をして完成。この配線は修正前です。
裏面。こちらは修正後です。紫二本がアンプの電源。赤黒がレギュレータからの電源となってます。
PasSなんていうソフトを見つけたので実装図も作ってみました。
ソフトの制約で上記写真とは若干異なってますがまぁこんな感じです。
動作確認
実際の使用予定と同じ環境で動作確認を実施。
中々きれいな高音で低音もそこそこ出ており。ノイズもなくいい感じです。最大音量付近で使うとちょっとノイズが乗ったような現象が発生しますが。たぶんこれは電源の問題なので、本来使う予定だったCPICを使うことで回避されるかと思われます。もしくは音量調整直後にのみ起きているのでAVRのAD変換がちょっと最大値付近で安定していないのかもしれません。もしくは抵抗器の不良でばらついているのか…。回路的には問題なさそうなのであとはCPICの選定ミスかプログラムの関係かと思うのですが。
とはいえ最大音量で使うようなことはめったにないと思いますのでまぁ問題ないでしょう。
単体使用として
一応今回はこれ単体でもヘッドフォンアンプとして使えるようにと作っているので単体のヘッドフォンアンプとして使った場合の状況についても触れておきたいと思います。
まぁ基本的にはChumoyアンプに電子VRがついた感じになるので問題なく鳴るのですが。少し電源側が非力なきもしますので、単体で使う場合はもう少し大きめの基板を用意し、OPアンプの電源だけカレントミラーや抵抗分圧を利用して別電源とした方がよいかもしれません。今回はあくまでこのOPアンプは前段のプリアンプとして利用するのが目的なので、負荷としてはイヤホン程度のものを想定していますので。MDR-1Rで耳が痛くなるほど音量を上げるとバリバリという電源が足りてなさそうな音がしますので。(前回作ったChumoyアンプだと問題ない音量)
あとは割と音量調整がシビアめなのでHPAにする際は音量決定を少し工夫する必要があると思います。
最後に
1000円程度で作ることができる電子ボリュームとしてはなかなか良いものができたように思えます。回路的には必要最低限の回路で構成されているので、高音質化や安定化、保護回路の挿入など改善の余地はまだまだあると思いますが。とりあえず実用レベルにはなっていると思います。(出力段に直列に100Ω前後の保護用抵抗を入れると音質もよくなる。音量は少し下がるけどね。)
とりあえずこの後にパワーアンプをつなげる分に関してはこれで問題ないと思うのでこのままいきます。
ソースコード
たいしたものではないですが。マイコンのソースコードを乗せておきます。
/*
* HAMP2.cpp
*
* Created: 2016/10/22 6:15:44
* Author : Sakura87
*/
#include <avr/io.h>
#include <avr/io.h>
#include <util/delay.h>
#define _BV(bit) (1 << (bit))
#include <inttypes.h>
#include <avr/interrupt.h>
#define DATA 2 // Fix
#define SCLK 1 // Fix
#define LACH 0 // Var **LAtCH
void PBWrite(char p,unsigned char d){PORTB = (d<<p)&(1<<p) ? PORTB | (1<<p) : PORTB & ~(1<<p);}
int data_send(int data){
char cnt = 16;
PBWrite(LACH,1);
_delay_us(1);
PBWrite(LACH,0);
_delay_us(1);
while(cnt--){
PBWrite(DATA,(data>>cnt) &1);
PBWrite(SCLK,0);
PBWrite(SCLK,1);
}
PBWrite(LACH,1);
_delay_us(3);
}
int ARead(unsigned char pin){
ADCSRA=0x87; // ADC Init
static int h,l;
ADMUX=0x00|(pin&0x0f); // 電源電圧基準
ADCSRA|=0x40;// AD変換開始 <- 10bit
while(ADCSRA&0x40); //終わるまで待つ
l=ADCL;h=ADCH;return (h<<8)|l; // <- 10bit
}
int main(void)
{
// LCD
//PB 76543210 SPI以外のIOもココで設定する。
DDRB =0b00010111;
PORTB =0b00000110;
int VR = 0,VRO=1;
while (1)
{
VR = double(ARead(3)*0.0929);VR<<=9;
if(VR!=VRO){data_send(VR | 0x00);data_send(VR |0x10);VRO=VR;}
}
}