LoginSignup
0

More than 1 year has passed since last update.

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

Posted at

前回の投稿「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からは簡単に呼び出せるようにしています。

以上

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
0