SSブログ

I2SによるAudio出力 - その6 [Raspberry Pi]

I2S入力のD/Aとshairport-syncをRaspbianに乗せて、使ってないBoseの小型アクティブスピーカをAirPlayスピーカとして生き返らせよう、という細工の話。

これまで何回かやってきたけど、前回まででは何も作っていない。DACも仕様を調べただけだし、shairport-syncもとりあえず動かしただけ。今日からはphysicalに基板を半田付けしてスピーカに繋がるようにする....

5  ハードウェアを整備する

5.1  PCM5102周りの回路

ということで、最初に見つけた秋月のPCM5102を2.54ピッチにする基板と、Raspberry Piの上に乗せられる小さなユニバーサル基板、それからやっぱり秋月で2.54ピッチ基板に乗せたミニジャックなんかを手配した。

半田付けする前に、まず、PCM5102まわりの回路図を描き直そう(データシートにはなぜか天地逆で描いてあってすごく見づらい)。最近目がしょぼいのと集中力が落ちてるのですぐ半田付けを間違う。
1122connction.png
ミュートのXSMTはGPIOに繋いでおいて、ソフトウェア的にミュートできるようにしよう。

アナログとチャージポンプの電源はRaspberry Piの5Vから3端子レギュレータで作ろう。これはいくらなんでも描くまでもないだろう。アナログはチャージポンプ含めて最高でも32mAしか食わないので3.3V50mAクラスの3端子で十分である。しかし3.3Vのレギュレータなんて持ってないや。このためだけに買うのももったいないなあ。どこかに転がってないかな。

5.1.1  半田付け作業

基板を半田付けしてRaspberry Piの上に乗せた。こんなの。
1122boardonpi.jpg
ほぼ回路図通りに部品が並んでるのがわかる。

3.3Vの3端子レギュレータは部品箱の中を探してもなかった(買った覚えもないけど)ので、結局別途手配した。もったいない。1本だけ買うのもバカみたいなので10本買ったけど、他に使い道はたぶんない。この際なのでアナログだけでなくデジタルも5Vから3.3Vに落として入れることにした。

また、アナログのグランドはデジタルグランドに対してチップ内部で浮いているはずはないだろう、と思って外では繋がなかった。こういう場合普通どうするんだろう。

5.1.2  ちょっとしたハマり

たしかテストトーンを鳴らすユーティリティがあったな、と思ったんだけど見つからなくて(speaker-testというそのままの名前のユーティリティがあることをついさっき知った)、I2Sのドライバを確認する時に作ったファイルをaplayで鳴らしてみた。
$ aplay -D hw:1,0 t440.wav
t440.wavというのがMathematicaで作った16ビットステレオ44.1kHzサンプルのフルスイングの正弦波のファイル。これに小さなプリアンプをつないでみると、ひどい音で鳴った。そもそも440Hzではなくてたぶんオクターブ低いし、正弦波に聞こえない。

普通の音楽ファイルを鳴らしてみると、やはりすごいノイズでぼんやりとオクターブ下がった音楽が聞こえてきた。どこか間違ったかな、とくにチャージポンプ周りが心配だな、と思って配線をチェックしたり、電位を確認したりした。チャージポンプってデータクロックが入らないと動かない(VNEGが0Vのまま)ということを知った。まあ、それはそうかな。

でも間違いは見つからなかった。ひょっとすると何かの拍子にPCM5102本体を壊してしまったか、と思ってしょうがないのでこれだけ手配し直した。

配達されてきた新しいPCM5102をいきなりハンダ付する前に、小さなブレッドボードで確認してみたら、驚くなかれ現象は全く同じだった。ということはRaspberry Pi側か、これを壊すと言ってどうやったらI2Sの部分だけ壊れるんだ?それともソフトが問題なのか?といろいろ見直したんだけど、よくわからない。

しょうがないので、また会社に持って行ってオシロで当たってみた。クロックが入っても-3.3Vはかなり汚いこともわかった。やはりチャージポンプに使うコンデンサの選定は注意が必要だった。でもそれは今の現象とは関係なさそうである。

そしてt440.wavはステレオだけど右左同じデータにしたのに、ワードクロックのLow、Highでパターンが違って見える。そんなはずはない。

そこまできて、ふと思いついた。ミュートをGPIOでオンオフするように作ったんだけど、GPIOは最近使い慣れてるpigpioを無批判に使っていた。pigpioはmmap経由でBCM2835のレジスタを直接叩いているけど、タイミングをとるためにハードウェアPWMを自分のために占有してしまう。ひょっとしてI2Sがクロック制御に同じハードウェアを使っていると衝突することになる。

