蜂鸣器

原理简介

蜂鸣器是一种把电信号变成声音的器件。

  • 工作原理:压电片或电磁线圈在交变/通电信号下振动发声
  • 两种必须分清:
    • 有源蜂鸣器:内部自带振荡电路,通电就响,只能「响 / 不响」,不能变调
    • 无源蜂鸣器:内部没有振荡电路,必须给它一定频率的方波才响,改变频率就能变调、能放音乐
  • 接口:有源用 GPIO 数字输出(Pin.OUT);无源用 PWM + freq()

典型应用

  • 按键提示音
  • 报警、故障提醒
  • 上电 / 完成提示
  • 简单音乐(无源)
  • 倒计时、闹铃

接线图

[接线图占位,后续添加]

文字说明(具体接法见下方代码注释):

  • 蜂鸣器模块:VCC → Pico 3V3(或 5V,看模块标注)、GND → GND、I/O(信号) → GPIO(如 GP15)
  • 裸蜂鸣器(非模块):要串限流电阻;若电流超过 GPIO 上限,需加三极管驱动,不要直接硬拉 GPIO
  • 优先用自带三极管驱动的蜂鸣器模块,GPIO 只需很小的控制电流,最安全

示例代码

基础示例:有源蜂鸣器(响 / 不响)

# ============ 接线 ============
# 有源蜂鸣器模块: VCC → Pico 3V3(或 5V,看模块标注)
#                  GND → Pico GND
#                  I/O(信号) → Pico GP15
# 注意:有源蜂鸣器内部有振荡电路,给高电平就一直响,只能响/不响,不能变调
#       如果用的是裸蜂鸣器(非模块),电流可能不够,要加三极管驱动
# =============================
from machine import Pin
import time

buzzer = Pin(15, Pin.OUT)

print('有源蜂鸣器测试')
while True:
    buzzer.on()     # 响
    time.sleep(0.5)
    buzzer.off()    # 不响
    time.sleep(1)

进阶示例:无源蜂鸣器(音调 / 音乐)

# ============ 接线 ============
# 无源蜂鸣器模块: VCC → Pico 3V3(或 5V)
#                  GND → Pico GND
#                  I/O(信号) → Pico GP15
# 注意:无源蜂鸣器内部没有振荡电路,必须用 PWM 给一定频率的方波才会响,
#       改变频率就能变调;用 Pin.OUT 直接驱动它是不会响的
# =============================
from machine import Pin, PWM
import time

pwm = PWM(Pin(15))

# 不同音调的频率(Hz)
tones = {
    'C4': 262, 'D4': 294, 'E4': 330, 'F4': 349,
    'G4': 392, 'A4': 440, 'B4': 494, 'C5': 523,
}

def play_tone(frequency, duration):
    pwm.freq(frequency)   # 设置音调
    pwm.duty_u16(32768)   # 50% 占空比,声音最清晰
    time.sleep(duration)
    pwm.duty_u16(0)       # 停止发声
    time.sleep(0.1)       # 音与音之间留间隔

print('无源蜂鸣器 - 音阶')
for name in ['C4', 'D4', 'E4', 'F4', 'G4', 'A4', 'B4', 'C5']:
    play_tone(tones[name], 0.3)

print('播放旋律')
melody = [
    ('C4', 0.2), ('D4', 0.2), ('E4', 0.2), ('F4', 0.2),
    ('G4', 0.2), ('A4', 0.2), ('B4', 0.2), ('C5', 0.2),
]
for tone, duration in melody:
    play_tone(tones[tone], duration)

pwm.deinit()

应用示例:报警声(无源)

# ============ 接线 ============
# 无源蜂鸣器模块: VCC → Pico 3V3(或 5V)
#                  GND → Pico GND
#                  I/O(信号) → Pico GP15
# 注意:无源蜂鸣器必须用 PWM 给方波,Pin.OUT 直接驱动不会响
# =============================
from machine import Pin, PWM
import time

pwm = PWM(Pin(15))

def alarm():
    pwm.freq(1000); pwm.duty_u16(32768); time.sleep(0.5)  # 高音
    pwm.freq(500);  time.sleep(0.5)                        # 低音
    pwm.duty_u16(0)

print('报警声')
for _ in range(3):
    alarm()
    time.sleep(0.5)

pwm.deinit()

注意事项

  • 先分清有源 / 无源:有源背面封着黑胶、通电就响;无源能看到线圈和磁片、必须给方波。拿不准就试:接 GPIO 给高电平,响的是有源,不响的是无源。
  • 有源蜂鸣器:只能响 / 不响,给它 PWM 也不能变调(内部振荡频率固定)。
  • 无源蜂鸣器:必须用 PWM 输出方波(freq() 变调);用 Pin.OUT 直接驱动不会响。
  • 电流:裸蜂鸣器电流可能超过 GPIO 上限,优先用自带三极管驱动的模块;模块 VCC 接 3V3 或 5V 看标注。
  • 音量:duty_u16 占空比约 32768(50%)声音最稳,太大反而可能破音。

常见问题

Q: 蜂鸣器完全不响? A: 先判断有源/无源。有源:检查 I/O 给的是不是高电平、VCC/GND 接好没。无源:必须用 PWM 给方波,Pin.OUT 直接驱动不会响。

Q: 有源蜂鸣器响了但不能变调? A: 正常。有源内部有固定振荡电路,只能响/不响,想变调要换无源蜂鸣器。

Q: 无源蜂鸣器声音很小或发沙? A: 占空比调到 32768(50%)试试;确认频率在 200~3000Hz 范围,太低/太高都不好听。