一、蜂鸣器播放音乐
说到单片机播放音乐,你首先想到的应该是无源蜂鸣器或喇叭。( 由于无源蜂鸣器的工作原理与扬声器相同,这里混为一谈,但实际使用仍存在差异 ),无论是51、Arduino、亦或是STM32.蜂鸣器用于播放音乐。无源蜂鸣器被广泛使用,从电子贺卡、玩具到上个世纪的康瑞达电脑
在Arduino以下函数常用于驱动蜂鸣器:
Tone(蜂鸣器引脚, 输出频率);/// 蜂鸣器在指定的引脚输出中发出声音 noTone(蜂鸣器引脚); // 停止指定引脚PWM输出,使蜂鸣器不发声
播放音乐的方式:
优点有:
- 成本低,通常只需要蜂鸣器。对于更高的要求和更高的声音要求,只需添加三极管和电阻,并添加二极管保护。
- 电路设计简单,
缺点有:
- 你需要一个定时器来输出大量的资源PWM,一定的空间(内部RAM\ROM或外部ROM)
- 占用大部分系统时间,切换频率等
- 由于Arduino没有DAC,播放的音乐只是勉强能听,方波输出和模拟输出还是有很大区别的
- 对于某些IO教程直接驱动蜂鸣器、扬声器,对于开发版来说,它是炸弹,从燃烧到燃烧IO,重要的是带走开发版和传感器(这里涉及电感知识,感兴趣的朋友可以去看B站up 罗兹新一期关于继电器的视频)
二、MP3模块播放音乐
今天,国产的MP3模块已经很流行了,比如JQ6500、JQ8900等,使用MP三模块连接单片机,既能简单地播放音乐,又能控制EQ、音量、随意暂停播放插播歌曲、查询歌曲名字、歌曲时长等。他的操作就像老式一样MP三、只需将他连接到电脑上,存放歌曲即可。
在Arduino以下函数常用于驱动MP3模块:
// 使用串口控制 dat = Serial.read(); Serial.write(dat); // IO或单总线控制 delay(ms); delayMicroseconds(us); digitalWrite(io, LOW); digitalWrite(io, HIGH);
播放音乐的方式:
优点有:
- 占用IO少,一个IO可播放数百首音乐
- 占用资源少,MP3模块支持IO即使是手动开关也可以控制触发、单总线控制、串口控制等,也不需要使用单片机昂贵的空间来存储音频文件。
- 与蜂鸣器相比,音频播放效果好,差别很大
- 音量可调,更换音频文件无需再次烧录程序
- 电路设计简单
缺点有:
- 与蜂鸣器相比,价格确实有点贵。一套基本要10元左右。
- 功耗更大,因为有专用功放和DSP、DAC等电路的功耗会比蜂鸣器大
三、用解码器播放音乐
使用音频解码模块 功放 存储模块的方法是STM32中比较常见,在低端单片机中并不多见,使用VS1053 该方法仅适用于高端单片机,内存卡模块进行实时音频输出,然后通过功放大来推动喇叭,它不仅对单片机性能要求高,而且对硬件电路设计和开发人员水平也要求高。
在Arduino在这种方式下,驱动代码复杂,不同型号的解码器驱动方式也大不相同,所以这里不列出参考代码。
对于这用播放音乐的方式:
优点有:
- 不仅支持音频解码,还支持音频编码。说人话就是支持录音和播音。
- 音频质量会比MP3模块的好。
- 支持双声道甚至更高的声道数。
缺点有:
- 价格昂贵,需要多芯片的配合
- 对单片机和开发者的要求很高
- 复杂的电路设计
四、总结
综合以上
2021年今天用蜂鸣器播放音乐,不仅麻烦,还需要将音频文件转换为频率文件,浪费单片机昂贵的存储空间(如果使用内存卡,内存卡还需要内存卡模块,价格就会上涨。EEPROM或flash,开发人员还需要知道如何烧录此类芯片),冒着开发版烧毁的风险,(向你推荐这类教程的人没有好心);
使用特殊的驱动芯片和内存卡播放音频更有意义。无论是价格、资源占用还是对开发者知识储备的要求,都不是最佳解决方案;
使用MP3模块,价格不高也不低,对知识储备的要求很低。(只要你能把单片机拉高拉低IO电平可以开始,这是入门教程blink已经教给你了)