PCM5102 I2S

I2SのモジュールPCM5102の説明です。Amazon等で ”PCM5102 I2S IIS デジタルオーディオDACデコーダモジュール” として売っているモジュールです。

使う前にちょっと注意

PCM5102 I2S IIS デジタルオーディオDACデコーダモジュールには表と裏面に設定用のパッドがあります。

  • 表面:向かって左上にパッド
    • このパッドをショートするとSCKにモジュールに内部クロックが使用されます。
    • ショートさせると本体とSCKパッドをつなぐ必要が無くなり、3本の信号のみでコントロール出来ます。
  • 裏面:H1L,H2L,H3L,H4Lの4つのパッド
    • Webの画面には各パッドが予めショートされているのですが、届いた製品によってはショートされていない
      ものが有ります。その場合下記のようにパッドをショートさせます。
パッドショートサイド機能
H1L向かって右FLT(Filter select)設定。L(Normal latency)
H2L向かって右DEMP (De-emphasis control for 44.1kHz sampling rate)設定。L(OFF)
H3L向かって左XSMT (Soft mute control)設定。H(soft un-mute)
H4L向かって右FMT (Audio format selection)設定。L(I2S)

今回購入してボードは表裏面のパッドがショートされていませんでした。そこで裏面は上記のようにショート。表面は信号線が1本減るのでパッドをショートして使います。

本体とは、BCK/DIN/LCKの3本(表のパッドをショートさせているのでSCKは使わない)を配線。VINに電源、GNDにグランドを接続して配線完了です。

表面右上にある、G/R/G/Lが出力です。 G/Rが右側に出力とグランド。次のG/Lが左側に出力とグランドです。また出力は表面右下のジャックからも出ています。

このモジュール、簡単な配線で確実に動作します。

サンプルスケッチ

WebRadio w/I2S -02 . MP3/AAC ファイルの再生を元にESP32を使ってMP3ファイルを再生。

ハード

BCK/DIN/LCKの3ピンにはデフォルトの値が設定されていますが、今回はデフォルトと違うピンを使用しました。

 PCM5102  Default   今回  
BCKGPIO26GPIO27
DINGPIO22GPIO26
LCKGPIO25GPIO25

スケッチ

30行 out->SetPinout(bck, lck, din); でピンアサインを変更しています。このサンプルは、約6秒位のハープシコードの演奏を繰り返します。

PCM5102A.ino


<#include <Arduino.h>
#include <LittleFS.h>
#include "FS.h"

#include "AudioFileSourceFS.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2S.h"

#define   bck  27     //default 26    
#define   lck  25     //default 25  
#define   din  26     //default 22 

void setup() {
    Serial.begin(115200);
    delay(1000);

    // Initialise FS
    if (!LittleFS.begin()) {
      Serial.println("LittleFS initialisation failed!");
      while (1) yield(); // Stay here twiddling thumbs waiting
    }
}

void loop() {
  AudioGeneratorMP3       *mp3;
  AudioFileSourceFS       *file;
  AudioOutputI2S          *out;

    out = new AudioOutputI2S();
    out->SetPinout(bck, lck, din);
    out->SetGain(0.5);
    
    mp3 = new AudioGeneratorMP3();

    Serial.println("Start");
    file = new AudioFileSourceFS(LittleFS, "/Harp.mp3");
    mp3->begin(file, out);
    while(mp3->isRunning()){
      if (!mp3->loop()){
        mp3->stop();
        delete file;
        Serial.println("Done");
      }
    }

    delay(1000);
}