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