这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【Let'sdo第3期-拾色播放器DIY】活动-03-成果贴2

共1条 1/1 1 跳转至

【Let'sdo第3期-拾色播放器DIY】活动-03-成果贴2

专家
2025-12-06 15:52:39     打赏

    本任务用到的主要器件为有源蜂鸣器,内部自带振荡源,一通电就会发出固定频率的声音。可以通过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编辑器里面,然后点击保存,程序就成功的下载到开发板里面了。

完成任务。最终的效果如下:

微信图片_20251206155806_57_368.jpg

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








共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]