[经验] 基于Arduino的简易WAV播放器

[复制链接]

分类版主

发表于 2014-10-9 17:41:27   8136 查看 9 回复 显示全部楼层 倒序浏览
分享
本帖最后由 goyuqinghua 于 2014-10-9 17:53 编辑

一、概述
该简易WAV播放器基于Arduino UNO结合自制的低通滤波器制作完成,该WAV播放器通过UNO产生PWM信号然后经过低通滤波器使存储在UNO内部flash中的PCM数据发声的过程,其实该播放器不能纯粹的说是一个WAV播放,因为笔者通过工具将WAV文件中的PCM数据提取出来以数组的形式存储在UNO的内部flash中,该DIY教程只是给读者一个启示,读者可以根据这个思路制作更加强大的基于SD卡的WAV播放器,该播放器制作简单、方便DIY,只要弄懂了发声原理就可以很方便的在不同的平台上制作功能强大的WAV播放器,该播放器可运用在简单的语音播报系统、电子琴中。
二、原理讲解
2.1、数字音频基础
2.1.1、数字音频基础知识介绍
数字音频技术的基本原理和处理方法,就是采用ADC模数转换器,对模拟的音频信号进行采样、量化、编码后转换成数字化的音频数据和文件进行保存,当然,在播放的时候,还需要将数字化的音频数据经过DAC数模转换器,恢复到模拟信号形式由发声器件播放出来。
根据音频信号的应用范围的不同,模拟音频数字化ADC过程中采用的采样频率和量化精度也是不同的,通常的标准如下表所示。
  
实用领域
  
模拟信号的频率范围
ADC采样频率
ADC量化位数
电话音质
2-----4KHZ
8KHZ
8bit
广播音质
50Hz-----11KHz
22.05KHz
8--12bit
CD音质
20Hz-----20KHZ
44.1KHz
16bit
从上表中可以看到,根据采样定理,针对不同音质的音频信号,数字音频ADC的采样频率都是模拟信号最高频率的2倍,另外音质要求越高,ADC量化位数也越高,实际上人的耳朵对1/256级(8位)精度的变化基本上已经分辨不出了,但对于CD音质,还是采用了16位的量化位数,精度达到1/65536,很明显,音质越高的数字音频,数据量也越大,对于1秒钟的音频信号,如果是电话质量的数字音频,其数据量是8K字节,

一个字节存放一个采样点的电平值,而要获得CD音质,1秒钟的采样数据就需要88.2k个字节存放,如果是双声道立体声,数据量就是176.4K字节/秒。
最典型的数字音频数据文件就是WAV类型的文件,它通常采用最原始的PCM编码方式存放每个采样点的原始数据,没有经过任何的压缩处理,现在配有声卡(不管是集成或独立)都有麦克风插口,在WINDOWS平台的支持下,可以进行录音,把声音变成数字音频文件保存在电脑中,这个文件就是将一个一个原始采样按顺序记录保存的WAV格式文件,因此,只要按照采样频率的速度,把这些音频数据一个一个的读出后,通过DAC转换成模拟信号,就可以得到还原的声音了。
2.1.2WAVE数字音频文件格式简介
WAVE格式的文件(扩展名为wav)是多媒体数字音频中使用的基本音频格式之一,它是以RIFF格式为标准的,RIFF是英文ResourceInterchange File Format的缩写,每个WAVE文件的头四个字节便是“RIFF”。
WAVE文件是由若干个Chunk(块)组成的,按照在文件中通常出现的位置包括有:RIFF WAVE Chunk,Format Chunk,Fact Chunk(可选),DataChunk,LIST Chunk(可选)等,其中除了RIFFWAVE Chunk,Format Chunk,Data Chunk是必须的以外,其它是可选的。
2.1.3、从WAV文件中获取PCM音频数据
PC机中有许多WAV格式文件,其实WINDOWS的提示音都是采用WAV格式的文件,我们也可以自己利用PC机和相关软件来制作自己需要的音频文件,在我们提供的资料中有一个读者制作好的WAV文件“会说话的单片机.wav”,使用WINHEX软件可以直接以二进制的格式(显示为16进制方式)查看文件具体内容,下图是使用WINHEX软件打开该文件的显示内容。


clip_image002.jpg

2.2PWM讲解

2.2.1、什么是PWM
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在

从测量、通信到功率控制与变换的许多领域中。

2.2.2PWM产生过程
最常见的微控制器的功能是一个定时器。这是一个简单的内部时钟,然后递增到某个值,然后返回到零。通过这些定时器产生PWM,通过外部引脚输出高电平当计时器到达零,然后输出低电平当计数到另一个值时,你可以改变。在这种方式中,可以使输出引脚在一个特定时间中保持高电平,而不必手动切换它的代码。如果你输出管脚通过低通滤波器你可以得到平均值。

