图吧小白教程 篇四十:用ESP8266 WIFI模块自制MP3
创作立场声明:下次是不是该教各位用硬盘放音乐了
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播放各种格式音乐的项目
这个项目支持使用基于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存储分配
具体可以分为几部分
代码区
又叫做程序存储区,其中又区分为当前代码区(current Sketch),更新代码区(OTA update);
文件系统
这个就是我们这节重点讲解的SPI Flash File System,简称SPIFFS闪存文件系统。
即使文件系统与程序存储在同一个闪存芯片上,烧入新的代码也不会修改文件系统内容。这允许使用文件系统来存储Web服务器的代码数据、配置文件或内容。而这个SPIFFS文件系统的大小可以通过烧写环境来配置,目前一般有1M,2M,3M等等。本作中如果使用基于ESP12E 12F的开发板(NodeMcu,D1,D1 MINI),可以配置成3M;
EEPROM
WiFi Config
这个区域就是我们设置WiFi模块配置的时候存储的数据。
关于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 IDE的安装,可以在文件-首选项-附加开发板管理器里面输入这个网址,然后在工具-开发板-开发板管理器中搜8266就可以在线安装了
如果没有找到的话建议各位直接用8266_离线包,这个上期ESP8266做WIFI钟的项目里面阿卡林大佬提供了,没有的话应该上网也能找到,这里咱就不放下载链接了各位自己动手试试
然后就可以安装库了。这次我们需要安装两个库,一个是ESP8266_Spiram,另一个是主角ESP8266Audio了(压缩包我们在文中提供了)。安装库的基本方法还和上次一样,下载好ZIP之后直接项目-加载库-添加.zip库就行了。
库的离线安装:
arduino IDE >= 1.8.0:
解压该文件,并将解压出的文件夹放到 文档/Arduino/libraries中,如C:Users用户名DocumentsArduinolibraries
arduino IDE < 1.8.0
解压该文件,并将解压出的文件夹放到Arduino IDE的所在文件夹中的libraries文件夹内,如D:Programarduino-1.6.11libraries
就可以了
然而这个ESP8266 Sketch Data Upload并不是这样安装的
电脑---文档---Arduino---新建一个tools--随后将压缩包内的ESP8266FS文件夹整个拖进tools里----重新打开IDE,工具栏里就有ESP8266 sketch data upload了。我之前按安装库的办法给这个压缩包解压到Arduinolibraries里结果各种报无效库之后卡了挺长时间才想明白哪错了。
如果你有系统管理员权限,那么这个JAR文件最后应该是在C:UsersAdministratorDocumentsArduinotoolsESP8266FStool这个位置
然后有了库和对8266文件上传工具之后,就可以开始硬件搭建了
硬件方面除了8266开发板之外只需要一个小扬声器,不需要任何其他模块,非常简便。这里我们使用ESP8266模块的RX(串口接收)输出音频,实现硬件级别的MP3使用体验。
TX 的意思原始来于Transmit一词,意思为发送,发射 RX 的意思原始来源于Receive一词 意思为接收 TX: transmit 传送 RX: receive 接收
这个项目能想起用单片机串口的接收端放音乐,也是够可以的了
不同版本的模块的RX输出定义不同,这里放一个D1 MINI的接线图(Fritzing)
这里要是不用面包板的话把扬声器的正负极分别接正5V和rx就可以了。(事实证明RX接扬声器正极扬声器负极直接接地的音量更大)
原项目还有用NPN三极管做简易功放实现真正实用性质的音频输出的方案:
(电路图还是用代码编辑器画出来的,非常有艺术性了)
然后基本就是看看代码编译之后有没有错误之类的了
项目代码:
// esp8266 播放音频文件
#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 donen");
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文件分别上传一次
这会儿你不应该把扬声器连接在开发板上的,不然程序也好文件也好会上传不上去(单片机开发板上的RX电平被拉高/拉低了)
上传过程可能会有点卡,一开始咱能看到8266模块闪灯但是屏幕不动,过一会儿灯不闪了屏幕就显示上传好了
视频效果:ESP8266(D1 mini nodemcu)播放mp3
视频效果2(改进了硬件接线,把扬声器直接插RX和GND接地上之后音量大了不少,模块也没炸):【ESP8266】《过年》
这里的代码在ESP8266启动后只播放一次音乐,如果需要更加进阶的功能,请自行探究方案(已知的用途有给模块加上自带启动音乐、定时闹钟、给WIFI钟加上整点报时等等),已知的方案可以实现按动式播放控制、单曲循环等等……
(个人认为单纯为了加重复播放的功能而添加物理按键意义不大,既然怎么都需要物理按键而不是自动单曲循环的话按RESET和这种方法基本没有什么区别,不如试试加暂停功能)
总结:这个项目在ESP8266的开发中只是非常简单的一个应用,但是它代表了ESP8266系列产品的性能水平以及反映了技术进步在实际应用场合带来的变化。过去在用51和AVR搞项目的那个时代,要想播放波形音乐是基本不可能的,所有涉及到音频的场合基本都是8BIT风格的电子音乐,想要听波形音乐得靠别的模块
这种MP3解码模块或者在自制行车安全提醒器:行车不规范,亲人两行泪教程里用的复读机模块:
ISD1820复读机模块,本质上性能非常非常弱 只支持10秒语音录放,勉强说完亲人两行泪就没内存了
而如今我们随便用10块钱包邮买个8266模块开发板就可以用模块本身解码输出波形音频了,这就是时代的进步
成本方面,虽然单体MP3模块非常非常便宜之前也说过不到5块钱就能买到非常实用的MP3模块(支持SDHC,支持WAV MP3等格式,还支持SD卡U盘以及可以用锂电供电 自带3W单声道功放),但是算上储存器的成本和实际嵌入式应用的场合的话,能用ESP8266玩音乐绝对是非常有用的技能,比接个屏幕放BAD APPLE有用得多,咱虽然有点二次元但是咱可不二,虽然用模块驱动屏幕搞动画可以侧面反映模块的性能也可能在别的项目上有点次要功能,但是单纯为了播放画面而搞项目没有意义(而且这些人还互相指责抄袭甚至动用十万量级的粉丝群互殴实在是把咱给恶心坏了)。
然而ESP8266Audio项目不一样,虽然没有成品MP3方案使用,但是这种依靠模块自身就能播放音频的功能让ESP8266在IOT应用场合下的实用性极大的增强了,我认为各位如果有能力进行深入开发应当利用好ESP8266模块的这个能力。单纯从实用性来看,模块的FLASH大小可以支持非常长时间的压缩过的音频文件了,而且模块本身的音量还是挺大的,使用的时候模块本身的发热也很小,执行效率很高,因此可以简单认定这个项目非常具有实用性。
参考资料:张业生:ESP8266播放音频文件
比简书上的教程管用,之前简书搜出来的教程看得我云里雾里代码回来还各种编译错误,正当咱焦头烂额的时候阿卡林大佬给咱们提供了这个教程的链接,结果咱一下子就会了,这里感谢大佬的指点了。参考资料的源码地址 iot-lesson aREST
最后祝各位身体健康
胖狮子王
校验提示文案
lj沟东黑我号
校验提示文案
园绮羽露
校验提示文案
每天上班时间上张大妈
校验提示文案
好风2020
校验提示文案
sunnyquan
校验提示文案
值友6851181095
校验提示文案
武德斯托夫
校验提示文案
值友4155875499
校验提示文案
excaliburback
校验提示文案
excaliburback
校验提示文案
值友4155875499
校验提示文案
武德斯托夫
校验提示文案
值友6851181095
校验提示文案
sunnyquan
校验提示文案
好风2020
校验提示文案
lj沟东黑我号
校验提示文案
每天上班时间上张大妈
校验提示文案
园绮羽露
校验提示文案
胖狮子王
校验提示文案