2019年10月9日水曜日

ネットワークオーディオプレーヤーの製作 (5) Raspberry Piとその周辺回路

前回はトラブルの話だけで記事を1本作ってしまいましたが、今回はちゃんと製作物の紹介をします。具体的にはRasPiの電源制御とI2Sアイソレータについて。下図の赤枠の部分です。




まず、電源制御の概要です。
RasPiには電源スイッチというものがありません。ボードに電力を与えると勝手に起動します。電源を切るときは逆に電力供給を止めればいい…というわけにはいかず、普通のパソコンと同様ちゃんとシャットダウンの手続きを取る必要があります。
サーバー等に使うならいいのかもしれませんが、オーディオ機器としてはこれでは困ります。普通のアンプ等と同じように、電源スイッチで自由自在にON/OFFできるようにしないと不便極まりないのです。いつでも気兼ねなくスイッチをブチ切れるようにすることが目標です。

いろいろ調べていると、Volumioに便利なプラグインがあることが分かりました。
その名も"GPIO Buttons". RasPiのGPIOピンにスイッチを繋いで様々な操作ができるというものです。その機能のひとつにシャットダウンがあります。


これを使って、ハードウェア操作だけで安全にRasPiをシャットダウンさせることができます。待機電力削減のため、シャットダウン後は自動的に電源供給を断つ回路も追加することにしました。
シャットダウン問題についてはこれで良いとして、起動はどうでしょうか。今回はシャットダウン後に電源供給をストップすることにしているので、単に電源供給を再開すればいいだけですね。これも大丈夫そうです。
(ちなみに、RasPiがシャットダウンされており且つ電源供給が続いている状態からの起動は、RasPiのRUN端子を一度GNDに落とすことで可能なようです。)

次に、I2Sアイソレータの概要。
RasPiとDACやアナログ回路のGNDを分離するために使います。必須の回路ではないのですが、RasPiとアナログオーディオ回路のGNDが共通だと何となく気分が良くないですから…

-----

ということで、これらの機能を実現するために作った回路がこちらです。全体の回路図の一部を切り抜いただけなので入出力のラインがブチ切れていますがご容赦ください。
赤枠内が電源制御、青枠内がI2Sアイソレータ関連部分です。


まず電源制御部から解説します。
PS1 (AD-A50P400) とあるのは5V 4AのACアダプタです。これを一度分解して入力を導線で引き出し、組み直してからダイソーのアルミテープでグルグル巻きにしてシールドし、更に適当なテープで覆って使いました。シールドはシャーシに落としています。


安いACアダプタですが、電解コンデンサは全てRubycon製で作りも悪くなさそうです。
ケースに組み付けたところ↓


このACアダプタの後段にある回路でRasPiへの電源供給を制御します。
回路図のPOWER_SWを上側に倒すとQ2(2SJ505)のゲートがGNDに落ちてONになり、RasPiへの電源供給が始まります。
一方、POWER_SWを下側に倒したときの動作は少々複雑です。
まず、RasPiの内部でプルアップされていたGPIO8がLOWとなりRasPiがシャットダウンを始めます。それと同時にRasPiの内部プルアップ抵抗を通じてC27 (22μF) の充電が始まり、しばらくするとGPIO8をHIGHに戻します。このC27は一見不要そうで、実際最初は使っていませんでした。しかしプラグインの不具合なのか「GPIO8がLOWになってもRasPiがシャットダウンせず、再度GPIO8がHIGHになるとシャットダウンが始まる」という現象が時々見られたので、確実にRasPiをシャットダウンするため急遽追加しました。
また、RasPiのシャットダウン完了をUSBバスパワー出力(回路図中のRPi_USB_BP)がOFFになることで検出し、Q2のゲートを引っ張っていたQ1 (2N7000)をOFFにします。この機能により、RasPiが正常にシャットダウンしなかった時にQ2がOFFになることを防ぎます。Q1がOFFになった後は、念のため入れたOFF遅延用コンデンサC29 (22μF) が力尽きるとQ2がOFFになりRasPiへの電源供給がストップします。

次にI2Sアイソレータの解説です。
Si8660というデジタルアイソレータを使ってみました。


このICの使い方はごく簡単で、入出力と2系統の電源を接続するだけです。入力側の電源はRasPiから、出力側の電源はDACからもらってきます。そしてこのIC、本当は6chもの信号の絶縁ができるのですが、今回使うのは3chだけです。モッタイナイ…余った入力端子はGNDに落としておきましょう。
このパートは特に問題なく、すんなり動作しました。

