【得捷电子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
四、总结
上面的分享,展示了基础驱动蜂鸣器的能力。
虽然蜂鸣器发出的声音很简单,但是简单也有简单应用的场景,做一些提示音的输出,还是非常不错的。
另外,如果有多个蜂鸣器的话,还可以做相互配合,让输出的效果更加丰富。
|