さくらのジャンク箱ロゴ

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

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

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

ご無沙汰しております。

先日の記事でもお話ししました通り、燃えてしまった電子ボリュームの部品が手に入りましたので。今回はArduino Unoで電子ボリュームを動作させたいと思います。

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

なお、今回は電子ボリュームの基本的な動作の仕組みや用途などは割愛させていただきますので、前回の記事をご覧になるか、ほかの詳しいサイトを参考にしてください。

お知らせ(2020年5月18日追記)

今回利用したLM1972Mですが、Ti社の方針により正規販売代理店でないと販売できなくなったようです。(だいたいメジャーどころはTiが牛耳ってるのになんてことしてくれたんだ)
なので、秋月等のパーツショップでは入手できなくなりますが、Digi-Keyなどを利用することによってまだ入手は出来るようです。
今後はDigi-Keyから直接買うか(送料高い)マルツなどDigi-Keyの代理店となっているところ(部品単価が高い、送料は安い)で買うと言うことになるかと思います。

個人的には部品総額が6000円以下であればマルツ経由のDigi-Keyが部品単価は高くなるが安く抑えられるし周辺パーツも買いやすいのかなあと。(抵抗とかやたら高いものもあるが)

また、LM1972Mについては製造終了で、後継はXがついてML1972MXになるようです。特に何が変わったかは表面のスペックではわかりませんでしたが。

用意するもの

  • 電子ボリュームIC LM1972M(Ti)
    今回の主役。SPI命令で制御でき、デイジーチェーン接続で複数のICを同時に制御可能。
    秋月で1個300円と少し高めだがお手頃価格ではある。
  • SOP→DIP変換基板 20ピン以上
    SOPのパッケージなので、ユニバーサル基板で扱いやすいように変換します。
    自称人間で実は工作機械な表面実装部品を素手でユニバーサル基板にはんだ付けしている人以外は変換基板を使うのがベストです。
  • 連結ソケット(両オスピン。変換基板にあったもの。)
    合えば何でもいい。以下下駄と表記。
  • 電解コンデンサ(すべて2個ずつ 耐圧は16~25Vくらいで。)
    4.7μF(入力カップリング ICデータシートでは1μF)
    10μF(OPアンプ手前に設置)
    470μF(電源平滑用)
  • セラミックコンデンサ
    0.1μF×4個 パスコン。Vdd 2か所とVss 2か所に設置。音質にかかわらないところなのでセラコンでOK。
  • JFET入力のOPアンプ(1倍で使えるもの)
    今回はボルテージフォロア回路を構成し、増幅はせず単純なバッファーとして使用します。
    なので利得が低いと発振してしまうようなOPアンプは使えません。使いたければ抵抗を追加して10倍程度の増幅を行ってください。
  • 8ピンの丸ピンICソケット
    OPアンプを交換可能にするのであれば必要。
  • 2kΩの抵抗
    デイジーチェーン接続終端のDATA-OUT端子とLOGIC GNDに接続する。なくても死にはしないがDATA-OUTピンが浮くからほかのピンや機器にノイズが載るよ!っていうことらしい。
  • 何らかの±5Vの電源。
    DC-DCコンバーターでもレールスプリッターでもなんでもよいので安定した5Vの両電源が供給できるものを用意してください。最悪抵抗分圧でもよいです。LM1972の定格がP-P 4.5~12V、一般的なOPアンプの定格が±5V前後なので、5Vの両電源か、10V~12Vの電源を分圧して使いましょう。
  • 半田吸い取り線
    表面実装部品のはんだ付けに使います。

その他接続用のコネクタ類や基板などは予算や都合に合わせて適当に。基板は秋月のC基板のサイズで十分乗ります。(ジャンパーは必要。)

部品構成

下からメインのIC、変換基板、下駄。

ICはLM1972M。SOP 20ピンで1.27mmピッチです。

変換基板は秋月に20ピン向けがないので、28ピンのものを使います。手に入るなら20ピンを使ったほうがいいです。変換基板は秋月以外には20ピン用もあるみたいですが、別に余ったピンを使わなければよいのと、基板だけのために余計に送料がかかるのもあほらしいので、今回は28ピンの基板とそれに合う下駄を買いました。秋月の基板にも2種類ありますが。今回はシールドパターンの入っているこのタイプを買いました。