-----

さて、このような回路のせいでRasPiが3階建てになってしまいました。
1階はRasPi本体。
2階はI2SアイソレータとEMIフィル。EMIフィルの取り付けには基板のパターンカットが必要でした。


3階は電源制御。


実験しながら作っているのでどうしても基板が汚くなりがちで恥ずかしい限りです。

-----

これでネットワークオーディオプレーヤーの解説はほぼ終わりです。次回はまとめです。

2019年10月6日日曜日

ネットワークオーディオプレーヤーの製作 (4) Raspberry Pi 3B+のI2S出力トラブル

ネットワークオーディオプレーヤーを自作する話、第4回はRaspberry Pi 3B+(以下RasPi)からI2S信号を出力する話です。

RasPiにはVolumioというオーディオ向けディストリビューションをインストールして使います。Volumio のインストール方法については他に詳しいサイトが多くあるのでここでは省略しますが、基本的に全てGUIで完結でき、大変楽でびっくりしました。かつて初代RasPi Bを購入しCUIと睨めっこして結局何もできなかった思い出が嘘のようです。

さて、Volumioのインストールまでは順調だったのですが、RasPiとES9038Q2Mを繋いで音を出すところで躓いてしまいました。
Volumioの設定で出力先としていろいろなDACを選択できるのですが、もちろん中華ES9038Q2M基板というような選択肢は無いため、とりあえずGeneric I2S DACを選択したところ、DACからは雑音しか出てこないのです。更にいろいろ試していると、雑音が出るのは音源が16bitである場合で、24bit音源なら正常に再生できることが分かりました。しかし私の手持ちの音源の大半は16bitなので、24bitなら再生できると言われても困ります。
これはI2Sのフォーマットが微妙におかしい可能性が高い…と判断してオシロで見てみると、こんな感じでした。黄色がBCLK, 紫色がLRCLKです。

16bit音源

24bit音源

お分かりいただけたでしょうか?
24bit音源ではBCLKが64fsなのに、16bit音源では32fsになっています。一方ES9038Q2M側はというと、常時64fsのBCLKを必要とする32bitモードで動作しています。
これが16bit音源再生の不具合につながっていました。

RasPi側で出力を常時24bitにすることで解決できますが、それもあまり気持ちの良い方法では無い気がした(元のデータをそのまま出したい)ので、別の方法を考える必要があります。といってもあっさりしたもので、DACをGeneric I2S DACからR-PI DACに変えるだけでした。


いろいろ試していて偶然見つけた方法ですが、これで16bitだろうと24bitだろうと問題なく再生されるようになりました。
-----
最後に、メモ代わりにピン配置など。
BCLK…GPIO18 (12pin)
LRCLK…GPIO19 (35pin)
DATA…GPIO21 (40pin)
MCLK…なし(!)
※電源が5Vなので勘違いしやすいのですが、ラズパイのGPIOは3.3Vです。

ネットワークオーディオプレーヤーの製作 (3) DACのI/V変換と出力

前回はES9038Q2M DAC基板について書きましたが、今回はその基板から出てきた信号をI/V変換して出力するところまでを書きます。下図の赤枠の部分です。



回路図の該当部分だけ切り取ったものがこちら。


オペアンプでI/V変換を行い簡単なLPFを通して出力するという超シンプルな回路ですね。
I/V変換抵抗と並列にコンデンサを入れる回路をよく見ますが、それをやると電流帰還オペアンプが使えなくなる(※)ため今回は採用しませんでした。
オペアンプは数種類試しましたが、MUSES8920やAD812(電流帰還型)が良さそうです。

電源は「通電してみんべ」さん発案のディスクリート三端子レギュレータを使いました。


このレギュレータでは、(ツェナーダイオードの電圧)+(2SC2240 or 2SC970のVbe)が出力電圧となります。
ツェナーダイオードには公称より電圧が低めの選別品(公称5.1V→4.80~5.07V, 公称4.7V→4.40~4.63V)を用いており、Vbeと合わせて出力電圧約15Vとしています。
高い電圧のツェナーダイオードを1本使うのではなくわざわざ低電圧品を直列にしているのは、ノイズ低減のため(高電圧品はノイズが多い)と、温度特性を良くするため(ツェナーダイオードは5-6V品で最も温度変化に対する電圧変化が小さくなる)です。

さて、実際の基板がこちら。


