この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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 コード
サンプルで作成したプログラムの全てのコードは、以下の通りです。 AudioGeneratorWAVをAudioGeneratorMP3に置き換えると、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を使用しててみました