1615|3

253

帖子

3

TA的资源

纯净的硅(初级)

楼主
 

【得捷电子Follow me第3期】任务3:控制蜂鸣器播放音乐(播放小星星) [复制链接]

  本帖最后由 HonestQiao 于 2023-11-11 22:15 编辑

这次的Seeed Studio XIAO ESP32C3扩展板上,自带了一个无源蜂鸣器,可以做一些提示音效果或者midi音乐的播放。

下面是具体的使用过程分享。

 

一、了解硬件

首先通过官方资料,了解扩展板上蜂鸣器的具体情况:

 

从上图可以看到,蜂鸣器连接到了A3引脚。

 

然后,再看开发板部本身:

 

从上图可以看到 A3对应了GPIO5。

那么在我们的程序中,要驱动这个蜂鸣器,实际上就要操作GPIO5。

 

二、驱动蜂鸣器

无源蜂鸣器的驱动,要使用方波来驱动,这一点可以使用PWM输出来进行控制。

蜂鸣器通常分为有源和无源,有源蜂鸣器内部带震荡源,所以只要一通电就会叫,也就是用高低电平控制。

而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫,必须用2K-5K的方波去驱动它。

正是因为使用的方波频率不同就造成了蜂鸣器发出的声音的差异。

 

首先,我们可以在Thonny的Shell窗口,使用下面的指令进行测试:

# 引入响应的控制对象
from machine import Pin, PWM

# 设置PWM输出到蜂鸣器对应的GPIO5
buzzer = PWM(Pin(5, Pin.OUT))

# 关闭PWM占空比为0,不上电
buzzer.duty_u16(0)

# 设置输出频率为100的
buzzer.freq(100)

# 设置占空比:duty_u16 / 65535
buzzer.duty_u16(1000)

 

在Shell依次执行上述代码,就能听到蜂鸣器发出声音。

修改 buzzer.freq(100) 为 buzzer.freq(200) 或者其他值,就能改变发生的声音了。

 

三、驱动蜂鸣器播放小星星

知道驱动蜂鸣器的原理了,就可以用蜂鸣器来播放简单的音乐了,下面来播放小星星这首歌曲。

 

小星星的简谱如下:

  这首曲子简单明快,非常适合用蜂鸣器来进行播放。

 

然后,我们来看一下音符频率的对应关系:【 参考:【五线谱】音高表示 ( 低音谱号 | C1 36 音符音高表示 | C2 48 音符音高表示 | C3 60 音符音高表示 )_高音c1

 

通过上面的图表,我们就可以定义音调频率的对应关系了:

# 定义音调频率
# 低音
# tones = {'1': 262, '2': 294, '3': 330, '4': 349, '5': 392, '6': 440, '7': 494, '-': 0}
# 中音
tones = {'1': 523, '2': 587, '3': 659, '4': 698, '5': 784, '6': 880, '7': 988, '-': 0}

 

然后,通过下面的代码,就能播放对应的音调了:

# 音调编号
tone=1

# 查找频率
freq = tones[tone]

# 输出声音
buzzer.freq(freq)
buzzer.duty_u16(1000)

在上述代码中,tone代表要播放的音符,通过音符查找对应的频率,然后进行输出。

 

基于以上代码,最终播放小星星的代码如下:

from machine import Pin, PWM
import utime

# 定义音调频率
# 低音
# tones = {'1': 262, '2': 294, '3': 330, '4': 349, '5': 392, '6': 440, '7': 494, '-': 0}
# 中音
tones = {'1': 523, '2': 587, '3': 659, '4': 698, '5': 784, '6': 880, '7': 988, '-': 0}

# 定义小星星旋律
melody = "1155665-4433221-5544332-5544332-1155665-4433221"

# 设置A3(GPIO 5)口为IO输出,然后通过PWM控制无缘蜂鸣器发声
buzzer = PWM(Pin(5, Pin.OUT))

for tone in melody:
    freq = tones[tone]
    if freq:
        buzzer.freq(freq)
        buzzer.duty_u16(1000)
    else:
        buzzer.duty_u16(0)  # 空拍时一样不上电
    # 停顿一下 (四四拍每秒两个音,每个音节中间稍微停顿一下)
    utime.sleep_ms(400)
    buzzer.duty_u16(0)  # 设备占空比为0,即不上电
    utime.sleep_ms(100)

buzzer.deinit()  # 释放PWM

 

运行上述代码,最终播放效果如下:

4421_1699711579

 

四、总结

上面的分享,展示了基础驱动蜂鸣器的能力。

虽然蜂鸣器发出的声音很简单,但是简单也有简单应用的场景,做一些提示音的输出,还是非常不错的。

另外,如果有多个蜂鸣器的话,还可以做相互配合,让输出的效果更加丰富。

 

最新回复

感谢楼主提供的技术分享,先收藏学习再发表个人意见,顶起来   详情 回复 发表于 2023-11-21 15:04
点赞 关注
 
 

回复
举报

6587

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

 编程的关键点是 buzzer.freq(100) 为 buzzer.freq(200) 或者其他值,,,

这种单个蜂鸣器音调听着也是很清晰的,多个蜂鸣器的编程会麻烦一些

点评

是的,实际上就是方波驱动。  详情 回复 发表于 2023-12-14 23:45
 
 
 

回复

731

帖子

4

TA的资源

纯净的硅(高级)

板凳
 

感谢楼主提供的技术分享,先收藏学习再发表个人意见,顶起来

 
 
 

回复

253

帖子

3

TA的资源

纯净的硅(初级)

4
 
Jacktang 发表于 2023-11-12 08:36  编程的关键点是 buzzer.freq(100) 为 buzzer.freq(200) 或者其他值,,, 这种单个蜂鸣 ...

是的,实际上就是方波驱动。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表