しかし、この基板のパターンは写真でもわかるように28ピンと14番ピンにそれぞれついていて、シールド側は14番であり、ICが全く触れないピンなのでほとんど意味をなしていません。28番に相当するピンに関しても、IN2がきますので、予期せぬノイズ混入も考えられるため、個人的にはもう片方のシンプルな方をお勧めします。まぁオフセットして28ピンと14ピンをGNDに接続してあげるという方法もありますが。

LM1972のデータシートを見ると、GND ACピンはどこにも接続されておらず、これらと隣接する信号線にパスコンを接続することでクロストーク特性が向上するらしいということが書いてあります。しかし、音声ラインにまでつけてしまうとどうも音質に影響を与えてしまいそうなので、電源に隣接するAC GNDに0.1μFのコンデンサを配置し、ほかは単に電源のGNDに接続するだけにしました。

0.1μFは音質には影響がなく、ノイズ除去を目的としますから、高周波における周波数特性の優れたセラミックコンデンサを使います。Vssの隣のAC GNDはピンを一つまたがないといけないので、写真のような5mm幅で足が曲げられていて2.54mmピッチを謳っているタイプなら、足を伸ばすことでジャンパ代わりにもなりますのでこの写真のタイプがおすすめです。

次に入力カップリングのコンデンサは、仕様書では1μFが指定されていますが。手持ちの4.7μFを使いました。

ここは音質にモロに影響しますので、最低でもオーディオ用の電解コンデンサを使いましょう。また、可能な限り無極性を使ってください。

次に、写真はにありませんが、作成途中でOPアンプの前に10μFの電解コンデンサを±の電源の双方に追加しました。

電源直下には、電源平滑用として470μFの電解コンデンサを配置しています。これはただの平滑用ですのでグレードは問いません。ただし耐久性を考えると最低でもルビコンなどの日本企業が作っているものを。可能な限りOSコンやオーディオグレードを使うと良いでしょう。それよりも重要なのは耐圧で、あまり大きすぎると載りませんのでご注意ください。

仕様書にJ-FETのOPアンプをバッファで使うといいよ!って書いてあったので。J-FET入力系OPアンプとしてNJM2082Dを採用しました。

丸ピンソケットに差し込んで取替が効くようにしています。なお、今回のOPアンプはボルテージフォロア回路として使いますので、特別周辺部品は必要ありませんが、LM1972の作例を見ていると結構電子ボリュームとの間の電源間にコンデンサを挟んでいる作例がありましたので。電源端子とGNDの間に10μFの電解コンデンサを挟んでいます。(上の10μFの電解コンデンサがそれ。)それ以外は-INPUTと出力を短絡させるだけなので超簡単です。

OPアンプの選定に関しては、電源が動作範囲で、特に利得の指定がないものであればどれを選んでも良いと思います。おそらく大半のOPアンプが利用可能かと。

たとえばここをヘッドフォンアンプの構成にするともっとたくさんのICが使えますが。今回はあくまでバッファとして使うのでこれで良いです。

メイン基板はいつもの秋月の小さいやつ。Cタイプ基板でコンデンサさえ選び間違えなければすべての部品が載ります。

しかし、今回結構立体配線やジャンパを行いましたので、両面スルーホール基板などを使用するほうがいいかもしれません。

基板に関しては入手できるものでよいと思いますが、基板には紙ベースとガラスベースがあり、ガラスのほうがしっかりしている印象を受けますし、見た目もよいのでガラス基板をお勧めします。

回路図

ほぼ取説の説明通りの部品がくっついているだけのものですが。

いつもアップしている回路図はBSchを使っていますが。今後これ以上高度化するとユニバーサル基板では問題が出る可能性がありますので、今回は基板制作も視野にKicadを使ってみました。BSchになれているとなかなかうまくいかないところもあるのですが、まぁまぁですね。

回路図ではDATA-OUTに2kΩの抵抗がつながっておりますが、これは単体で使う構成で書いているので、複数つなげる場合はここに次のLM1972のDATA-INをつなげます。

