[M5Stack Core2 for AWS] Arduinoでオーディオファイルを再生してみました

2021.07.20

1 はじめに

IoT事業部の平内(SIN)です。

今回は、Arduinoを使用してM5Stack Core2 for AWSでオーディオファイル(WAV,MP3)を再生してみました。

最初に、動作確認している様子です。ボタンで選択した3種類のwavファイルを再生しています。

オーディオファイルの再生に関して、下記の記事を参考にさせて頂きました。
M5Stack Core2のスピーカーを使う

2 ライブラリ

使用しているライブラリは、以下のとおりです。

  • M5Core2
  • ESP8266Audio

platformio.ini

[env:sample002]
platform = espressif32
board = m5stack-core2
framework = arduino

monitor_speed = 115200
upload_port = /dev/cu.SLAB_USBtoUART

lib_deps = 
	m5stack/M5Core2@^0.0.4
	earlephilhower/ESP8266Audio@^1.9.2

ライブラリのインストールや、M5Core2については、下記の記事をご参照ください。

3 ESP8266Audio


https://github.com/earlephilhower/ESP8266Audio

ESP8266Audioは、WAV、MP3、MIDIなどのオーディオファイルをI2S DACで再生するために使用できるArduinoライブラリです。

ESP32でDACを使用するには、I2S/16ビットDACのインタフェースである、AudioOutputi2Sクラスをインスタンス化します。

I2Sの割り込み番号0で、外部のDACを使用する場合、初期化は、下記のようになります。

#define EXTERNAL_I2S 0
out = new AudioOutputI2S(I2S_NUM_0, EXTERNAL_I2S);

また、接続されたGPIO番号は、SetPinout() で設定できます。

#define BCLK_PIN 12
#define LRCK_PIN 0
#define SADTA_PIN 2

out->SetPinout(BCLK_PIN, LRCK_PIN, SADTA_PIN);


https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/schematic/Core/CORE2_V1.0_SCH.pdf

ボリュームは、SetGain() で設定します。

#define OUTPUT_GAIN 80
out->SetGain((float)OUTPUT_GAIN/100.0);

4 SDカード

今回、オーディオファイルは、SDカードに格納しました。

FAT32でフォーマットされたSDカードなら、そのまま利用可能ですが、16MByte以上のサイズのものは利用できないので注意が必要です。

5 コード

サンプルで作成したプログラムの全てのコードは、以下の通りです。 AudioGeneratorWAVAudioGeneratorMP3に置き換えると、MP3の再生も可能です。

#include <M5Core2.h>
#include <driver/i2s.h>
#include "AudioFileSourceSD.h"
#include "AudioGeneratorWAV.h"
//#include "AudioGeneratorMP3.h"
#include "AudioOutputI2S.h"

#include "VButton.h"

AudioGeneratorWAV *wav = NULL;
//AudioGeneratorMP3 *mp3 = NULL;
AudioFileSourceSD *file;
AudioOutputI2S *out;

#define BCLK_PIN 12
#define LRCK_PIN 0
#define SADTA_PIN 2
#define EXTERNAL_I2S 0
#define OUTPUT_GAIN 80

VButton * button_bach;
VButton * button_beethoven;
VButton * button_chopin;

uint16_t getColor(uint8_t red, uint8_t green, uint8_t blue){
  return ((red>>3)<<11) | ((green>>2)<<5) | (blue>>3);
}

void button_callback(char *name, bool use_toggle, bool is_toggled){
	char path[128];
	
	// 再生中の場合は、停止する
	if(wav != NULL){
		wav->stop();
	}
	
	sprintf(path,"/wav/%s.wav",name);
	file = new AudioFileSourceSD(path);
	out = new AudioOutputI2S(I2S_NUM_0, EXTERNAL_I2S); 
	out->SetPinout(BCLK_PIN, LRCK_PIN, SADTA_PIN);
	out->SetOutputModeMono(true);
	out->SetGain((float)OUTPUT_GAIN/100.0);
	wav = new AudioGeneratorWAV();
	wav->begin(file, out);
}

void setup() {
	M5.begin();
	M5.Lcd.setBrightness(255);
	M5.Lcd.fillScreen(WHITE);
	// スピーカーの初期化
	M5.Axp.SetSpkEnable(true); 
	// 操作ボタン
	ushort dark_gray = getColor(80, 80, 80);
	button_bach = new VButton("Bach", button_callback, false, -70, dark_gray);  
	button_beethoven = new VButton("Beethoven", button_callback, false, 0, dark_gray);  
	button_chopin = new VButton("Chopin", button_callback, false, 70, dark_gray);  
}

void loop() {
	button_bach->loop();
	button_beethoven->loop();
	button_chopin->loop();

	if(wav != NULL){
		if (wav->isRunning()) {
			if (!wav->loop()) wav->stop();
		} else {
			Serial.printf("WAV done\n");
			delay(1000);
		}
	}
}

6 最後に

今回は、オーディオファイルの再生を試してみました。 M5Stackの小さい巨体から、しっかり再生されているのが、ちょっとビックリです。

7 参考リンク


Visual Studio Code + PlatformIO 環境で M5Stack Core2 for AWS でHello Worldしてみました
[M5Stack Core2 for AWS] Core2 for AWS IoT EduKit BSPを使用してLEDを光らせてみました
[M5Stack Core2 for AWS] Core2 for AWS IoT EduKit BSPを使用してディスプレイに表示してみました
[M5Stack Core2 for AWS] Core2 for AWS IoT EduKit BSPを使用して仮想ボタンの動作を確認してみました
[M5Stack Core2 for AWS] LVCLを使用してディスプレイ上のボタンの動作を確認してみました
[M5Stack Core2 for AWS] Core2 for AWS IoT EduKit BSPを使用して電源を操作してみました
[M5Stack Core2 for AWS] Core2 for AWS IoT EduKit BSPを使用してスピーカーを操作してみました
[M5Stack Core2 for AWS] Core2 for AWS IoT EduKit BSPを使用して静電容量式タッチパネルを操作してみました
[M5Stack Core2 for AWS] Core2 for AWS IoT EduKit BSPを使用してジャイロセンサーを操作してみました
[M5Stack Core2 for AWS] PlatformIO を使用して、ArduinoでHello Worldしてみました
[M5Stack Core2 for AWS] ArduinoでLED (Adafruit NeoPixel フルカラーLED) を点灯してみました
[M5Stack Core2 for AWS] Arduinoで仮想ボタンを作成してみました
[M5Stack Core2 for AWS] ArduinoでMQTT接続してみました
[M5Stack Core2 for AWS] Arduinoでオーディオファイルを再生してみました
[M5Stack Core2 for AWS] Arduinoでマイクの利用方法を確認してみました
[M5Stack Core2 for AWS] ArduinoでGroveポートのGPIOを使用しててみました