M5Core2とM5Atom Echoに加えて、M5Stack FireやM5StickCでもMP3再生する


前回の投稿「M5Core2とM5Atom EchoでMP3再生」で、M5Core2とM5Atom EchoからMP3再生しました。この時は、I2Sの機能を使っていましたが、DAC接続のM5Stack FireやM5StickCでも同様に再生できるので実際にやってみます。

ESP32におけるオーディオ再生

前回同様以下のライブラリを使わせていただいています。

earlephilhower/ESP8266Audio

〇宣言

以前の投稿の時と同じです。

module_audio.cpp
#include <driver/i2s.h>
#include "AudioFileSourceHTTPStream.h"
#include "AudioFileSourceBuffer.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2S.h"
#include "AudioFileSourceSD.h"

static AudioOutputI2S *out = NULL;

static AudioGeneratorMP3 *mp3 = NULL;
static AudioFileSourceSD *file_sd = NULL;
static AudioFileSourceHTTPStream *file_http = NULL;
static AudioFileSourceBuffer *buff = NULL;

〇準備

このAudioOutputI2Sのコンストラクタでのパラメータの指定方法が違います。
I2Sを利用する場合(M5Core2やM5Atom Echoの場合)

module_audio.cpp
  out = new AudioOutputI2S(I2S_NUM_0);
  out->SetOutputModeMono(true);
  out->SetGain(audio_gain / 100.0);

DACを利用する場合(M5Stack FireやM5StickCの場合)

module_audio.cpp
  out = new AudioOutputI2S(I2S_NUM_0, AudioOutputI2S::INTERNAL_DAC);
  out->SetOutputModeMono(true);
  out->SetGain(audio_gain / 100.0);

DACを利用する場合、音声信号は、PIN番号26に出力されます。
M5Stack Fireの場合には本体内蔵のスピーカに接続されています。M5StickCでは、本体上側の端子から出力され、以下の周辺デバイスのスピーカを接続することで再生できます。

M5StickC Speaker Hat(PAM8303搭載)

〇PIN設定

以前の投稿の時と変わりませんが、このPIN設定は、I2Sを利用する場合にのみ必要です。

module_audio.cpp
  out->SetPinout(bclk, lrck, dout);

3つのPIN番号を指定します。BCLK、LRCK、DataOutです。
M5Core2では、以下の通りです。

BCLK:12
LRCK:0
DataOut:2

M5Atom Echoでは、以下の通りです。

BCLK:19
LRCK:33
DataOut:22

後は同じです。

〇URLから再生

module_audio.cpp
  file_http = new AudioFileSourceHTTPStream(url);
  buff = new AudioFileSourceBuffer(file_http, bufsize);
  mp3 = new AudioGeneratorMP3();
  mp3->begin(buff, out);

〇SDからの再生

module_audio.cpp
  file_sd = new AudioFileSourceSD(path);
  if( !file_sd->isOpen() ){
    delete file_sd;
    file_sd = NULL;
    return JS_EXCEPTION;
  }
  mp3 = new AudioGeneratorMP3();
  mp3->begin(file_sd, out);

そして以下を継続呼び出し

module_audio.cpp
  if( mp3 != NULL ){
    if (mp3->isRunning()) {
      if (!mp3->loop())
        mp3->stop();
    }
  }

Javascriptでの呼び出し

以下の技術書で紹介している、ESP32内部で動作するJavascript環境で動作させる場合のJavascriptコード例を示します。

M5StackとJavascriptではじめるIoTデバイス制御

I2Sで再生するM5Stackモジュールの場合

import * as audio from "Audio";

audio.begin();
//audio.setPinout(12, 0, 2); // for M5Core2
audio.setPinout(19, 33, 22); // for M5Atom Echo
audio.playSd("/g_07.mp3");
//audio.playUrl('http://192.168.1.16:20080/g_07.mp3');

setInterval(() =>{
	audio.update();
}, 1);

DACで再生するM5Stackモジュールの場合

import * as audio from "Audio";

audio.begin(audio.INTERNAL_DAC);
audio.playSd("/g_07.mp3");
//audio.playUrl('http://192.168.1.16:20080/g_07.mp3');

setInterval(() =>{
	audio.update();
}, 1);

細かな処理はC言語で実装済みのため、Javascriptからは簡単に呼び出せるようにしています。

以上