基本的にはこの回路図のとおりにつなげばよいのですが、GNDは信号が通る順に接続し、LOGIC GNDとほかのGNDは別にするべきです。図面右側にある青枠の部分の順序でつなげば問題ないと思います。間違えても多分燃えませんが可能な限りこの順序にしてください。LOGIC GNDを一緒にしてしまうとICが燃える可能性があります(実際燃えました)

しかし、燃えた原因はいまいちよくわからなくて、この前と構成はほぼ同じでここだけ違いますので、これだろうというのが正直なところです。

製作

まずはメインICの基板を作ります。

完成予想図としてはこのような形になります。今回は左詰めで使いました。

 

SOP ICのはんだ付け作業

1.27mmピッチは比較的大きめとはいえ一般的などこのご家庭にもあるようなはんだごてとはんだでは太すぎて取り付けづらいです。そこで、ある程度ワイルドにはんだ付けをした後、半田吸い取り線で余ったはんだを吸い取るという方法を取ります。

この方法で注意しなければならないのは、いくらあとで半田吸い取り線を使うといっても、IC下のパターンにはんだが流れ込んでいては取り除けない可能性があるので、おおざっぱにやるとはいえ隣の足と団子になる程度に収めておいてください。

まず対角で1ピンはんだ付けし、すべてのピンが載るところで固定します。ここできちんとすべての足がパターンと一致していることを確認しないと、後々修正が厳しくなるので注意が必要です。

すべての足へのはんだ付けが完了しました。

次に半田吸い取り線を用意し、余ったはんだを吸い取ります。吸い取った後はなるべく明るい光にかざしたり、ルーペを使用するなどしてほかにはんだが流れ込んでいないことや、取り残しがないことを確認します。

キレイにはんだ付けができました。なお、小手先の細いこてや、細めのはんだがある場合はそれを使ったほうがいいと思います。

SOP ICの半田付け作業を参考にしたページ(2020/03/25追記)

ちょっとした調べ物をしていたときにこの方法をだいぶ前に知ったページを偶然発見したのでリンクしておきます。

このページの最後の方の方法を参考にしたと思います。
紹介したページではフラックスやレジストクリーナーを使用していますので今から実行するのであればあった方が良いでしょうが、このピンピッチであればなくてもまぁまぁ形になります。

ところで、いくらあとから半田吸い取り線で吸い取るといえど、ある程度ブリッジしないことを意識して半田作業をしましょう。
余り多すぎると半田も吸い取り線も無駄になりますし、吸い取り線で吸いきれないところに半田が流れたりして予期せぬ事故を招いたりしますので。

今回は大きめのコネクタを使ったので実装面積的に余った部分をカットしました。

基板のカットは定規をあててカッターなどで切れ目を入れた後、ラジオペンチなどでこじってやると比較的失敗が少ないです。(全くないわけではない)

LM1972Mは、電源端子が、合計で4か所あるのですが、マイナス側(Vss)の電源のみなぜか1つの反対側に存在しているので、マイナス側のコンデンサのみ、下駄の足を利用して変換基板側に実装しました。紫色の線はジャンパです。

もう片方のマイナス側はGND ACとVssの間に出力ピンがあるので部品構成のコンデンサのところでも話したように足が曲げられて2.54mmピッチになっているセラコンを1本のみ足を延ばしてはんだ付けしてジャンパ替わりにします。

このように取りつきました。

こんな感じになりました。

あとは周辺部品を取り付けていくだけです。

部品の位置決めをして

完成……。といいたいところですが、最初にふれたとおりこの後OPアンプ周りの回路を修正しました。

最終的な構成。10μFのコンデンサが電子ボリュームとOPアンプの間に追加されて電源のジャンパーが変更されています。色が違うのは単純に紫のリード線がなくなったためで特に深い意味はありません。

真上から見た写真。

裏面の配線。相変わらずの汚さ。

動作確認

Arduinoと適当なスピーカーをつないで動作確認を行います。無事音量変更ができているようです。

コーディング

このICは特別なコードを書く必要もなく、単にデータをSPIで飛ばしてやればいいだけなので簡単です。

バイトオーダーはMSBファースト、SPI_MODEは3で動きます。

