LoginSignup
2
1

More than 3 years have passed since last update.

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

Posted at

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

スクリーンショット 2021-02-23 9.55.33.png

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

スクリーンショット 2021-02-23 9.56.28.png

参考 各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

2
1
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
2
1