突貫工事で設計して部品配置をよく検討せず発注してしまったので、なんだか
ス カ ス カ 
の基板になってしまいました。反省して基板設計をやり直したので、今度別の基板を発注するときにでもついでに作り直します…
また、帰還抵抗が付いていないように見えますが、基板の裏側のICソケットの足に1608の薄膜抵抗を直付けしています。

次回はネットワークオーディオプレーヤーの核であるラズパイまわりについて。

※Analog Devices. MT-034: Current Feedback Op Amps. p.4
 https://www.analog.com/media/en/training-seminars/tutorials/MT-034.pdf

フライパン1つで作る広島のお好み焼き

高校卒業まで18年暮らした広島市を離れて早x年、東京の1K狭小キッチンで懐かしのお好み焼きづくりにチャレンジした話。
鉄板やホットプレートは持っておらず台所のコンロはIHが1口のみという環境のため、フライパン1枚でやってみました。


  • 器具
フライパン(26cm)1枚
コテ(ヘラ)2本


  • 材料(必須のもののみ)
薄力粉40g
キャベツ葉3-4枚分
もやしひとつかみ
豚バラ3-4枚
1個
和風粉末だし適量
お好みソース適量


  • 手順
  1. キャベツを千切りにする。
  2. 薄力粉40gに水80gを入れ、よくかき混ぜておく(生地の素)。
  3. フライパンを中火で熱する。焦げ付きやすいフライパンの場合は薄く油をひく。
  4. フライパンに2.で作った生地の素の7割程度を入れ、薄く円状に広げて生地を作る。
  5. 生地に和風粉末だしをふりかけ下味をつける。
  6. 生地にキャベツ、もやし、豚肉の順に具材を乗せる。ここで塩コショウで下味を付けても良い。野菜と豚肉の間に天かすやイカ天などを入れても良い。
  7. 豚肉の上から、4.で残しておいた生地の素をかける(つなぎ)。これを忘れると後で全くまとまらず苦労するので注意。ただし、つなぎを入れすぎてキャベツの中にまで浸透させてしまうとベチャベチャのお好み焼きが完成するので二度注意…
  8. 最下層の生地に焼き色が付いてきたら、コテでひっくり返す。
  9. 上からコテで押しながら、全体に火が通るまで5-6分待つ。ふわっとしたお好み焼きが好きな場合は押さなくても良い。
  10. 全体に火が通ったら、そのままの向きで(ひっくり返さず)一度皿に乗せる。
  11. 焼きそばの麺を焼く。お好みソースなどで味を付けてもよい。
  12. 麺が焼けてきたら、お好み焼き本体をそのままの向きで皿からフライパンに戻す。
  13. 5-6分焼く。
  14. 全体が焼けて馴染んできたら、そのままの向きで再度皿に避難させる。
  15. 生卵を割ってフライパンに落とし、お好み焼きの大きさに整形する。
  16. 卵が固まらないうちにお好み焼き本体をそのままの向きでフライパンに戻す。
  17. 卵が固まりお好み焼き本体と馴染んだら、ヘラでひっくり返す。
  18. お好みソースを塗り、好みに応じて青のりやネギ等をかける。
  19. 皿に移して完成。食べやすいようにコテで適当に切れ目を入れておく。


  • コツなど
表面に塗るソースだけに頼らず、内部にしっかり下味を付けておくとおいしくできます。
ひっくり返したときに多少形が崩れても、慌てずヘラで整形すれば大抵何とかなります。
単純そうに見えて、加熱時間・焼きそばの焼き方・下味など味を左右する変数がかなり多いので、繰り返し焼いて自分の好みのスタイルを確立させましょう!

2019年10月1日火曜日

ネットワークオーディオプレーヤーの製作 (2) 中華ES9038Q2M基板の改造・マイコン制御

