TI社PCM5122を用いたI2S I/F DACをブレッドボード上に組み、BBBで鳴らすことができたので記録を残すことにする。
I2S I/FのDACとの接続に関する情報はRaspberry Piの方が豊富でBBB関連では限られている。
調べた限りではBBBで使用できそうなI2S Audio Driverは二つある。
一つはBBB向けというよりはBBBのSoCを用いたAM335X EVM用の以下のAudio Driverを用いる方法。
AM335x Audio Driver’s Guide
この方法はTIの純正ドライバを用いるのだが、簡単には試せそうになく早々に諦めた。
もう一つの方法は以下のサイトで公開されているbotic driverを用いる方法。
BeagleBone Black with I2S, DSD and SPDIF interface
こちらは良く整備されていてSDカードのディスクイメージをSDカードに焼くだけで試せるようだ。
ただ、その前にI2S I/F DACを用意する必要がある。
I2S I/F DACは海外サイトで販売しているところもあるが、今回は自作を試みる。
使用するDACはPCM5122とする。
PCM5122はI2S I/Fを持つTI社の32bit DACである。
選定理由は入手しやすいこと、インターネット上でRaspberry Pi用としての作例が比較的多い事と、機能の豊富さが気に入ったからだ。
PCM5122にはハードウェアモードとソフトウェアモードがあり、ソフトウェアモードにはSPIモードとI2Cモードがある。
多くの機能を用いる為にはソフトウェアモードを選択する必要があるのでより簡単に接続できるI2Cモードを選ぶ事とする。
PCM5122のデータシートは以下。
http://www.ti.com/lit/ds/symlink/pcm5122.pdf
以下に今回試作した回路図を示す。
部品表は以下。
記号 | 型番 | 仕様/諸元等 | 定数等 | 数量 | 入手先 |
C1,C2,C3,C4, C12,C15,C16 |
– | チップ積層セラミックコンデンサ | 0.1μF | 7 | 秋月電子 |
C5,C7 | – | ケミカル電界コンデンサ | 470μF | 2 | 秋月電子 |
C6,C8 | – | 導電性高分子アルミ固体電解コンデンサ | 330μF | 2 | 秋月電子 |
C9 | – | ラジアルリード積層セラミックコンデンサ | 0.1μF | 1 | 秋月電子 |
C10,C11 | – | ラジアルリード積層セラミックコンデンサ | 0.2μF | 2 | 秋月電子 |
C13 | – | ケミカル電界コンデンサ | 10μF | 1 | 秋月電子 |
C14 | – | ケミカル電界コンデンサ | 10μF | 1 | 秋月電子 |
C17,C18 | – | ポリエステルフィルムコンデンサ | 2.2nF | 2 | 秋月電子 |
R1,R2,R3 | – | アキシャルリードカーボン抵抗(1/4W) | 10Ω | 3 | 秋月電子 |
R4,R5,R7,R8 | – | アキシャルリードカーボン抵抗(1/4W) | 5.6KΩ | 4 | 秋月電子 |
R9,R10 | – | 金属皮膜抵抗(1/4W) | 470Ω | 2 | 秋月電子 |
U1,U2 | NJM2863F33 | ローノイズ低飽和型レギュレータ | 3.3V100mA | 2 | 秋月電子 |
U3 | PCM5122 | オーディオ・ステレオ DAC | – | 1 | RSオンライン |
– | D028 | 28ピンICピッチ/DIP変換基板 | – | 1 | マルツパーツ館 |
– | – | SOT23/DIP変換基板 金フラッシュ | – | 2 | 秋月電子 |
– | – | 3.5mmステレオミニジャックDIP化キット | – | 1 | 秋月電子 |
– | EIC-801 | ブレッドボード | – | 1 | 秋月電子 |
– | – | 細ピンヘッダ | – | – | 秋月電子 |
– | – | ブレッドボード用線材 | – | – | – |
電源回り以外はほぼリファレンス通りとしている。
I2Cモードは4本のGPIOが電源オンリセットで全て入力となるので端子処理が必要だ。
GPIOでLED等のコントロールを行えば色々な情報と同期させる事ができ見た目綺麗であるが、今回は使用しないので全てプルダウンすることとする。
PCM5122の電源はデジタル、アナログ、チャージポンプの三系統。
デジタル電源はBBBのDC_3.3Vから直接とる。
独立した電源を用意した方がノイズ対策的には良いのだろうが、BBBのVDD3.3とPCM5122のDVDDとの間で起動時/電源断時に電位差が 生じた場合、BBB/PCM5122双方の端子にVDDを超える電圧が残り、ダメージを与える可能性が否定できない。
今回は安全サイドに振る。
アナログ電源とチャージポンプの電源はそれぞれ独立させる事とする。
チャージポンプはノイズ源であるので、アナログ電源とは分離する方が良いだろう。
これら二つの電源には大きな容量のコンデンサを付けるので電源断後すぐに再電源投入してしまうとデジタル電源は抜けるがアナログ電源と チャージポンプ電源の電荷が抜けずに不良リセットとなる可能性がある。
再電源投入はコンデンサ放電までの時間を空ける必要があるが運用でカバーする。
3.3VレギュレータはNJM2863F33を用いる。
表面実装部品であるのでブレッドボードで用いる為には変換基板と細ピンヘッダが必要であるが全て秋月で揃える事ができる。
作例ではSOT23/DIP変換基板上にチップコンデンサの実装及び配線を行い3V3POWER_DBとしたドータボードを2個作成して用いている。
このドータボードをブレッドボードの中心に配置すると上半分を入力電源、下半分を出力電源とすることができ、取り回しが楽になるので好んで用いている。
2番と5番の短絡にはブレッドボード用の配線の足を適当に切って使用している。
変換基板の方に予備ハンダを行い、ネオバンの和紙ばんそうこうで配線を立たせた状態で仮止めして上からピンセットで押さえながらハンダ付けすると良い。
ブレッドボード用の配線の被膜は耐熱ではないので手早く行う必要がある。
PCM5122はTSSOP28ピンパッケージであるので同じく変換基板が必要となる。
TSSOP28ピン用の変換基板というのは意外と少なく、同じ0.65mmピッチの28ピンSSOP用変換基板で左右のランド間が短いものを選択する。
ダイセン電子工業のD028というものが入手性が良さそうだ。
私はマルツパーツ館で購入した。
28ピンSSOPのハンダ付けは位置合わせがうまくいけばそれほど難しいものではない。
前述の和紙ばんそうこうを細長く切りICの仮止め/位置の微調整を行い、ハンダで仮止めを行った後、網線でハンダブリッジを無くすよう調整してゆく。
とはいえ最近老眼だけなく白内障も進んでいる為、ルーペで見ても良く判らない。
カンでハンダ付けして付いているハズと信じて、隣り合うピンで短絡していなければ問題ないとしている。
作例ではD028基板上にC9~C13,C15,C16を実装している。
これはノイズ対策というよりもブレッドボード上で組む都合上。
音質は音が鳴ってから考える。
電源基板とDAC基板ができれば後はブレッドボード上に配置すれば完成となる。
LPF用のCR(C17,C18,R9,R10)と3.5mmステレオミニジャックDIP化基板は別のブレッドボード上に配置した。
C17,C18はルビコンのポリエステルフィルムコンデンサを使用している。
LPFはカットオフ周波数の絶対値よりも左右のバランスを気にするべきなので、マルチメータで計測して近い数値のものを選別して使用すると良い。
次にbotic demo用のmicro SDカードを作成する。
母艦(ゲストOS)上で作業を行う。
適当なmicro SDカードを母艦(ゲストOS)に認識させる。
以下はmicro SDが/dev/sdbとして認識されている場合の例。
botic demoのイメージを取得しmicro SDに焼きこむ。
すごく時間がかかる。
temp-host@temp-host:~$ mkdir botic_demo temp-host@temp-host:~$ cd botic_demo temp-host@temp-host:~/botic_demo$ wget http://bbb.ieero.com/botic3/bbb-demo-botic-v3-2gb.img.gz --2015-01-05 22:44:40-- http://bbb.ieero.com/botic3/bbb-demo-botic-v3-2gb.img.gz bbb.ieero.com (bbb.ieero.com) をDNSに問いあわせています... 74.220.219.62 bbb.ieero.com (bbb.ieero.com)|74.220.219.62|:80 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 163338160 (156M) [application/x-gzip] `bbb-demo-botic-v3-2gb.img.gz' に保存中 100%[======================================>] 163,338,160 5.23MB/s 時間 36s 2015-01-05 22:45:16 (4.38 MB/s) - `bbb-demo-botic-v3-2gb.img.gz' へ保存完了 [163338160/163338160] temp-host@temp-host:~/botic_demo$ gzip -d ./bbb-demo-botic-v3-2gb.img.gz temp-host@temp-host:~/botic_demo$ sudo dd if=bbb-demo-botic-v3-2gb.img of=/dev/sdb [sudo] password for temp-host: 3481600+0 レコード入力 3481600+0 レコード出力 1782579200 バイト (1.8 GB) コピーされました、 5244.38 秒、 340 kB/秒 temp-host@temp-host:~/botic_demo$
取り急ぎ立ち上げてみる。
母艦(ゲストOS)からmicro SDを取り外し、BBBにセットして起動を行う。
コンソールはWindows8.1 ノートPCからUSBシリアルTTLケーブルを介し、TeraTermでシリアル接続で行う。
115200bps 8bit; non parity; stop bit 1; フロー制御なし。
U-Boot SPL 2014.04-00015-gb4422bd (Apr 22 2014 - 13:24:29) reading args spl_load_image_fat_os: error reading image args, err - -1 reading u-boot.img reading u-boot.img U-Boot 2014.04-00015-gb4422bd (Apr 22 2014 - 13:24:29) I2C: ready DRAM: 512 MiB NAND: 0 MiB MMC: OMAP SD/MMC: 0, OMAP SD/MMC: 1 *** Warning - readenv() failed, using default environment Net: not set. Validating first E-fuse MAC cpsw, usb_ether Hit any key to stop autoboot: 0 gpio: pin 53 (gpio 53) value is 1 mmc0 is current device gpio: pin 54 (gpio 54) value is 1 SD/MMC found on device 0 reading uEnv.txt 824 bytes read in 4 ms (201.2 KiB/s) gpio: pin 55 (gpio 55) value is 1 Loaded environment from uEnv.txt Importing environment from mmc ... Checking if uenvcmd is set ... gpio: pin 56 (gpio 56) value is 1 Running uenvcmd ... reading zImage 3186872 bytes read in 249 ms (12.2 MiB/s) reading initrd.img ** Unable to read file initrd.img ** reading /dtbs/am335x-boneblack-botic.dtb 30402 bytes read in 11 ms (2.6 MiB/s) Kernel image @ 0x82000000 [ 0x000000 - 0x30a0b8 ] ## Flattened Device Tree blob at 88000000 Booting using the fdt blob at 0x88000000 Loading Ramdisk to 9f31f000, end 9f6290b8 ... OK Using Device Tree in place at 88000000, end 8800a6c1 Starting kernel ... [ 0.185749] omap_init_mbox: hwmod doesn't have valid attrs [ 0.260908] Initramfs unpacking failed: junk in compressed archive [ 0.383046] musb-hdrc musb-hdrc.0.auto: Failed to request rx1. [ 0.389256] musb-hdrc musb-hdrc.0.auto: musb_init_controller failed with status -517 [ 0.422929] musb-hdrc musb-hdrc.1.auto: Failed to request rx1. [ 0.429113] musb-hdrc musb-hdrc.1.auto: musb_init_controller failed with status -517 [ 0.525990] davinci-botic botic: ASoC: CODEC (null) not registered [ 0.533594] davinci-botic botic: snd_soc_register_card failed (-517) [ 0.546587] omap_voltage_late_init: Voltage driver support not added [ 0.553784] cpu cpu0: cpu0 regulator not ready, retry [ 0.563911] slave hdmi: could not get i2c [ 1.166926] usb 2-1: device v0411 p01a2 is not supported systemd-fsck[75]: rootfs: clean, 34759/102752 files, 117596/410368 blocks [ 5.181938] libphy: PHY 4a101000.mdio:01 not found [ 5.187072] net eth0: phy 4a101000.mdio:01 not found on slave 1 Debian GNU/Linux 7 bbb ttyO0 default username:password are [debian:botic] and [root:botic] The IP Address for usb0 is: 192.168.7.2 bbb login: debian
default username:password are [debian:botic] and [root:botic]とのこと。
ログインする。
bbb login: debian Password: Linux bbb 3.16.1-botic3 #1 PREEMPT Thu Aug 28 01:44:57 CEST 2014 armv7l The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. debian@bbb:~$
起動確認ができたので一旦電源を落とす。
debian@bbb:~$ sudo shutdown -h now
BBBとDACとの接続は以下の通り。
I2S_LRCK:P9_29 I2S_DIN:P9_30 I2S_BCK:P9_31 I2S_SCK:P9_25 I2C_SCK:P9_18 I2C_SDA:P9_17 SYS_5V(CP):P9_7 SYS_5V(A):P9_8 VDD3.3(D):P9_3 GND(CP):P9_1 GND(A):P9_45 GND(D):P9_2
P9の方しか使用しないのでP8はテープでマスクする方が誤操作除けになって良い。
PCM5122は2.1Vrmsで出力で、イヤホン程度ならば直接駆動できる。
再度BBBの起動を行う。
起動後rootで操作を行う。
debian@bbb:~$ sudo -s [sudo] password for debian: root@bbb:
先ずはI2Cデバイスの確認を行う。
root@bbb:/home/debian# i2cdetect -r -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- UU UU -- -- 4c -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- root@bbb:/home/debian#
0x4cとして認識されいる。
もっとも、SCKを結線しているので特にI2Cで設定を行わなくてもデフォルトで音が鳴るはず。
boticドライバの設定はDSD switchとserconfigは本来あるべき値に設定するべきであるが、とりあえずデフォルトのままとする。
botic demoに含まれる音源サンプルの再生を試みる。
root@bbb:/home/debian# play /data/test/test_96k_24b.flac /data/test/test_96k_24b.flac: File Size: 4.96M Bit Rate: 2.41M Encoding: FLAC Info: Processed by SoX Channels: 2 @ 24-bit Samplerate: 96000Hz Replaygain: off Duration: 00:00:16.50 In:100% 00:00:16.50 [00:00:00.00] Out:1.58M [ =====|======] Hd:0.1 Clip:0 Done. root@bbb:/home/debian# play /data/test/test_44k1_16b.flac /data/test/test_44k1_16b.flac: File Size: 1.46M Bit Rate: 707k Encoding: FLAC Info: Processed by SoX Channels: 2 @ 16-bit Samplerate: 44100Hz Replaygain: off Duration: 00:00:16.50 In:100% 00:00:16.50 [00:00:00.00] Out:792k [ =====|======] Hd:0.1 Clip:0 Done. root@bbb:/home/debian# play /data/test/test_48k_16b.flac /data/test/test_48k_16b.flac: File Size: 1.52M Bit Rate: 738k Encoding: FLAC Info: Processed by SoX Channels: 2 @ 16-bit Samplerate: 48000Hz Replaygain: off Duration: 00:00:16.50 In:100% 00:00:16.50 [00:00:00.00] Out:792k [ | ] Hd:0.1 Clip:0 Done. root@bbb:/home/debian# play /data/test/8in8_-_05_-_Ill_Be_My_Mirror.mp3 /data/test/8in8_-_05_-_Ill_Be_My_Mirror.mp3: File Size: 5.65M Bit Rate: 239k Encoding: MPEG audio Info: 2011-12-21T12:11:15 Channels: 2 @ 16-bit Track: 5 Samplerate: 44100Hz Album: Nighty Night Replaygain: off Artist: 8in8 Duration: 00:03:09.30 Title: I'll Be My Mirror In:100% 00:03:09.30 [00:00:00.00] Out:9.09M [ | ] Clip:8 play WARN rate: rate clipped 4 samples; decrease volume? play WARN dither: dither clipped 4 samples; decrease volume? Done. root@bbb:/home/debian# play /data/test/
特に問題無く音が鳴動した。
44.1KHzサンプルである場合は、48KHzの倍数でリサンプリングされ再生される。
私には音質を語ることはできないが、気になるノイズや再生の開始・停止時のポップノイズは全くなく満足してしまった。
とはいえ、botic demoの環境ではWiFiが使用できない等、自分の環境では許容できない問題があるのでkernelの再構築が必要だ。
その前に、折角I2Cモードで接続しているので、次回I2Cで設定変更を試みる事とする。