pigpioをやめてsysfs経由の手動でミュートに接続したピンを上げて、音を鳴らしてみた。なんとちゃんとした音で出た。

あ〜あ、こんなところだとは思いもつかなかった。秋月からたくさんPCM5102基板を買ってしまった。バカみたい。

5.2  電源制御

そこまではいいとして、当初目的に従って、ソフトウェア的にスピーカの電源とRaspberry Pi本体の電源を制御できるようにしたい。

よくあるパターンだけどこういうのを外付けしよう。
1122powercontrol.png
薄枠で囲ったのはリレーで、点線で囲ってあるのはデジトラ。左下のリレーは最初切れていて(NC側)、左のプッシュボタンを押すとRaspberry Piに5Vが入ってブートする。ブートしてUSBのドライバがロードされるとUSBの+5V給電線に電力が行くようになる。そうするとコンデンサがチャージされてトランジスタがオンしてリレーがNO側に入る。

Raspberry Piに5Vが入ってからUSB給電が行くまではプッシュボタンを押し続けていないと電源が切れてしまうので、R2を使って普段からコンデンサをチャージしておくことにする。プッシュボタンを押すとコレクタ電位が上がってベースに電流が流れてチャージが抜けていくけど、抜けきるまえにUSBが立ち上がるようなコンデンサ容量にしておけばいい。

スピーカ側はRaspberry Piが立ち上がらなければ電源は入らない。立ち上がればソフトウェア的に(おっと、pigpioは使わないようにしないと)100VACをオンするようにする。だからRaspberry PiのGPIOはデフォルトで入力状態のピンを使うようにする。

Raspberry PiをシャットダウンするとUSB給電がされなくなるのでコンデンサのチャージはまたトランジスタのベースから抜けていく。USB給電がオフしてから完全にシャットダウンするまでしばらくかかるので、その時間も含めてコンデンサC1の容量を決める必要がある。

USBのバスパワーを使うのはこないだの起動状態確認用LEDを作ったときのアイデア。簡単でいい。OSのバージョンによって動かなくなったりするかもしれないけど。

実は最初左下のトランジスタもデジトラを使おうと思っていた。ところが手元にあるデジトラでは$h_{fe}$大きなものがなくて、ベースが電流を食ってしまって大きなコンデンサが必要になることがわかった。

リレーのオン電流を$I_r$、トランジスタのベースエミッタ間電圧を$V_{be}$、Raspberry Piに電源が入ってからUSBのバスパワーが生きるまで、あるいはバスパワーが死んでからシャットダウンが終了するまでの時間のうち長いほうを$\tau_d$とすると、ざっくり \begin{align} I_r &< h_{fe}\frac{5-V_{be}}{R_1} \nonumber \\ \tau_d &< R_1 C_1 \nonumber \end{align}
であればいい。実際には電流はexponentialで減っていくので上の式の右辺は左辺よりも余計大きめでないといけない。厳密には上の式は
\begin{equation} I_r < h_{fe}\frac{5-V_{be}}{R_1}e^{-\tau_d/(R_1 C_1)} \nonumber \end{equation}
か。そこまでうるさく言わなくてもいいけど。

またR2、R3はどちらもコンデンサにラッシュしないようにするためのものなので適当でいい。

スピーカは結構電力を食うので、100VACを通すリレーの半田付けは気をつけてやらないといけない。とは言っても100Vで何Aも流れるわけではないので、何十年も使い続けるのでなければそれほど心配する必要はないだろう。

Raspberry Piに給電する5Vは、小型のスイッチングレギュレータを買った。100VをオンオフするのでACアダプタみたいなのではACプラグが邪魔になる。ということでRS-onlineで組み込み用のこんなの(pdf)を買った。これ、小さくて安いんだけど5Vで3AとれるのでPi 3の電源要件を満足する。もちろん安物のACアダプタの方がもっと安いんだけど、そういうのはたいてい本体からACプラグの電極が直接生えていて、組み込むには不便である。

そういえば、100Vをオンオフするような回路を作るのは電気工事士免許がいるんだっけ?僕は大学が電子工学科入学なので知識と技能はあるはずなんだけど、免許は持っていない。このまま作って100V入れると電気工事法違反で懲役または罰金か。
nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。