[M5Stack Core2 for AWS] Arduinoでオーディオファイルを再生してみました
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を使用しててみました