脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

ラズベリーパイの音声をDAC(pcm5102a)でI2S出力する

普段音声出力はRaspberryPi3のオーディオジャック(アナログ出力)から行っていますが、DACを介すことでI2S出力(デジタル出力)に変更する方法です
f:id:portaltan:20171122154620j:plain

I2S

I2Cじゃありません. Inter IC SoundでI2Sです
4本(または3本)の信号線でステレオ音声をシリアル伝送する規格

名前 rasPiのpin No. 説明
BCK(BCLK) 12 ・bit clock
・serial clock(SCLK)とも呼ばれる
LRCK(LRCLK) 35 ・Left Right Clock
・ステレオにおいて、LチャネルとRチャネルを区別するための信号
DATA 40 ・PCM Data
・serial data
・デジタル化された音声データのビット列
MCK - ・Master Clock
・ラズパイのGPIOからは出力されていない
・ICによっては上記3信号と同期するように自動で調整してくれるものもあり、その場合は不要
  (今回使うPCM5102AもBCKから生成してくれるので不要)
・System Clock(SYSCLK)とも呼ばれる

Inter-IC Sound - Wikipedia

DAC

Degital Analog Converter
ラズパイからI2Sで出力したデジタル信号をスピーカーやヘッドフォンで使えるアナログ信号に変換するもの
今回はPCM5102AというDACチップを利用します
デジタル-アナログ変換回路 - Wikipedia

使ったもの

世の中には既に全て実装済みのDACボードがありますが、今回はチップを買って全てブレッドボード上に1から組み上げます

item 買ったところ 個数
IC&変換基板 http://akizukidenshi.com/catalog/g/gK-11836/ 1
ブレッドボード http://akizukidenshi.com/catalog/g/gP-00315/ 1
ブレッドボード用電源モジュール https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-4RAW 1
抵抗(47Ω) http://akizukidenshi.com/catalog/g/gR-25470/ 3
抵抗(470Ω) http://akizukidenshi.com/catalog/g/gR-25471/ 2
コンデンサ(2.2nF) http://akizukidenshi.com/catalog/g/gP-07686/ 2
コンデンサ(0.1μF) http://akizukidenshi.com/catalog/g/gP-10147/ 4
コンデンサ(2.2μF) http://akizukidenshi.com/catalog/g/gP-08152/ 2
コンデンサ(10μF) http://akizukidenshi.com/catalog/g/gP-04621/ 4

回路図

公式ページのデータシートに回路図例があるので、その通りに組み込みます
http://www.tij.co.jp/jp/lit/ds/symlink/pcm5102a.pdf
f:id:portaltan:20171122161633p:plain
注意する点としては

  • GNDに落とすところはグランドバウンス対策で47Ω抵抗をはさんでいる
  • SCK(MCK)は今回ラズパイからとれないので、GNDに落とすことでpcm5102AがBCKから生成してくれる
  • ブレッドボード電源モジュールは3.3Vで使用
  • 上記のデータシートの回路図はなぜかICチップ逆になっているので注意

f:id:portaltan:20171122162404p:plain

ケーブル接続

次にラズパイと上記DACセットを接続する
I2Sは普通に調べても表記されていないことが多く、以下のサイトがわかりやすいです
https://bluefish.orz.hm/sdoc/raspi_i2sout.html

ソフトウェア側設定

ハードのほうの組み込みが完了したら、次はラズベリーパイ側の設定を行っていきます
pcm5102Aのドライバはデフォルトでラズベリーパイにインストールされている(/boot/overlays/以下で確認できるか)ので、利用するための記述のみ行います
ドライバのマッピング

sudo vi /boot/config
### 以下の1行を末尾に追加
dtoverlay=hifiberry-dac

ドライバのロード
起動時にドライバをロードするように設定する

sudo vi /etc/modules
### 以下の1行を末尾に追加
snd_soc_hifiberry_dac

上記の設定が済んだら一度再起動する

確認
以下のようにドライバ変更が反映されていたらOK

$ lsmod | grep dac
    snd_soc_hifiberry_dac     2511  0
    snd_soc_core          125885  3 snd_soc_bcm2835_i2s,snd_soc_hifiberry_dac,snd_soc_pcm5102a
    snd_pcm                75698  4 snd_bcm2835,snd_soc_core,snd_soc_hifiberry_dac,snd_pcm_dmaengine

$ aplay -l
    **** List of PLAYBACK Hardware Devices ****
    card 0: sndrpihifiberry [snd_rpi_hifiberry_dac], device 0: HifiBerry DAC HiFi pcm5102a-hifi-0 []
      Subdevices: 1/1
      Subdevice #0: subdevice #0
    card 1: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
        .
        .
    card 1: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
        .
        .

DACがcard0のdevice0に割り当てられていることが確認できる

音声出力確認

wavファイルで確認
注意点として、この構成ではモノラルの音源は再生できず、再生しようとすると以下のようなエラーになってしまう

$ aplay -D hw:0,0 /usr/share/sounds/alsa/Noise.wav
    Playing WAVE '/usr/share/sounds/alsa/Noise.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono
    aplay: set_params:1239: Channels count non available

なので適当にフリーの音源サイトからwavファイルをダウンロードしてきてそれを再生する

$ aplay -D hw:0,0 /home/pi/fanfare.wav
    Playing WAVE '/home/pi/fanfare.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo

mp3で確認
mp3で確認する場合はmpg321等を利用する

$ mpg321 #{mp3file}

環境によってはエラーが出るが、sudoで実行するとうまくいくことがある

以上で完了。想像以上にてこずった。

ケーブルを整理してラズパイから給電に変更したもの

f:id:portaltan:20171229165755j:plain