FPGA内蔵のフルデジタルヘッドホンアンプを作る
構想
よくあるオーディオシステムでは、PCM信号からDACでアナログ信号を出力し、そのアナログ信号をパワーアンプで増幅して、スピーカで音に変換します。この方式では、パワーアンプはその方式(D級やA級など)にかかわらず、入力と出力のみに注目すれば、アナログ信号からアナログ信号へと増幅を行います。
ここで、パワーアンプの入力をデジタルにすれば、面倒なアナログ回路設計の手間を極力減らし、ディスクリート部品の削減などのメリットがあるのではないかと考えました。パワーアンプがDACを兼ねるとも表現できます。
この方式は、僕が思い付くぐらいなのでとっくに製品化されているだろうと調べたら、やっぱりありました。この方式は一般的にはフルデジタルアンプとよばれているようで、様々なアンプやチップが手に入るようです。また、1bitアンプなるものも製品として存在するようですが、それに関してはおそらくフルデジタルではなく、通常のD級アンプの一種に分類できると思います。
今回作りたいのは、PCでもスマホでも、PlayMusicでもニコニコ動画でも使える、PCM(デジタル)入力のヘッドホンアンプです。ただし、既にあるようなものを作ってもあまり面白くないので、FPGAを使ってフルデジタルで作ろうと思います。
目標・仕様
- 入力はUSB&Bluetooth (& 内蔵マイク1ch)
- WindowsやiPhoneなどから特殊なドライバなしで使える
- 給電はUSBから
- 出力は3.5mmイヤホンジャックのみ
- フルデジタルアンプ
- モバイル用途のために、それなりに小型
- 可能な限りの原音再生を目指すが、筆者(tamapochi1)の好みによってはその限りではない
一言
なんでこんなもん作ろうと考えたかというと、今使っている iPhone 6s にそろそろ限界を感じ、iPhone の買い替えを検討し始めたからです。ご存知のように、iPhone 7 からはイヤホンジャックがありません。どうせ何かしらのDACを買うのなら…ということで自分で作ることにしました。
ZYNQ の ARM で math.h を使うときの注意
困ったこと
ZYNQ 上の ARMコア で実行するためのソフトウエアを Xilinx SDK で開発していた時、cosf 関数を含むとコンパイルでエラーになる。
#include <math.h> float window[256]; int main() { int i; for(i = 0; i < 256; i++) { window[i] = 0.54f - 0.46f * cosf(2.f * (float)M_PI * (float)i / 255.f); } }
原因
Xilinx のサポート によると、-m オプションを C/C++ Build 設定のライブラリに追加する必要があるらしい。
Project Explorer の[プロジェクト名]で右クリック → Properties → C/C++ Build → Settings → ARM v7 gcc linker → Libraries → Addボタンを押して m
を追加
一言
cosf 関数の引数が定数のみの場合、コンパイル自体は通ってしまう。これで3時間詰んだ。
PCBGOGO.JPを使ってみる
PCBGOGO.JPとは
日本国内のプリント基板製造サービスは(工場は海外でも)一回の発注で最低3万円くらいはかかります。学生の身としては、趣味で使うには高すぎます。
そこで登場するのがやはり中国です。今では様々な中華企業がPCB製造サービスを運営しており、価格は国内の10分の1くらい(送料込み)と破格です。PCBGOGO.JPは、最近登場した日本語完全対応のサービスです。比較的評判が良いようなので、使ってみることにしました。
入稿に必要なファイル
ガーバーデータの形式はRS-274-Xである必要があります。KiCadの場合はデフォルトのままで良いみたいです。
- 表面導体パターン
- 表面レジストマスク
- 表面シルク
- 裏面導体パターン
- 裏面レジストマスク
- 裏面シルク
- 基板外形
- ドリルファイル
これらのファイルをZIPにまとめて入稿しました。
※勘違いして違う形式で入稿してしまいましたが、向こうがデータの変換をサービスをやってくれ、変換後のデータの確認メールが届きました。毎回無料でやってくれるかは不明です。
完成まで
自動見積もり
↓
データ入稿
↓ [1日] エンジニアがガーバーデータを確認。不備等があれば連絡が来る。
入金(Paypal)
↓
製造
↓ [4日]
配送
↓ [5日]
到着
製造は2~3日コースを選択しましたが、ちょうど中国の大型連休のあとだったせいか発送まで少し長めに時間がかかりました。
配送方法はEMSを選択しました。なんせ私の住んでいる地域は、DHLやFedExでは遠隔地なんとかで送料に加えて3000円くらいかかるので…
完成品
表 48x26 mm
裏
思っていたよりシルクの印刷はきれいで、普通に使えると思いました。微妙に裏面のパターンがずれているような気がしますが、ランド径0.8mm/ドリル径0.4mmでは大丈夫でしょう。
ちなみに箱は…
ご覧の通りバッキバキになっていました。箱の中身も、もはや意味があるのかよくわからない梱包材の破片とただの袋に入った基板のみでした。私はあまり気にしないので大丈夫ですが、不安な方は国内のサービスを使ったほうが安心だと思います。
まとめ
他のサービスをあまり使ったことがないので比較はできませんが、価格の割にはよくできていると思います。梱包が雑であったり、レジストに微妙にキズが入っていたり、不安な点はいくつかありますが価格を考えると納得できます。
日本語で対応してくれるのも地味にありがたいです。少し日本語がおかしい事がありますが、何度かメールで問い合わせをした際、親切に対応してくれたので好感が持てました。今後も使ってみようと思います。
超音波送受信テスト回路
37個の超音波発振子(スピーカ)のアレイをいきなり作る勇気がなかったので、超音波送信部と受信部一つづつのテスト回路を組むことにしました。
超音波送信回路
37個のスピーカの制御には MAX10 FPGA を使用する予定ですが、FPGA の I/O端子に直接スピーカを接続しただけでは明らかにパワー不足です。そこで、0/+3.3 V のディジタル信号を -12/+12 V に変換します。
LV8548MC はモータドライバICです。単なるバッファではなく、モータ制御用のロジックが入っているので、OUT1 と OUT2 を同時に H出力にすることはできません。今回はそれでも問題ないので、価格の安さや実装面積の小ささなどの理由でこのICを使用します。
74VHC540 は CMOS 3ステートバッファです。この回路ではただのNOTゲートとして使っています。
超音波受信回路
SPH0641LU4H-1 はデジタルPDM出力のマイクです。ちゃんと超音波帯域にも対応しています。PDM出力なので、そのままFPGAに接続することができます。
出力された1ビットのPDM信号は、FPGAでバンドパスフィルタをかけると使えるはずです。
PCB設計
KiCadでPCBを設計します。
SPH0641LU4H-1 は Zero-Height Mic™という技術を使ったマイクで、音を取り入れる穴がパッケージの底にあります。そのため、マイクだけは基板の裏側に実装することになります。
PCBの製造発注
最近 PCBGOGO.JPという格安中華PCBメーカが巷で話題になっているので、試しに発注してみることにしました。
用意したファイルは
- 表面パターン
- 表面レジストマスク
- 表面シルク
- 裏面パターン
- 裏面レジストマスク
- 裏面シルク
- 基板外形
- ドリルファイル
これをZIPにまとめて入稿しています。データのチェックができてからPayPalで支払いができるようになります。
裏面のシルクは印刷してくれるのかわかりませんが、取り敢えず入れておきました。
基板発注に関することは、別記事でまとめようと思います。