本任务用到的主要器件为有源蜂鸣器,内部自带振荡源,一通电就会发出固定频率的声音。可以通过PWM获得层次感的声音。
有源蜂鸣器的详细介绍如下:
蜂鸣器模块的主要组件是一个压电蜂鸣器。压电蜂鸣器可以连接到数字输出,当输出为高电平时会发出音调。或者,它可以连接到模拟脉宽调制输出以生成各种音调和效果。
工作电压:3.3V/5V,声音输出≥85dB,谐振频率:2300±300Hz
该蜂鸣器的引脚定义如下:
1引脚--------5V(接红色5V电源正)
2引脚--------GND(接黑色)
3引脚--------不连接
4引脚--------控制引脚PWM
蜂鸣器和音阶的配合是通过不同频率的PWM实现的,我们本次任务选择了8个音阶:“哆瑞米发嗦啦西哆”,主要组成是C大调,每个音符都有其特定的频率,八个音符的名字及其对应的音高分别是:
哆(Do) : C4 261.63 Hz
瑞(Re) : D4 293.66 Hz
米(Mi) : E4 329.63 Hz
发(Fa) : F4 349.23 Hz
嗦(Sol): G4 392.00 Hz
啦(La) : A4 440.00 Hz
西(Ti) : B4 493.88 Hz
哆(Do): C5 523.25 Hz
给蜂鸣器的电源引脚供电3.3V,把蜂鸣器的第4引脚连接到开发板的D13引脚上,这里用D2按键来出发控制输出声音。
相关的源代码程序如下(这里说明下给的文件里面的程序不能直接跑,有问题,需要在前面添加三个导入声明
import time
import board
import digitalio
并在后面加入对按钮的定义引用:
# 定义按键
button2 = digitalio.DigitalInOut(board.D2)
button2.switch_to_input(pull=digitalio.Pull.DOWN)
):
import time
import board
import digitalio
import pwmio
# 定义按键
button2 = digitalio.DigitalInOut(board.D2)
button2.switch_to_input(pull=digitalio.Pull.DOWN)
# 设置蜂鸣器连接的引脚(D13)
pwm = pwmio.PWMOut(board.D13, duty_cycle=0, frequency=440, variable_frequency=True)
# 8 音阶频率(C4, D4, E4, F4, G4, A4, B4, C5)
note_names = ['C4', 'D4', 'E4', 'F4', 'G4', 'A4', 'B4', 'C5']
frequencies = [261, 293, 329, 349, 392, 440, 493, 523]
# 按键防抖延迟
DEBOUNCE_TIME = 0.2 # 防抖延时(秒)
# 音符播放时长(秒)
NOTE_DURATION = 0.5 # 每个音符的最大播放时长(秒)
# 音符播放控制函数
def play_note(note):
if note in range(len(note_names)):
names = note_names[note]
freq = frequencies[note]
print(f"Playing {names} at {freq} Hz")
pwm.frequency = int(freq)
pwm.duty_cycle = 2 ** 15
else:
print(f"Note {names} is not valid in the scale")
# 停止播放音符
def stop_playing():
pwm.duty_cycle = 0
note_index = 0 # 当前音符的索引
last_button_state = False # 上一次的按键状态(上拉状态下,未按下为False)
note_start_time = time.monotonic() # 记录音符播放开始的时间
# 示例调用
while True:
# 检测按键是否按下(低电平表示按下)
current_button_state = button2.value # 获取当前按键状态
if not current_button_state and last_button_state: # 按键刚被按下(由高电平变低电平)
stop_playing() # 停止当前音符(如果正在播放)
play_note(note_index) # 播放下一个音符
# 切换到下一个音符,若达到最后一个音符则从头开始
note_index = (note_index + 1) % len(note_names)
# 重置音符开始播放的时间
note_start_time = time.monotonic()
# 防抖处理
time.sleep(DEBOUNCE_TIME)
# 自动停止音符播放
if time.monotonic() - note_start_time > NOTE_DURATION:
stop_playing() # 超过最大播放时长后停止播放
note_start_time = time.monotonic() # 记录下一个音符的开始时间
last_button_state = current_button_state # 更新按键状态
time.sleep(0.01) # 稍微等一下,避免CPU占用过高
把以上代码直接复制到Mu编辑器里面,然后点击保存,程序就成功的下载到开发板里面了。
完成任务。最终的效果如下:

可以看到屏幕上正确的显示出控制的音调和对应的频率,实际蜂鸣器也对应响起对应的声音。
我要赚赏金
