LoginSignup
1
4

More than 1 year has passed since last update.

Raspberry Pi, Jetson Nano向けオーディオ入出力ボードの作成(PCM5102A+PCM1808編)

Last updated at Posted at 2020-03-13

きっかけ

DACはよく見かけるが、ADCも載せたいわゆるコーデックボードは多くない。
数少ない中Microe社のAudio Codec Board-Protoという製品はあるようだ。
image.png

仕様は、
On-board modules

WM8731 Audio Codec, stereo 24-bit multi-bit sigma delta ADCs and DACs, Headphone and Microphone audio connectors
Key Features

Hi-Quality Audio Performance. Selectable ADC High Pass Filter. ADC and DAC Sampling Frequency: 8kHz – 96kHz
Interface I2C or SPI

とのことである。

回路図によると、Raspberry pi、およびJetson Nanoで対応しているI2S規格に対応しているのと、何らかの設定がI2C接続で行われるようだ。

Raspberry piではLinux組み込みドライバ WM8731で動作させた事例があるようだが、Jetson Nanoは調べても事例を簡単に見つけることができなかった。

まず、Jetson NanoではI2Cデバイスとして認識させることができなかった。
ラズパイは以下の通りI2Cアドレス0x1aで認識させることができた。

pi@pi3:~ $ sudo i2cdetect -r -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- UU -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

これをクリアしたとしてもJetson Nano上に認識させるためにデバイスツリーの再構築、ドライバーインストール、ALSAの設定が必要になりそう。ハードルが高い。

3つほど購入したが無駄に終わった。

両ボード向けに使えるI2S対応のオーディオボードがないので作ってみたい。

I2Sとは

そもそもI2Sの基本の構成はどういうものか。

https://hifiduino.wordpress.com/2014/11/13/raspberry-pi-b-digital-audio/
上記を参考にすると、
image.png
Serializerと書かれている右側に出ている、PCM_CLK,PCM_FS,PCM_DIN,PCM_DOUTの4本で構成されるらしい。
それに対応するRaspberry piの40ピンヘッダーは
image.png

つまり
PCM_CLK ⇔ BITCLOCK(12pin)
PCM_FS ⇔ LRCLOCK(35pin)
PCM_DIN ⇔ DATA OUT(40pin)
PCM_DOUT ⇔ DATA IN(38pin)
に接続すればいいらしい。

少し前に流行したI2S DACはI2Cの設定もなくPCM5102Aを使用したすごくシンプルな構成だった。

いろいろ探していると、BeagleBoneBlack向けのADCでPCM1808を組み合わせた回路図が出てきた。
http://www.tij.co.jp/jp/lit/df/tidrim5/tidrim5.pdf

これによると、25MHzのクリスタル出力をSI5351Aで分岐し、MCLK,BCLK,WCLKを作っている。
それをPCM5101,PCM1808へ入力している。
PCM5102にも使えそうな回路で、
PCM1808 DIP化キットは250円、
http://akizukidenshi.com/catalog/g/gK-12988/
PCM5102A DIP化キットは500円
http://akizukidenshi.com/catalog/g/gK-11836/
Si5351A-B自体は秋月で150円。高くない。
MCLK(マスタークロック)とは、チップがオーディオフォーマットを決める基本のクロック。
22.5792MHzと、24.576MHzがある。
LRCLKは信号レベルが0の時にL、1の時にRを送るクロック。一般的にサンプリング周波数と同値になる。
BCLKとはビットクロックのことで、32ビットを読み出すための基準のクロック。32ビットx2(L+R)で64ビットとなる。
例えば 24.5760MHz/8 = 3.072MHz /32/2 = 48KHz
24.576MHzを8分周して、3.072MhzがBCLK、それを64で割るとLRCLK(48KHz)となる。

ボード上でマスタークロックを生成させる必要があるが、Si5351Aはそれ自体I2Cで設定するらしい。
I2Cの設定から何とか逃れたい。

PCM1808のデータシートに下記の記載がある。
7.3.5.1インタフェースモード
MD1(ピン11)とMD0(ピン10)は、インターフェイスモードとしてマスターモードとスレーブモードを選択します。
表2に、インターフェイスモードの選択を示します。電源を入れる前にMD1とMD0を設定する必要があります。
マスターモードでは、PCM1808デバイスは、PCM1808デバイスとデジタルオーディオプロセッサまたは外部回路との間のシリアルオーディオデータ通信のタイミングを提供します。

上記以降、読み進めていくとマスターモードはSCKIピンにマスタークロックを入れたら、BCK(BITCLOCK) LRCK(LRCLOCK)を出力してくれるらしい。
Si5351Aを使わなくていいのではないか。やってみよう。

以下のような回路を考えて、バラック組をしてみた。
image.png
image.png

Raspberry piでのドライバーの組み込み

基本的には共立電子産業のリンクの通りドライバーを組み込むが、

今回、BCK,LRCKをコーデック側で作って、Raspberry pi側へ送る設定となるため
my_loader.cの下記44行を書き換える。
https://github.com/PaulCreaser/rpi-i2s-audio/blob/master/my_loader.c

.daifmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS,
↓
.daifmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM,

そのほかは上記手順に従っていけば
下記の通り、snd_rpi_simple_cardとして録音、再生デバイスとして認識させることが出来る。

pi@pi3:~/rpi-i2s-audio $ aplay -l
**** ハードウェアデバイス PLAYBACK のリスト ****
カード 0: 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
カード 0: ALSA [bcm2835 ALSA], デバイス 1: bcm2835 IEC958/HDMI [bcm2835 IEC958/HDMI]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
カード 0: ALSA [bcm2835 ALSA], デバイス 2: bcm2835 IEC958/HDMI1 [bcm2835 IEC958/HDMI1]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
カード 1: sndrpisimplecar [snd_rpi_simple_card], デバイス 0: simple-card_codec_link snd-soc-dummy-dai-0 [simple-card_codec_link snd-soc-dummy-dai-0]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

pi@pi3:~/rpi-i2s-audio $ arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 1: sndrpisimplecar [snd_rpi_simple_card], デバイス 0: simple-card_codec_link snd-soc-dummy-dai-0 [simple-card_codec_link snd-soc-dummy-dai-0]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

さらにRaspberry pi上のAudacity(sudo apt install audacityでインストール)で認識させる。
image.png

これで問題なく録音と再生ができるようになった。
上記の回路図のとおり、ジャンパピンでMD1ピンを切り替えることで
ハイ:96khz
ロー:48khz
が設定できるようにした。

elecrowで基盤が安価で気楽に作れるようになってきたので、基盤を作成してみる。
サーバー認証用のチップを追加で乗せている。

Kicadのプロジェクトファイルをアップロードした。

image.png

image.png

この作成したボードを検証していく。

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4