PCM5102 DAC Decoderを使ってハイレゾ音源の再生

MEMSマイクは、「SPH0645LM4H搭載 I2S MEMSマイクをRaspberry Pi 3に接続」でRaspberry Pi 3と接続しました。今回は、Raspberry Pi 3にI2Sのインタフェースを持つDAC「PCM5102 DAC Decoder 」を接続し、Pythonを使って、ハイレゾ音源を再生します。

PCM5102 DAC DecoderとRaspberry Pi 3の接続

使用するPCM5102 DAC Decoderを次に示します。ebayより購入しました。

PCM5102 DAC Decoder

PCM5102 DAC Decoderの仕様を次に示します。

  • 解像度24bitで192kHzサンプリングレート
  • 動作電圧 : 5 V
  • インタフェース:I2Sで動作するPCM5102A DACを使用
  • pHATフォーマットボード
  • ラインアウトステレオジャック

DAC DecoderにはPowerピン「VCC」「3.3V」「GND」の他に次の信号ピンがあります。

DAC Decoderの信号名
記号 信号名 説明
SCL SCK システムクロック入力端子 System clock input
DMP DEMP デエンファシス回路制御端子 De-emphasis control for 44.1kHz sampling rate(1): Off (Low) / On (High
XMT XSMT ソフトミュート制御端子
LCK LRCK オーディオデータワードクロック入力端子 ワードセレクトを示す左/右のクロック
DIN オーディオデータ入力端子
BCK オーディオデータビットクロック入力端子 データ転送を行うI2Sマスターからのデータクロック
FMT オーディオフォーマット選択端子 Audio format selection : I2S (Low) / Left justified (High)
FLT デジタル補間フィルター選択端子 Filter select : Normal latency (Low) / Low latency (High)

PCM5102 DAC DecoderとRaspberry Pi 3は、I2Sのインタフェースを使って次のように接続します。

DAC DecoderとRaspberry Pi 3の接続
DAC Decoder信号名 Raspberry Pi 3信号名
VCC 5V
GND GND
BCK GPIO18(PCM_CLK)
DIN GPIO21(PCM_DOUT)
LCK GPIO19(PCM_FS)
  • PCM5102 DAC Decoderの FMT、SCL、DMP、FLTは 10kΩでプルダウンします。
  • PCM5102 DAC Decoderの XMTは 10kΩで +3.3Vにプルアップします。
  • PCM5102 DAC Decoderの +3.3Vはラズパイとは接続しません。

PCM5102 DAC DecoderとRaspberry Pi 3を接続した画像を次に示します。

PCM5102 DAC DecoderとRaspberry Pi 3の接続

DAC Decoderの出力はイヤホーンにしました。持っているミニコンポをつないだところ音が飛びました。イヤホーンだと音が飛ばなくてそれなりの音になります。

PCM5102 DAC Decoderのセットアップ

すでにラズパイに含まれているHiFiBerry DACのドライバを流用します。次の手順でドライバの設定を使います。

device treeの設定のために「/boot/config.txt」を編集し、ピンの設定をI2Sにして、ドライバとマッピングをします。

dtoverlay=hifiberry-dac

Raspbianに含まれるドライバドライバをの設定するために、次のように、「/etc/modules」を編集して、起動時にドライバ「snd_soc_hifiberry_dac」 をロードするようにします。

snd_soc_hifiberry_dac

次のコマンドでドライバを確認します。

$ lsmod
Module                  Size  Used by
fuse                  106496  3
rfcomm                 49152  6
cmac                   16384  1
bnep                   20480  2
hci_uart               36864  1
btbcm                  16384  1 hci_uart
serdev                 20480  1 hci_uart
bluetooth             368640  29 hci_uart,bnep,btbcm,rfcomm
ecdh_generic           28672  1 bluetooth
brcmfmac              307200  0
brcmutil               16384  1 brcmfmac
spidev                 16384  0
cfg80211              573440  1 brcmfmac
rfkill                 28672  6 bluetooth,cfg80211
i2c_bcm2835            16384  0
spi_bcm2835            16384  0
snd_soc_bcm2835_i2s    16384  0
joydev                 20480  0
evdev                  24576  6
snd_soc_pcm5102a       16384  1
uio_pdrv_genirq        16384  0
uio                    20480  1 uio_pdrv_genirq
fixed                  16384  0
snd_soc_simple_card    16384  0
snd_soc_simple_card_utils    16384  1 snd_soc_simple_card
snd_soc_hifiberry_dac    16384  0
snd_soc_core          188416  5 snd_soc_simple_card_utils,snd_soc_bcm2835_i2s,snd_soc_hifiberry_dac,snd_soc_pcm5102a,snd_soc_simple_card
snd_compress           20480  1 snd_soc_core
snd_pcm_dmaengine      16384  1 snd_soc_core
my_loader              16384  0
snd_bcm2835            32768  0
snd_pcm                98304  5 snd_pcm_dmaengine,snd_soc_bcm2835_i2s,snd_bcm2835,snd_soc_core,snd_soc_hifiberry_dac
snd_timer              32768  1 snd_pcm
snd                    69632  5 snd_compress,snd_timer,snd_bcm2835,snd_soc_core,snd_pcm
i2c_dev                16384  0
ip_tables              24576  0
x_tables               32768  1 ip_tables
ipv6                  434176  29

次に、PCM5102 DAC Decoderの優先度を次のコマンドで確認します。数字が小さい方が優先度高いので、もし、PCM5102 DAC Decoder「snd_soc_hifiberry_dac」の優先順位が低い場合、「Raspberry Pi 3にUSB DACの接続」に従って設定を変更します。

$ cat /proc/asound/modules
 0 snd_soc_hifiberry_dac
 1 snd_bcm2835

次のコマンドでサウンドデバイスが card0、デバイス0に割り当てらていることを確認します。

$ aplay -l
**** ハードウェアデバイス PLAYBACK のリスト ****
カード 0: sndrpihifiberry [snd_rpi_hifiberry_dac], デバイス 0: HifiBerry DAC HiFi pcm5102a-hifi-0 []
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
カード 1: ALSA [bcm2835 ALSA], デバイス 0: bcm2835 ALSA [bcm2835 ALSA]
  サブデバイス: 7/7
  サブデバイス #0: subdevice #0
  サブデバイス #1: subdevice #1
  サブデバイス #2: subdevice #2
  サブデバイス #3: subdevice #3
  サブデバイス #4: subdevice #4
  サブデバイス #5: subdevice #5
  サブデバイス #6: subdevice #6
カード 1: ALSA [bcm2835 ALSA], デバイス 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

次のコマンドでcard1を指定して音を再生します。waveファイル「1000hz.wav」は「SPH0645LM4H搭載 I2S MEMSマイクを使ってRaspberry Pi 3で録音」の「Waveファイルの作成」で1000hzのwaveファイルを作りました。

 $ aplay -D plughw:0,0 1000hz.wav
再生中 WAVE '1000hz.wav' : Signed 16 bit Little Endian, レート 44100 Hz, モノラ ル

DAC Decoderプログラムの作成

音楽再生コマンド「aplay」をPythonからsubprocessにより起動するプログラムを次に示します。 waveファイル「sound_24bit192kHz.wav」は、解像度24bitで192kHzサンプリングレートのハイレゾ音源です。

#-*- cording: utf-8 -*-

import subprocess

subprocess.call("aplay -D plughw:0,0 sound_24bit192kHz.wav", shell=True)

DAC Decoderプログラムの実行

次のコマンドでハイレゾのwaveファイル「sound_24bit192kHz.wav」を再生します。イヤホーンから音が再生されます。

$ python3 dac.py
再生中 WAVE 'sound_24bit192kHz.wav' : Signed 24 bit Little Endian in 3bytes, レ ート 192000 Hz, ステレオ