蜂鸣器实验

罗大富 BigRich大约 4 分钟ESP32Python

这节课我们学习蜂鸣器,并用蜂鸣器制作电子琴。

实验原理

当涉及到蜂鸣器时,我们通常会遇到两种类型:无源蜂鸣器和有源蜂鸣器。它们在工作原理和使用方式上有所不同。

有源蜂鸣器(Active Buzzer)

有源蜂鸣器是一种集成了驱动电路的蜂鸣器,它可以直接通过电流激励产生声音,不需要外部设备。有源蜂鸣器内部集成了振片、驱动电路和共振腔。当给有源蜂鸣器提供电流时,它会根据电流的变化产生声音。有源蜂鸣器通常具有更好的声音质量和音量控制能力。在使用有源蜂鸣器时,我们可以通过控制电流的大小和频率来控制蜂鸣器的声音。一般来说,我们可以通过改变输入电流的大小来调整音量,通过改变输入电流的频率来调整音调和音乐效果。

注意

这里的 不是指电源,而是指震荡源。

无源蜂鸣器(Passive Buzzer)

无源蜂鸣器是一种简单的声音发生器,它通常由振片和共振腔组成。无源蜂鸣器不具备驱动电路,因此需要外部的电子设备来产生声音。当给无源蜂鸣器施加交变电压时,振片会振动并产生声音。无源蜂鸣器的工作频率由施加的电压频率决定。在使用无源蜂鸣器时,我们需要通过控制电压的频率和占空比来控制蜂鸣器的声音。通过改变交变电压的频率和占空比,我们可以产生不同的音调和音乐效果。

需要注意的是,无论是无源蜂鸣器还是有源蜂鸣器,其工作电压和电流都需要在规定范围内,以免损坏蜂鸣器或引起其他问题。

总结起来,无源蜂鸣器和有源蜂鸣器是两种常见的蜂鸣器类型。无源蜂鸣器需要外部设备来产生声音,而有源蜂鸣器内部集成了驱动电路,可以直接产生声音。在使用时,我们通过控制电压的频率、占空比或电流的大小和频率来控制蜂鸣器的声音。

硬件电路设计

物料清单(BOM 表):

材料名称数量
按键开关6
无源蜂鸣器1
有源蜂鸣器1
杜邦线(跳线)若干
面包板1

有源蜂鸣器正极接 D22,无源蜂鸣器正极接 D23;6 个按键依次接 D25,D26,D27,D14,D12,D13。

软件程序设计

1. 有源蜂鸣器定时器闹钟

我们可以通过外部中断和定时器中断来制作一个闹钟,按下按键时中断闹钟

import time
from machine import Pin, Timer

# 定义控制引脚对象
button = Pin(13, Pin.IN, Pin.PULL_UP)
active_buzzer = Pin(22, Pin.OUT)


# 定义 button 的外部中断函数
def button_irq(button):
    time.sleep_ms(10)
    if not button.value():
        active_buzzer.off()


# 定义定时器中断的回调函数
def timer_irq(timer_pin):
    active_buzzer.value(1)
        

# 定义定时器
timer = Timer(0)
# 初始化定时器,设置闹钟开启时间
timer.init(period=5000, mode=Timer.ONE_SHOT, callback=timer_irq)
# 设置按键中断,打断闹钟
button.irq(button_irq, Pin.IRQ_FALLING)

2. 6 音符电子琴

我们想要弹奏一首歌就需要他的乐谱,最简单的就是小星星,

蜂鸣器是通过不同的频率发出不同声调的,具体对应数值如下图:

我们可以按照上图乐谱,用 6 个按键分别控制不同的音符,代码如下:

import time
from machine import Pin, PWM

# 定义按键对象,并存储到列表中
button_1 = Pin(25, Pin.IN, Pin.PULL_UP)
button_2 = Pin(26, Pin.IN, Pin.PULL_UP)
button_3 = Pin(27, Pin.IN, Pin.PULL_UP)
button_4 = Pin(14, Pin.IN, Pin.PULL_UP)
button_5 = Pin(12, Pin.IN, Pin.PULL_UP)
button_6 = Pin(13, Pin.IN, Pin.PULL_UP)
button_list = [button_1, button_2, button_3, button_4, button_5, button_6]

# 定义无源蜂鸣器 PWM 控制对象
pos_buzzer = PWM(Pin(23, Pin.OUT))

# 定义音符对应频率
tone_list = [262, 294, 330, 350, 393, 441, 495]

# 初始化音符频率
tone = 0

while True:
    # 检测哪个按键触发
    for i in range(len(button_list)):
        if not button_list[i].value():
            tone = tone_list[i]
            print(i)
    
    # 蜂鸣器发声
    if tone:
        pos_buzzer.duty(512)
        pos_buzzer.freq(tone)
    else:
        pos_buzzer.duty(0)
        
    tone = 0
    time.sleep_ms(10) 

3. 播放音乐

我们也可以自动播放这首歌,代码如下:

import time
from machine import Pin, PWM

# 定义无源蜂鸣器 PWM 对象
pos_buzzer = PWM(Pin(23, Pin.OUT))

# 定义音调频率列表
tone_list = [262, 294, 330, 350, 393, 441, 495]

# 定义乐谱音符列表
music = [1, 1, 5, 5, 6, 6, 5, 0,
         5, 5, 4, 4, 3, 3, 2, 0,
         5, 5, 4, 4, 3, 3, 2, 0,
         5, 5, 4, 4, 3, 3, 2, 0,
         1, 1, 5, 5, 6, 6, 5, 0,
         4, 4, 3, 3, 2, 2, 1, 0]


# 自动播放音乐
for i in music:
    pos_buzzer.duty(900)
    if i:
        pos_buzzer.freq(tone_list[i-1])
        time.sleep_ms(500)
        pos_buzzer.duty(0)
        time.sleep_ms(10)

# 占空比设置为 0
pos_buzzer.duty(0)
上次编辑于:
贡献者: Luo