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

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

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

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5412/5b007445-f936-2081-e261-75fe48e359c5.png" width="220"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5412/cbd841c7-7556-a872-4a83-26672d7c2cf6.png" width="400">

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

# 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5412/6ab73b0c-381c-3440-5725-810823efce99.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5412/e3db574b-0cce-a820-ae85-a989e9d3ff55.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