データ構成は16bitで最初にチャンネル指定を8bitで送りまして、次に音量設定を送ります。これを2ch分行うことで両方の音量を指定できます。仕様書を見るとチャンネル3があるようですが、これを指定しても両方一気に変わったりはしないようです。(LM1973という3chのデバイスがあったっぽい)

音量のステップは0~47.5までが0.5dBステップ、48~78dBまでが1dBステップとなっていまして、数値にして0~95までが0.5dBステップ、96~126までが1dBステップ、127がミュートの100dBの減衰ということになっています。実使用では78dBも100dBもどちらも無音状態なので、実質96~127が1dBステップと考えてコーディングして問題ないと思います。

1dBステップに統一するなら0~95までを2倍で加算していき、96からインクリメントしていけば問題なく、そもそも実際の聞こえ方を考えるとすべて2倍の64ステップにしてしまってもよいと思います。

チャンネルの数値は1chが0、2chが1となるようで、この数値と音量データの2バイトをICに流してやればよいようです。

SPI_MODEについて追記(2023年10月1日)

コメント欄にikeさんより以下の助言を頂きましたので追記いたします。

こんにちは、参考にさせていただきました。ありがとうございます。
SPIで定期的に同じ値を設定した場合でも、同期してプチプチとノイズが入ってしまいました。
SPIラインのノイズが原因かもしれませんが?
オペアンプはOPA2134(FET入力)を使用しています。
悩みましたが、SPI_MODE3をSPI_MODE0に変更することで改善しました。
SPI_MODE3だと、CLOCKがHighはじまりなので、
LOAD/SHIFTがHigh→Lowの後にCLOCKがhigh、
LOAD/SHIFTがLow→Highの前にCLOCKがhigh、
になってしまっています。仕様書ではLowで>150nSecとなっています。
もし同様の症状が出た場合に参考になればと思います。

こちらが動作テストを行った際はSPI_MODE3で問題なく動作しましたが、どうやらSPI_MODE0が正解のような気がしますのでもし同様のプチプチノイズが入る問題が起きていればSPI_MODE3の部分をSPI_MODE0に変更してみてください。

ikeさんご指摘感謝いたします。

 

サンプルコード

テストに使用したサンプルコードはこんな感じです。

#include <SPI.h>

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
Serial.println("Initial");

pinMode(10,OUTPUT);

SPI.setBitOrder(MSBFIRST);
SPI.setClockDivider(SPI_CLOCK_DIV16);
SPI.setDataMode(SPI_MODE3); //ノイズが発生する場合はSPI_MODE0に設定する。
SPI.begin();
}

int i,iv;

void loop() {
  // put your main code here, to run repeatedly:
digitalWrite(10,1);
digitalWrite(10,0);
if(i==0) iv=+1;
if(i==127) iv=-1;

i+=iv;
delay(200);
SPI.transfer(0x00);SPI.transfer(127-i );

digitalWrite(10,1);
digitalWrite(10,0);
SPI.transfer(0x01);SPI.transfer(127-i );

digitalWrite(10,1);
Serial.println(i);
}

単純にだんだんとフェードアウトさせ、無音になったらまた大きくするという処理です。特に難しいことはしていません。

あとはこれにAD変換でボリュームの抵抗値を読んだり、ロータリーエンコーダーを使用するなどして音量を決定させるプログラムや、液晶を制御するプログラムなどを追加してやれば立派な電子ボリュームになると思います。

なお、当サイトでの記事に使えそうなものは以下のものがあります。

終わりに

今回は表面実装部品ということで、作成のハードルは上がりましたが、このIC自体が単電源でも動くことや、マイコンで動かせる範囲の電圧でよいことなど、前回に比べると制約が少なく、コード自体も変わらないので使いやすいICとなっていると思います。

音質に関しては、まだ詳しい評価はしていませんが、とりあえず画像のスピーカーをつないでみた感じではそこそこ良い感じのようです。この辺りは、この基板は前回のパワーアンプに組み込む予定で、その時に一緒に評価したいと思います。

とはいえグレードを考えると悪いわけないと思いますが。

