I2SのモジュールPCM5102の説明です。Amazon等で ”PCM5102 I2S IIS デジタルオーディオDACデコーダモジュール” として売っているモジュールです。
使う前にちょっと注意
PCM5102 I2S IIS デジタルオーディオDACデコーダモジュールには表と裏面に設定用のパッドがあります。
- 表面:向かって左上にパッド
- このパッドをショートするとSCKにモジュールに内部クロックが使用されます。
- ショートさせると本体とSCKパッドをつなぐ必要が無くなり、3本の信号のみでコントロール出来ます。
- 裏面:H1L,H2L,H3L,H4Lの4つのパッド
- Webの画面には各パッドが予めショートされているのですが、届いた製品によってはショートされていない
ものが有ります。その場合下記のようにパッドをショートさせます。
- 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 | 今回 |
BCK | GPIO26 | GPIO27 |
DIN | GPIO22 | GPIO26 |
LCK | GPIO25 | GPIO25 |
スケッチ
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);
}