2.2.3PWM实现ADC功能
在pwm输出引脚上通过由电阻R和电容C构成的简单积分电路,滤掉高频进行平滑后,在音频输出口上就可以得到模拟音频输出,这里以我们提供的wav文件为例,由于生成的pwm的频率为8KHz,因此PWM的输出信号中包含许多大于8K的高频信号成分,所以由电阻R和电容C构成的低通滤波器的截止频率应该在6KHz左右,以能够把8K以上的高频信号给滤掉,保留4KHz一下的模拟信号。
电阻电容构成的低通滤波器截止频率的计算公式为F=1/2∏RC,将数据代入计算得:
1/(2*3.1415*2700*0.00000001)=5897.6Hz,因此由R=2.7k,C=0.01uF构成的低通滤波器的截止频率大约为5.9KHz.

三、制作准备
clip_image004.jpg

硬件:                                                           软件:
1、USB小音响                                      AVR studio 4.19
2、数字按键                                           Winavr-2010
3、Freduino UNO
4、4x6cm万能板
5、杜邦线
6、耳机插口
注意:因为笔者觉得有些代码在AVR studio编写比在Arduino IDE中更加的方便所以提供的例程是AVR studio的例程,读者想要在ArduinoIDE中使用这个代码只要稍微修改一下就可以了。
四、制作过程
1、用烙铁按照下图电路图所以将低通滤波器焊接在4x6cm的万能板上
clip_image005.jpg
clip_image006.jpg
file:///C:/DOCUME~1/YUQING~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image004.jpg


2、将上图焊接的低通滤波的输入信号接入UNOD6引脚,并将滤波器与UNO共地
clip_image007.jpg
file:///C:/DOCUME~1/YUQING~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image006.jpg
3、将数字按键插入UNO中的A1中如下图所示
clip_image008.jpg
file:///C:/DOCUME~1/YUQING~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image008.jpg

4、USB音响的耳机口插入低通滤波器的输出端的耳机插口中
clip_image009.jpg
以上步骤完成后,将UNO上电,并将代码下入UNO中,按下数字按键就会听到USB音响有声音发出。
clip_image003.jpg
标签:flash flash flash Arduino WAV播放器

实习生

发表于 2014-10-31 13:55:06  

PCB在线计价下单

板子大小:

cm
X
cm

层数:

2

板子数量:

10

厚度:

1.6
哦,这个好像做起来挺麻烦的
回复

点赞

实习生

发表于 2014-12-9 23:00:16  
比较高深的玩法,不错哦
回复

点赞

实习生

发表于 2015-1-9 16:44:39  
做起来挺麻烦的
回复

实习生

发表于 2015-6-5 16:30:43  
学习下 好东西..........................
回复

工程师

发表于 2015-7-23 22:10:20  
路过,阅读了一下,增长了知识                 
回复

点赞

等待验证会员

发表于 2015-9-8 14:27:30  
求源代码,不知道怎么将PCM音频数据播放出来……
回复

点赞

等待验证会员

发表于 2015-11-3 14:27:03  
跪求代码。。。
回复

等待验证会员

发表于 2015-12-5 12:14:56  
这个好像做起来麻烦的我不會搞
回复

点赞

实习生

发表于 2017-5-19 11:35:18  
有深度
回复

高级模式
您需要登录后才可以回帖 登录 | 注册

专家问答 查看更多>>
关闭

站长推荐 上一条 /7 下一条

小黑屋|手机版|Archiver| 电子发烧友 ( 粤ICP备14022951号-2 )     

GMT+8, 2017-5-29 19:26 , Processed in 0.109304 second(s), 14 queries , Memcache On.

微信扫描
快速回复 返回顶部 返回列表
-

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

我的提问

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

单片机/MCU论坛

FPGA|CPLD|ASIC论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

-

硬件设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PCB设计论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

树莓派论坛

智能硬件论坛

开发快智能硬件开发平台

Intel物联网开发者专区

Waveshare

乐美客SBC专区

Arduino论坛

BeagleBone论坛

机器人论坛

创客神器NanoPi

小钢炮CANNON

比派科技banana pi专区

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

个人版区

阿东Verilog技术专版

直流马达驱动电路设计

LabVIEW英雄联盟

特权同学FPGA专区

-

厂商专区

灵动微电子 MM32

盈鹏飞嵌入式

TI论坛

TI Deyisupport社区

芯灵思嵌入式论坛

Tisan

米尔科技

庆科社区

WIZnet技术专区

Cypress技术论坛

飞凌嵌入式

Qualcomm技术论坛

英创嵌入式

机智云GoKit论坛

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区