しかしあれですね。最近はDIPパッケージのICが軒並み生産終了になったり、そもそも最初から用意されていなかったりと。最初に半田ごてを握った20年前や、10年前に比べても電子工作のハードルが上がったように思います。セカンドソース品などではまだまだDIPや大型部品もありますが。今後はやっていくであろうラズベリーパイやArduinoを使った電子工作やIoTを視野に入れた場合は最悪でもSOPのパッケージは切り離せそうにありません。

そうなってくると変換基板があればよいが、なければ自分で基板を起こすか、工作機械並みのはんだ付けスキルを身に着けるしかなく、初心者には手を出しにくい分類になってくるなと。初心者の入門用として人気の高かったラジオもいつまで放送自体が続くかもわからないしね。

次回予告ですが、まだ決めていません。実は買ってからそのままの部品もいくらかあるし、アンプも内部部品は完成できるほどの部品はあるので。その中から考えたいと思いますが、何分リアルが忙しいのでちょっと時間がかかるかもしれません。

それでは。

総閲覧数:1,289 PV

関連記事

“Arduino Unoで電子ボリューム(LM1972M)を動かす” への5件のフィードバック

  1. ike より:

    こんにちは、参考にさせていただきました。ありがとうございます。
    SPIで定期的に同じ値を設定した場合でも、同期してプチプチとノイズが入ってしまいました。
    SPIラインのノイズが原因かもしれませんが?
    オペアンプはOPA2134(FET入力)を使用しています。
    悩みましたが、SPI_MODE3をSPI_MODE0に変更することで改善しました。
    SPI_MODE3だと、CLOCKがHighはじまりなので、
    LOAD/SHIFTがHigh→Lowの後にCLOCKがhigh、
    LOAD/SHIFTがLow→Highの前にCLOCKがhigh、
    になってしまっています。仕様書ではLowで>150nSecとなっています。
    もし同様の症状が出た場合に参考になればと思います。

    • Sakura87 より:

      コメントありがとうございます。

      SPI_MODEの件確かに仰るとおりですね。ここはMODE0が適当かも知れません。
      検証時は0では動かなかったのですが、何か別の問題があったのかも知れません。

      既に実機はうっかり(物理的に)壊してしまったので実機での検証が出来ませんが、ikeさんのコメントを引用する形でちょっと加筆しておきます。ありがとうございました。

  2. kaz より:

    始めまして。細かいところまで説明されていて大変参考になりました。ありがとうございます。
    LM1972を2個使っている、arduino nano everyで駆動している以外はほとんど完全コピーで作り、サンプルプログラムを4ch用にアレンジして音が大小変化することが確認できました。しかしloop関数の周期と一致したプツプツ音が入ります。ところがi+=ivの後にi=80としてiを固定するとプツプツ音は出なくなります。delayをいじって周期を変えてもプツプツ音の周期が変わるだけで改善されません。もし差し支えなければどこら辺が怪しいかチェックポイント等ご教授いただけないでしょうか?よろしくお願いいたします。

    • Sakura87 より:

      コメントありがとうございます。

      https://www.tij.co.jp/jp/lit/ds/symlink/lm1972.pdf
      製造元の取扱説明書9ページにクリック/ポップ防止という項目があります。
      ここによるとJ-FET入力のバッファを利用することで回避出来るとあり、この回路もオペアンプを利用した回路になっています。お使いのオペアンプの仕様を確認してみて、J-FETでなければJ-FETアンプに変えてみてください。

      J-FETであったとしてもこの回路は結構ギリギリで動作する電圧で設計されているので、他の低電圧でも動作するアンプに変えてみてください。

      もしオペアンプを変えてみても状況が変わらないようなら、再度回路を見直してみて、やはりダメなのであれば、オシロスコープやアナライザなどで電源の電圧状況などを確認してみる必要があると思います。

      また、この記事は少し前にかいたもので、自分も1台この後に作りましたが、うまくいかなかったのでもしかすると何かこの回路では使えなくなった仕様変更があっているのかもしれません。(それが無ければ部品不良とか?

      お役に立てるかは分かりませんが、私からお伝え出来ることは以上です。
      それでは。

      • kaz より:

        Sakura87様
        早々にアドバイスありがとうございます。
        御指摘いただいた、オペアンプ周りから調査していきたいと思います。
        kaz

コメントを残す

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

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