ネットワークオーディオプレーヤーの製作シリーズ第2回はDAC部についてです。
(第1回はこちら→ネットワークオーディオプレーヤーの製作 (1) 概要
下図の赤枠の部分です。


DAC基板には、最近流行っている中華ES9038Q2M基板を改造したものを使います。以前ヘッドホンアンプに組み込んだものを取り出して再利用することにしました(ヘッドホンアンプ用には別の基板を新たに導入)。

この基板の詳細・改造経緯については過去記事に詳しく書いたのでご覧ください→ES9038Q2M DAC内蔵ヘッドホンアンプの製作 (1) DAC基板の改造

このDAC基板をそのまま流用することもできるのですが、実は基板上でDAC ICをI2C制御しているマイコン(ATtiny24A)の動作にいくつか不満がありました。その不満というのが以下の3点です。

  • PLLバンド幅の調整ができない
音質への影響が大きい部分(ES9016で経験済み)なので、自分でいじりたいです。

  • マイコン内蔵ADCを使った音量制御の方法が気に入らない
元の基板ではADCの入力電圧が小さいほど音量が大きくなるという制御。何か危なっかしいので逆にしたいです…

  • I2C通信が常時行われている(っぽい)
設定を変更したときだけ通信すればいいのでは?オーディオ機器なのでできるだけノイズの要因は減らしたいものです。


というわけで元の基板に付いているマイコンは取り外してしまい、自前のマイコンを使ってDAC ICを制御することにしました。
(参考記事: 表面実装部品取り外し専用のコテ先を自作


上の画像の左下がマイコン跡地です。

そして、代わりに作ったマイコン基板がこちら。秋月C基板です。



ピンヘッダで設定できる項目を増やすべく、元のマイコンよりピン数の多いATmega328Pを使用しました。
ちなみに私はマイコンにわか勢で、基本的にマイコンそのものやプログラミングにはあまり興味はなく、道具として使うだけです。ということで、楽にプログラミングしたいのでマイコンにArduinoのブートローダ(8MHz, 3.3V版)を書き込み、基板にUSB-シリアル変換モジュールを外付けできるようにしました(プログラムの書き込みやデバッグ時のみ使用)。つまり、この基板は実質的にArduino Proです。

さて肝心の中身ですが、上記の通りI2C通信です。ES9038Q2MはI2C用に100以上のレジスタを持っており、最初に見たときこれは大変だと思ったものですが、データシートを熟読すると実際にマイコンから変更すべき部分はごくわずかであることが分かりました。
マイコンからいじっているレジスタは以下の通り、たった9つです。
Register 1: Input selection
Register 2: Mixing, Serial Data and Automute Configration
Register 7: Filter Bandwidth and System Mute
Register 8: GPIO Configuration
Register 11: SPDIF Select
Register 12: ASRC/DPLL Bandwidth
Register 14: Soft Start Configuration
Register 15: Volume Control
Register 27: General Configuration

以下のような機能を実装しました。

  • ピンヘッダによる入力、フィルタ、PLLバンド幅の切り替え
マイコン内蔵抵抗でプルアップしたピンをジャンパーピンでGNDに落とすかオープンにしておくかによって設定を変更する方式です。入力はI2S(ラズパイ)・光・同軸の3通り、フィルタは7通り、PLLバンド幅は15通りの設定が可能です。

  • ADCによる音量調整
マイコン内蔵の10bit ADCに入力する電圧を可変抵抗器により変化させることで音量調整を行います。
ES9038Q2Mは0dBから-127.5dBまで0.5dBごとに255段階の音量調整ができるようになっていますが、実際に120dB以上も音量を絞ることは考えにくいです。そこで、
・ボリュームを絞り切ったとき(ADC出力=0または1)では-127.5dB
・ADC出力≧2では-63dBから0dBまで0.5dBごとの制御
としました。
また、プログラムに入れたLPFもどきの処理と基板上のCR LPFのおかげで、ノイズなどにより設定値がコロコロ変わることもありません。
可変抵抗には大型の密閉タイプ(東京コスモス RV24YN 10kΩ)を使い、信頼性を高めています。また、1MΩでADC入力をプルダウンしているので、ブラシの接触不良などの不具合で可変抵抗がADC入力から切り離されても音量設定が大暴れすることは無くミュートがかかるだけで安全です。


I2C通信はDAC起動時と設定に変更があったときのみ行われるようにしました。

これで、上に挙げた3つの不満点は解消されたことになります。
DACとマイコン部の回路図は下の通りです。


まあ、本記事はソフトの話がメインだったので回路図には大したおもしろみはありませんが…(そう言うなら書いたコードを出せ、というご指摘はもっともですが諸事情によりご容赦ください)

最後に、恥ずかしながら私がはまった落とし穴を共有しておきます。
まず、ESSのデータシートに載っているデバイスのI2Cアドレスは8bitであり、ArduinoのWireライブラリを使う際は末尾のR/Wを取って7bitに変換する必要があるので要注意です。
次に、Register 14について。ここはデフォルト設定だとDACの出力端子がGNDに落とされ何も信号が出てこないので、最初に変更しておく必要があります。最初このレジスタを見落としており、なぜ音が出ないのかとしばらく困っていました。しかもこの部分は旧版のデータシートではReservedになっているので、古いデータシートを信じていると絶対にこのICを動かすことはできません(ファームウェアの更新があった?)。

次回はDAC出力のI/V変換から出力まで。