2021年6月17日 星期四

用ESP8266播放音樂


使用ESP8266FS工具上傳資料檔案到SPIFFS區域
https://github.com/esp8266/arduino-esp8266fs-plugin

使用ESP8266LittleFS工具上傳資料檔案到LittleFS區域

https://github.com/earlephilhower/arduino-esp8266littlefs-plugin/releases

MP3 Example file
https://ccrma.stanford.edu/~jos/pasp/Sound_Examples.html

播放音樂 lib
https://github.com/earlephilhower/ESP8266Audio#example


最近我們做一個項目需要在ESP8266中播放一段音樂,當時一下就傻了,ESP8266可是沒有D/A輸出的! 一開始我們直接買了一塊D/A解碼的板子然後接上一個小功放來播放,但效果令人失望。聲音小不說其聲音有很大的干擾噪聲。而且這種做法無疑是難以產品化的,一個D/A解碼再加一個功放那成本已經直接飆升了。

幾經努力我們終於找到了一個非常實用的方案,根本不需要增加任何的附加硬件就以直接播放mp3!

這都歸功於ESP8266Audio這個庫,將喇叭直接接到一個數字輸出口就可以直接播放MP3了,為了能有更大的功率加個普通三極管就可以完美推動一個小功率喇叭正常動作了。

 2N3904 (NPN)
                            +---------+
                            |         |     +-|
                            | E  B  C |    / S|
                            +-|--|--|-+    | P|
                              |  |  +------+ E|
                              |  |         | A|
ESP8266-GND ------------------+  |  +------+ K| 
                                 |  |      | E|
ESP8266-I2SOUT (Rx) -------------+  |      \ R|
                                    |       +-|
USB 5V -----------------------------+

這裡我會放一個最簡單的示例來展示一下怎麼來使用這個庫。

首先這個示例要使用SPIFFS來存儲音樂文件,關於SPIFFS的具體用法可以參考我以前發表的SPIFFS的使用一文。

將ESP8266Audio這個庫安裝好以後,要先引用以下幾個頭文件:

#include "AudioFileSourceSPIFFS.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2SNoDAC.h"

這個庫使用起來非常簡單。首先是初始化

AudioGeneratorMP3 *mp3;
AudioFileSourceSPIFFS *file;
AudioOutputI2SNoDAC *out;

void setup()
{
  SPIFFS.begin();
  file = new AudioFileSourceSPIFFS("/test.mp3");
  out = new AudioOutputI2SNoDAC();
  mp3 = new AudioGeneratorMP3();
  mp3->begin(file, out);
}

然後在主循環函數中判斷文件是否已經播放完成

void loop()
{
  if (mp3->isRunning()) {
    if (!mp3->loop()) mp3->stop(); 
  } else {
    Serial.printf("MP3 done\n");
    delay(1000);
  }
}

以下是全部代碼:

#include <Arduino.h>
#include "AudioFileSourceSPIFFS.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2SNoDAC.h"

AudioGeneratorMP3 *mp3;
AudioFileSourceSPIFFS *file;
AudioOutputI2SNoDAC *out;
void setup()
{
  Serial.begin(115200);
  delay(1000);
  SPIFFS.begin();
  file = new AudioFileSourceSPIFFS("/jamonit.mp3");
  out = new AudioOutputI2SNoDAC();
  mp3 = new AudioGeneratorMP3();
  mp3->begin(file, out);
}

void loop()
{
  if (mp3->isRunning()) {
    if (!mp3->loop()) mp3->stop(); 
  } else {
    Serial.printf("MP3 done\n");
    delay(1000);
  }
}

參考閱讀



資料來源: https://www.jianshu.com/p/88e789a4b9de

沒有留言: