さくらのジャンク箱ロゴ

Sakura87がほぼ月刊でお届けするPCや電子工作と写真のブログ @なんと20周年

Arduino Unoで電子ボリューム(NJW1159D)を動かす

この記事は8年ほど前に投稿されました。内容が古くなっている可能性がありますので更新日時にご注意ください。

IMG_7278_20160331

今までArduinoおよびRaspberry Piでは主に表示関係を扱ってきましたが、今回は音関係の部品である電子ボリュームを使ってみたいと思います。例えばアンプなどを作るときに、アナログのボリュームではなく音量を電子制御したい時もあると思います。そんな時に使えるアイテムが電子ボリューム(電子ボリウム/デジタルポテンショメータ)です。ということで今日はそんな電子ボリュームを使ってみたいと思います。

お知らせ

最近このICを取り扱っている店舗がネット上ではマルツくらいになり、メーカー製品ページでも生産終了のアナウンスこそないものの、サンプルが要問合せ状態となっているため、別の電子ボリュームを使った記事を書きました。

Arduino Unoで電子ボリューム(LM1972M)を動かす

こちらのICもDIP品ではないのですが、比較的はんだ付けが容易な1.27mmピッチですし、こちらのほうが音質が良いので今後はこちらを利用されることをお勧めします。少々高いですがマルツやその他店舗でこのICを探し出して作るよりは、構成部品も少なくて済みますしお勧めです。

用意するもの

IMG_7290_20160331

  • 電子ボリュームIC NJW1159D(新日本無線)
    今回の主役。SPI命令で制御でき、最大4つまで同時に制御することのできるもの。
    秋月で4個入りが450円、マルツで1個210円(税抜)前後と値段も手頃である。
  • 電解コンデンサ
    1μF × 4 音声入出力のカップリングコンデンサ
    10μF ×2 内部電源ノイズ除去用コンデンサ
    100μF×2 電源用
    メーカー仕様書が電解コンデンサだったので電解コンデンサと書いていますが。1μFのコンデンサはセラミックコンデンサや高音質用電解コンデンサでも良いと思います。実際に巷に出回っている回路図や作例もセラミックコンデンサ等に変更されている場合があります。
  • ±5V出力 DC-DCコンバータ(MCW03-05D05)
    このICは電源に正負両方の電源が必要なので正負出力のDC-DCコンバーターを使います。テスト用であれば12V電源を利用して抵抗分圧をして+6Vと-6Vを取り出す方法もあります(ただし電圧が負荷により変動する場合があるので本実装の場合はおすすめしません。)

そもそもの5V電源はArduinoから取るもので十分足りると思います。

ほか、テストのために壊れても良いスピーカーと音響機器があると何かと便利なので、安いMP3プレイヤーや100円程度のスピーカーなど用意しておくと良いでしょう。

ボリュームを電子制御する方法

本題に入る前に、ボリュームを電子制御する方法としてはいくつかあるので紹介しておきます。

  1. デジタルデータ自体の音量を下げる
    回路として抵抗器を持たず常に最高出力にしておき、デジタルデータを処理して音量を下げる方法。多くのOSに搭載されているサウンドミキサーやソフトウェアの音量バーはこの方式。
  2. 可変抵抗器アクチュエータを繋いで機械的に動かす
    南y…昔のバブカセや音質を気にする系のミニコンポに搭載されていた方法で、アナログの可変抵抗器にギア等でモータをつなぎ抵抗値を変化させる方式です。詳細な経緯は知りませんが、恐らくは電子ボリュームが出てくるまでのつなぎとして使用されていたものと思われ、今現在は「んんw音響回路にデジタル制御なんてありえませんぞ!」という人向けのアイテムですね。
  3. 抵抗を数珠つなぎにしてロータリースイッチ+リレーorトランジスタで切り替える
    抵抗器をたくさんつなげ、その間から線を出してリレーなどで切り替えて抵抗を変更する方式。
    まぁ10段階くらいの音量変化でいいのならこれでいいのだろうけど。集積回路の設計として行っているならともかく、ディスクリートで作る場合は正直「アホか。」という話である。
  4. 電子ボリュームを使う
    電子ボリュームという電子制御で端子間の抵抗値を変えることの出来るデバイスがあるのでそれを使う方法。今回はこれを採用する。

電子ボリュームとは

