ARDUINO从入门到创客带师第7弹 利用ESP8266播放MP3音乐
在之前的教程中我们提到了ESP8266作为低成本高性能的物联网WIFI模块内置了高性能的MCU和WIFI方案,并且广泛被应用于各种IoT场景中(比如小米的一系列物联网智能家电),作为一款内置32位MCU的模块,它能卖不到10块钱一个是非常厉害的,单论性能和实用性来说,51 AVR单片机没它性能高,STM32没它实用。虽然ESP8266性能介于STM32和AVR 8位单片机之间,但是好歹也是搭载了32位 MCU Tensilica L106 超低功耗 32 位微型 MCU,主频支持 80 MHz 和160 MHz,支持 RTOS(ESP32甚至还是双核),性能也是不错的。之前咱说过不少人曾经用8266驱动12864 OLED屏幕搞动画效果(实际上是输出图片序列),但是咱对于这种只是为了做项目而做项目的事情并不是很感兴趣(之前甚至还有人因为别人使用了开源代码之后分走了自己视频的流量之后互相指责对方抄袭,让咱看了很是迷惑 明明都是开源的项目哪有抄袭一说呢 平台对作者进行限流导致的却是作者互相攻击,让人感叹没有好的平台的作者就像没有根的草一样悲哀 B站通过限流把他们都逼成了标题党和蔡到互相指责同好抄袭的蔡鸡了 还好咱有ACFUN和张大妈),所以对于实用性更强的用途相对的咱比较更感兴趣。毕竟ESP8266再怎么驱动12864 OLED屏也都是得把现有的视频转换成图片序列,然后播放的时候还没得背景音乐,充其量也就是个高速幻灯片,和真正的动画比不了。恰恰相反,咱对画面以外的音乐更感兴趣,既然ESP8266的性能足以驱动图像内容,那么对付音频应该是易如反掌,因此这期教程咱打算给各位带来的是使用ESP8266 WIFI模块自制MP3的教程(成本15)
前作:
用单片机开发板自制MIDI音乐盒(预算15)
(ARDUINO UNO,这里利用的arduino-midi-player项目还只支持MIDI音乐呢)
8266的硬件咱就不用介绍了吧,上期已经有了,大多数8266的开发板都有我们需要的东西,闭着眼睛随便买就行了,开发板成品市场价通常在10-20块钱左右包邮。这期我们主要介绍的是这个能让ESP8266实现真正意义上的MP3播放各种格式音乐的项目
ESP8266Audio
这个项目支持使用基于ESP8266的模块解码播放MOD, WAV, MP3, FLAC, MIDI, AAC, 和RTTL等格式的音频文件,不需要任何模数转换器。还可以通过http进行流式播放(访问NAS可能)
实现原理:ESP8266 flash芯片是外接在ESP8266芯片外面,通过SPI与8266芯片通信。虽然有些系列模组flash比较大,但是不意味着全部flash空间都可以用来装载固件代码。一般来说,我们开发的代码不超过1MB。
(通常开发的代码不超过1MB是有原因的,比如需要考虑OTA无线固件更新的场合)
OTA更新也可以更新SPIFFS
大部分8266模块通常都搭载了4Mbyte的FLASH闪存,这让它有可能运行比C更高级的语言,这些空间足够安装LUA或者Micro Python环境并运行了,但是在这里我们用不上LUA或者Micro Python所以我们就可以把这4M的空间里面的一些(最大3M)用来干别的比如储存文件,在这里就是储存是音频文件。
ESP8266 文件系统(SPI Flash FileSystem,简称为SPIFFS)。
先来看一个概念图:
这个文件系统可以帮助我们存储一些变更频率不频繁的文件例如网页、配置或者是某些固化的数据等。 其实,我们用得更多的是存储网页,将网页和相关资源(如:图片、html、css、javaScript)存入到flash的SPIFFS区域(上期WIFI钟的教程里面阿卡林也提到了做了个WEB GUI界面,这样WIFI配置信息就不用放在代码里了可以更容易适配不同的应用场合 而且代码本身因为不记录WLAN配置信息就可以打包成固件了)。 原理如下图:
SPIFFS之所以被ESP8266选择作为文件系统,是因为它是为小型系统专门设计的,同时是以一些简化和限制为代价的。
SPIFFS不支持目录但是允许在文件名中出现
“/”且
对于文件名,总共有32个字符限制(实际可用31个字符)
。这个限制很容易达到而且在编译和上传过程中是不报错的——可能导致小白卡关。
FLASH存储分配
Arduino环境下ESP8266的flash存储分配
具体可以分为几部分
代码区
文件系统
这个就是我们这节重点讲解的SPI Flash File System,简称SPIFFS闪存文件系统。
即使文件系统与程序存储在同一个闪存芯片上,烧入新的代码也不会修改文件系统内容。这允许使用文件系统来存储Web服务器的代码数据、配置文件或内容。而这个SPIFFS文件系统的大小可以通过烧写环境来配置,目前一般有1M,2M,3M等等。本作中
如果使用基于ESP12E 12F的开发板(
NodeMcu,D1,D1 MINI
),可以配置成3M
;
EEPROM
关于ESP8266的12E 12F 12N 12S的区别
通过上期的《
ARDUINO从入门到创客带师第⑤弹 自制WIFI时钟
》我们可以知道ESP8266自从诞生以来作为低成本高性能的物联网解决方案是有很多版本的衍生产物的,那么它们的区别是什么呢?
实际上都是用的都是乐鑫的ESP8266芯片,只是生产厂家不一样,12e和12f都是安信可做的,12n是一个叫四博智联的公司,都是深圳产实际使用没有区别。两家厂GPIO4和GPIO5管脚对换了,PCB印刷电路板层数不同,其他比如FLASH(4Mbyte=32MBit)参数基本一样
12E 、12F、12S实际使用没有任何区别
小心ESP-01S,这种早期型号只支持8Mbit(1MB)FLASH和2个IO,基本都是用于给其他MCU通过串口扩展WIFI用的,作为单独的平台搞开发并不合适(但是不是不能用)。
选型表:
老实说我觉得如果到了8266模块可以选型的份上的话应该选ESP07S这种可以外接高增益天线的型号。
ESP8266 型号汇总
库的安装
首先需要ESP8266 IDE的安装,可以在文件-首选项-附加开发板管理器里面输入这个网址,然后在工具-开发板-开发板管理器中搜8266就可以在线安装了
http://arduino.esp8266.com/stable/package_esp8266com_index.json
如果没有找到的话建议各位直接用8266_离线包,这个上期ESP8266
做WIFI钟的项目
里面阿卡林大佬提供了,没有的话应该上网也能找到,这里咱就不放下载链接了各位自己动手试试
然后就可以安装库了。这次我们需要安装两个库,一个是ESP8266_Spiram,另一个是主角ESP8266Audio了(压缩包我们在文中提供了)。安装库的基本方法还和上次一样,下载好ZIP之后直接项目-加载库-添加.zip库就行了。
库的离线安装:
arduino IDE >= 1.8.0:
解压该文件,并将解压出的文件夹放到 文档/Arduino/libraries中,如C:\Users\用户名\Documents\Arduino\libraries
arduino IDE < 1.8.0
解压该文件,并将解压出的文件夹放到Arduino IDE的所在文件夹中的libraries文件夹内,如D:\Program\arduino-1.6.11\libraries
就可以了
然而这个ESP8266 Sketch Data Upload并不是这样安装的
电脑---文档---Arduino---新建一个tools--随后将压缩包内的ESP8266FS文件夹整个拖进tools里----重新打开IDE,工具栏里就有ESP8266 sketch data upload了。我之前按安装库的办法给这个压缩包解压到Arduino\libraries里结果各种报无效库之后卡了挺长时间才想明白哪错了。
如果你有系统管理员权限,那么这个JAR文件最后应该是在C:\Users\Administrator\Documents\Arduino\tools\ESP8266FS\tool这个位置
然后有了库和对8266文件上传工具之后,就可以开始硬件搭建了
硬件方面除了8266开发板之外只需要一个小扬声器,不需要任何其他模块,非常简便。这里我们使用ESP8266模块的RX(串口接收)输出音频,实现硬件级别的MP3使用体验。
TX 的意思原始来于Transmit一词,意思为发送,发射
RX 的意思原始来源于Receive一词 意思为接收
TX: transmit 传送
RX: receive 接收
这个项目能想起用单片机串口的接收端放音乐,也是够可以的了
不同版本的模块的RX输出定义不同,这里放一个D1 MINI的接线图(Fritzing)
这里要是不用面包板的话把扬声器的正负极分别接正5V和rx就可以了。(事实证明RX接扬声器正极扬声器负极直接接地的音量更大)
原项目还有用NPN三极管做简易功放实现真正实用性质的音频输出的方案:
(电路图还是用代码编辑器画出来的,非常有艺术性了)
然后基本就是看看代码编译之后有没有错误之类的了
项目代码:
// esp8266 播放音频文件
#include
#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);
}
}
GITHUB是没有语言设置的,至少网页只有英文。而且访问也很困难,所以咱把上述的库和工程文件都放在了
这里
,供各位下载使用
首先想要播放的音乐需要通过ESP8266 Sketch Upload 和代码分开单独进行上传,这样的好处是代码是定死的换曲随时可以现换只要有ARDUINO ESP8266 IDE环境+ESP8266 sketch data upload 就可以用了不用到处都带着项目文件(然而还是很麻烦)
点击ESP8266 Sketch Upload之后系统会弹出提示问你要不要在项目文件夹下新建文件夹,点确定
然后找个合适的MP3文件改名为hello.mp3然后放在这个文件夹里就行了
注意MP3文件大小,太大会导致上传失败,这里如果各位有AAC(MP4音频)格式的音频咱也是建议使用的,体积比MP3更小(需要修改代码定义)。
咱这里直接用的是在线视频网站扒下来的音乐了,说实在的自己听音质还可以,能对付用
128K 立体声,不知道这个项目能不能照顾到,不少MP3方案都只照顾了一个声道,另一个声道直接扔了
然后你需要去开发板管理器设置找到对应开发板的型号,注意这里CPU要选择160Mhz
这个按钮的工具是生成spiffs的固件。你要选择正确的内存布局,esp8266 12f之类的推荐使用4m(3m spiffs)这个选项,这样MP3文件经过压缩之后上传可以最大支持占用3M空间
然后就是上传了
代码和MP3文件分别上传一次