PCM5102Aは簡単にラズパイにつなが、、らなかった。


mp3を再生してみると、再生速度が遅い。。

5V、GND、信号線3本の配線5本なので、I2S接続のDAC、PCM5102Aはラズパイに簡単につながるよ。ということになっています。ドライバーも用意されているので、有効化するためにファイルを2つ、ちょこちょこと編集するだけ。デフォルトの出力先に指定すると、完了。30分もかかりませんよね。

ところが、今回、かなりハマったので、メモを残します。英語でも同じケースの失敗例が非常に少なく、日本語では皆無でした。症状は、再生速度が遅いこと。ス ロ ー 再 生 で す 。 。 。

PCM5102Aサウンドボード、結線の様子

私のゲットしたボードだと、こんな結線になります。

ラズパイ PCM5102A (I2S接続) プルアップ/ダウン
5V VCC
- 3.3V
GND GND
- FLT (Filter: ~FIR/IIR) down=FIRローレイテンシー
- DMP (De-emphasis: on) down=フィルター掛けない
- SCL (System clock) down=内部で生成
(PCM CLK) GPIO18 BCK (Bit clock)
(PCM DOUT) GPIO21 DIN (Data in)
(PCM FS) GPIO19 LCK (LR clock)
- FMT (Format: ~I2S/左詰め) down=I2Sフォーマット
- XMT (eXternal mute on) up=ミュート解除

プルダウンはGNDへ、プルアップは3.3Vへ、10KΩで接続。ボードによっては、短絡用のパッドが設けられていてもっと楽なものもあり。固定で配線済のものもあり。HAT(Hardware Attached on Top)タイプのものだと、ソケットに刺すだけ。

結論: pigpiodと競合してました

ラズパイ1〜4は、サウンドボードを付けなくてもヘッドフォンジャックか、HDMI経由でも音が出せます。今回の不具合は、ヘッドフォンジャックとpigpioに関係がありました。

ヘッドフォンジャックから音を出す仕組み、実は、PWM出力を積分してアナログ変換しています。ラズパイのヘッダーには出ていないGPIO40/41(*)がヘッドフォンジャックR/Lに接続されています。ですが、GPIO12/13/18/19のいずれかでPWMで使うと、ヘッドフォンジャックから変調ノイズが聞こえる。PWM用のタイマーはPWM0/1の2つしか無いので、両立できない。

(*:ラズパイ3より前は、GPIO40/45)

一方、GPIOサーバー、コントローラーであるpigpioは、ヘッドフォンジャック出力との競合を避けるために、PWM用タイマーを使わずにPCM用タイマーを使ってPWM機能を提供しているのです。
というわけで、3人が二人を取り合う、5角関係?です。

タイマー/クロック ヘッドフォン出力 pigpio PWM I2S/PCM
PWM GPIO40/41経由で使用 オプションで使用 使わない
PCM 使わない デフォルトで使用 使います!

「各バージョンのラズパイとGPIO設定」
https://github.com/raspberrypi/firmware/blob/master/extra/dt-blob.dts

解決法

というわけで、PCMをpigpioデーモンから開放する必要あり。常駐サービスなので、使っている意識がないときでも使ってる。

一時的には、pigpioデーモンのサービスを無効化する。

sudo systemctl disable pigpiod

恒久的には、pigpioがPWMタイマーを使う設定での起動とする。

sudo nano /etc/systemd/system/pigpiod.service.d/public.conf

編集して、以下のようにtオプションを追記する。
ExecStart=/usr/bin/pigpiod -t 0

ヘッドフォン出力も、サウンドボードも差し替えて使いたい、PWMでサーボモーターやLEDの明るさを変えたりもしたい、となると、無理! PWMドライバーPCA9685などを使いましょう。

ALSA、クビになったってよ

永らく慣れ親しんできた(というか、苦しめられてきた印象の)ALSAさん、2020年12月のRaspbery Pi OSのアップデートでお役御免となり、PulseAudioが後を引き継ぎ(?)ました。今までもALSAと一緒に働いてきたけど、ドライバー部分もPulseAudioを全部やってくれるようになる??うーん、色々面倒だ。Bullseye移行前にややこしい事を、というか、段階を踏んで移行したほうがマシということか。

案の定、PulseAudio導入でゴタゴタして、1月にアップデートが出ています。

参考 ラズパイ3B/4Bの回路図、ヘッドフォンジャック周辺

ピンヘッダには出ていないGPIO40/41がPWM0/1に設定されており、物理的にヘッドフォンジャックのR/Lにつながっています。

"Schematics for the various Raspberry Pi board versions"
https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/

"Raspberry Pi 4 Model B Revision 4.0"
https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/rpi_SCH_4b_4p0_reduced.pdf

"Raspberry Pi 3 Model B Revision 1.2"
https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/rpi_SCH_3b_1p2_reduced.pdf

参考 各GPIOがどの機能に割り当てられているか調べる

raspi-gpioコマンドでGPIOの割当てをセットしたり、調べたりできます。

I2C、SPI、I2S(PCM)、PWM

raspi-gpio get  2,3,9-11,18-21,40,41

GPIO 2: level=1 fsel=4 alt=0 func=SDA1
GPIO 3: level=1 fsel=4 alt=0 func=SCL1
GPIO 9: level=0 fsel=4 alt=0 func=SPI0_MISO
GPIO 10: level=0 fsel=4 alt=0 func=SPI0_MOSI
GPIO 11: level=0 fsel=4 alt=0 func=SPI0_SCLK
GPIO 18: level=0 fsel=4 alt=0 func=PCM_CLK
GPIO 19: level=0 fsel=4 alt=0 func=PCM_FS
GPIO 20: level=0 fsel=4 alt=0 func=PCM_DIN
GPIO 21: level=0 fsel=4 alt=0 func=PCM_DOUT
GPIO 40: level=1 fsel=4 alt=0 func=PWM0
GPIO 41: level=1 fsel=4 alt=0 func=PWM1

割当が可能な機能をピンごとに調べる。

raspi-gpio funcs 18,19,20,21,40,41

GPIO, DEFAULT PULL, ALT0, ALT1, ALT2, ALT3, ALT4, ALT5
18, DOWN, PCM_CLK, SD10, DPI_D14, I2CSL_SDA_MOSI, SPI1_CE0_N, PWM0
19, DOWN, PCM_FS, SD11, DPI_D15, I2CSL_SCL_SCLK, SPI1_MISO, PWM1
20, DOWN, PCM_DIN, SD12, DPI_D16, I2CSL_MISO, SPI1_MOSI, GPCLK0
21, DOWN, PCM_DOUT, SD13, DPI_D17, I2CSL_CE_N, SPI1_SCLK, GPCLK1
40, DOWN, PWM0, SD4, -, SD1_DAT4, SPI2_MISO, TXD1
41, DOWN, PWM1, SD5, TE0, SD1_DAT5, SPI2_MOSI, RXD1

もしも、インストールされていなければ、

sudo apt-get raspi-gpio

参考ページ:

"Slow audio playback with PCM5102A I2S DAC"
https://raspberrypi.stackexchange.com/questions/116669/slow-audio-playback-with-pcm5102a-i2s-dac/121528

"pigpio Daemon"
http://abyz.me.uk/rpi/pigpio/pigpiod.html

"Raspberry Pi Pinout - GPIO18"
https://pinout.xyz/pinout/pin12_gpio18