##きっかけ
DACはよく見かけるが、ADCも載せたいわゆるコーデックボードは多くない。
数少ない中Microe社のAudio Codec Board-Protoという製品はあるようだ。
仕様は、
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/
上記を参考にすると、
Serializerと書かれている右側に出ている、PCM_CLK,PCM_FS,PCM_DIN,PCM_DOUTの4本で構成されるらしい。
それに対応するRaspberry piの40ピンヘッダーは
つまり
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を使わなくていいのではないか。やってみよう。
##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でインストール)で認識させる。
これで問題なく録音と再生ができるようになった。
上記の回路図のとおり、ジャンパピンでMD1ピンを切り替えることで
ハイ:96khz
ロー:48khz
が設定できるようにした。
elecrowで基盤が安価で気楽に作れるようになってきたので、基盤を作成してみる。
サーバー認証用のチップを追加で乗せている。
Kicadのプロジェクトファイルをアップロードした。
この作成したボードを検証していく。