そもそも電気抵抗を生むための装置として抵抗器という物があります。これを軸をスライドさせたり回転させることで抵抗値が変更できる可変抵抗器(ボリウム)があります。この可変抵抗器を電子的に制御できるようにしたものが、電子ボリューム・デジタルポテンショメータと呼ばれるものです。

といっても、アナログのボリウムと同じものが中に入っているわけじゃなくて、以下の図のように電子的なスイッチと抵抗アレイが入っていて、このスイッチを電子的に切り替えることで可変抵抗器のような動作を実現しているわけです。(上で「アホか」と言った方法を集積回路でやっているわけです。

denshivr

電子ボリュームにはOPアンプを内蔵しているものがあったり、高音質化回路や特定用途向け回路が内蔵されているタイプのものなど、いろいろな種類があるようです。

制御方式

電子ボリュームは電子的に音量を変化させるデバイスですが、その制御方法はいくつか有ります。主なものとしてはSPI等のシリアル通信で制御するものと(基本的にICからのフィードバックは必要ないのでSPI通信と互換性があるものが多い)UP/DOWN端子をオン・オフすることで音量の上下が出来るタイプの2種類ですね。前者は主にマイコンを使い操作するためのもので、メディアプレイヤーやミュージックプレイヤーなどの既にマイコンを使用することが前提なものに使用するために作られています。後者はアンプやテーププレイヤー、ラジオチューナーなどのマイコンが必ずしも必須ではないものに使うためのものです。

今回はArduino(というかAVRマイコン)で操作するので基本的にはSPIタイプのものを使用します。
別にUP/DOWNタイプでも良いですがせっかくなので。

なお、シリアル通信タイプのメリットとしては、音量の上下が非常に高速なことと、SPI通信がライブラリとして用意されているマイコンでは制御が非常に簡単なことです。デメリットはマイコンが必須となり、マイコンやSPIの通信線に起因するノイズの対処が必須となっていることですね。まぁこの辺はそもそもマイコンで制御するのが目的なので本来デメリットとは言わないでしょう。

UP/DOWNタイプのメリットとしては、マイコンが必要ないので回路を簡略化出来ることと。デメリットとしては一度に大幅な音量変更ができないというところですね。このタイプはマイコンで制御する場合には選択肢に入れる必要はないでしょう。高いし、同じ値段ならもう少し高性能なSPIタイプの電子ボリュームが買えますので。

製品選択

ネット上で個人向けにパーツを売っているサイトをいくつか巡回すると結構な数の電子ボリュームが売られていますが。今回はDIPパッケージでブレッドボードやユニバーサル基板で利用するときも扱いやすく、比較的安価で部品点数も少なくて済みそうなNJW1159Dを使いたいと思います。

もっと高音質化された製品や多チャンネルのものもありますが。まぁステレオである程度の音質が確保できていればいいだろうということで。こちらの製品を選択しました。

製品概要

 

  • 1ICあたり2chのボリュームを搭載
  • 2ch独立制御が可能
  • 出力バッファー内蔵
  • チップセレクト機能搭載
    最大4個同時使用可能
  • 3線シリアルインターフェイス(SPI互換)
  • 0~-95dB 1dBステップ MUTE回路内蔵
  • DIP 16ピン
  • 動作電圧±4.5V~±7.5V

というわけでステレオ音声に使える電子ボリュームだということが分かる。

回路図

NJW1159D

公式サイトの仕様書にある参考回路図を簡単に書いただけです。基本オーディオの入出力に1μFのカップリング用コンデンサ。電源部に100μFのコンデンサという感じ。3・6ピンの10μFのコンデンサは電源のノイズフィルタ用コンデンサらしい。

必要なもの欄で書いたとおり、1μFのコンデンサは電解コンデンサでなくてもいいと思います。他は電解コンデンサを使いましょう。10μFとか100μFのセラミックコンデンサは多分そんなに売ってないです。1μFのコンデンサは音質に影響すると思われるので音質を気にするのであればしっかりとしたものを選びましょう。

なお発電所のコピペ。

電源コードを変えると音が変わるのはピュア界では常識です

私は発電所から専用線で我が家まで電力を引っ張り込んでいます。
電線の材質は無酸素銅が最高ですよ。
おかげで、ウチはミニコンですが、ハイエンドよりいい音がしますよ。

ちなみに電力会社の違いでも味付けにサがでるよ。

電力会社 長所 短所 お奨め度
——————————————————————
東京電力 バランス モッサリ遅い C
中部電力 低域量感 低域強すぎ A+
関西電力 高域ヌケ 特徴薄い B
中国電力 透明感 低域薄い B+
北陸電力 ウェットな艶 低域薄い A-
東北電力 密度とSN 低域薄い A+
四国電力 色彩感と温度 低域薄い A
九州電力 バランス 距離感 C
北海道電力 低域品質 音場狭い B-
沖縄電力 中高域艶 モッサリ遅い A

で、上は発電所から5Km地点での特徴。
それより自宅~発電所間の距離が長いと上記特徴+マイルドの味付け
短いと上記特徴+刺激的な味付けが加わるよ。

制御

このICの制御は2バイトで行われます。

16bit中の15~8bit目までが音量を決めるデータで。それ以降がチャンネルの切り替えということになっています。音量の設定値はメーカー仕様書に一覧が書かれてありますが。ざっくり言うとただの整数型0~95(0x00~0x5F)です。0xff(255)がミュートでこれが初期値です。

ただしデータ自体は1bit左にシフトした0~190となっています。

7~4bit目がチャンネル数の決定で0の場合がL、1の場合がRの音量変更となっています。
3~0bit目はCE0/1の設定で決定されますのでここは転送データとしては0でOKとなります。

つまり、左右に-50dBを設定する場合は 0x6400と0x6410を転送することで左右の音量が-50dBに設定されます。

コーディング

特に難しいことはしていません。

SPIとラッチ用ピンを準備して先ほど説明した通りのデータを転送するだけで使えます。

ただし、SPIのモードがデフォルトでは使用できないので以下の1行をSPI.begin();の後に入れてください。

  • SPI.setDataMode(SPI_MODE2);

転送部分のコマンドはこんな感じになります。

    digitalWrite(10,0);
    SPI.transfer(i<<1);
    SPI.transfer(0x10);
    digitalWrite(10,1);
    digitalWrite(10,0);
    SPI.transfer(i<<1);
    SPI.transfer(0x00);
    digitalWrite(10,1);

最初にラッチを0にして変数 i に設定したい音量数を代入し、それを1bitシフトして転送。
その後にチャンネル数を転送しラッチを1にする。これを2ch分行っているだけです。
3チャンネル以上のデータを転送する場合はこれにCEを制御するための信号も必要になると思いますが。2チャンネルのみの場合はこれでOKでしょう。

動作状況

IMG_7279_20160331

ブレッドボードにて仮組みしたもので動作確認中の様子。
※これの最下段は部品の関係上+ラインで使っていますがここはGNDラインです。海賊王にはなれませんが。
※この写真では3ピンと6ピンに繋がっているコンデンサがどちらも同じ向きになっていますがこれはこちらのミスです。本来6番ピンのコンデンサは他のコンデンサと反対の向きを向いてないといけません。

IMG_7380

このコードを95回繰り返しx2で音量のフェードイン・フェードアウトを行ってみた動画を載せておきますね。

今回は全体のコードは貼り付けません。

終わりに

Arduinoを多く使っている人の多くはセンサー系・メカトロ系の制御が多いようなので電子ボリュームを使う機会というのはあんまりないと思いますが。動画や音声を扱う場合は必須のアイテムとなるでしょう。

Raspberry Piであれば多機能なOSと高性能なプロセッサを積んでいますのでこの辺の処理はOSにまかせてしまえばいいと思いますが。Arduinoは非力なのでなるべくなら専用ICを使いたいところですね。

参考資料等

NJW1159 | NJW1159D NJW1159M NJW1159V | 2ch電子ボリューム | 半導体 | 新日本無線株式会社(New JRC)
デジタルポテンショメータとは | テック君の豆知識 | 半導体・電子部品の即納通販 RSオンライン

総閲覧数:615 PV

関連記事

“Arduino Unoで電子ボリューム(NJW1159D)を動かす” への1件のコメント

  1. […] 実は今までArduinoで電子ボリュームは新日本無線のNJW1159Dを使っていましたが、秋月での販売も終了したようで、入手性が悪くなってきました。そこで今回は新たな電子ボリュームとしてテキサスインスツルメンツ社製の電子ボリュームIC、LM1972Mを使った電子ボリュームを作ってみたいと思います。 […]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください