实现蜂鸣器驱动,并播放八阶音符;
一、了解蜂鸣器
无源蜂鸣器是一种依赖外部驱动信号发声的电子元件,其核心原理、结构特点、驱动方式及应用场景如下:
核心原理
无源蜂鸣器基于电磁感应原理工作:
音圈与磁场交互:当外部驱动信号通过音圈时,音圈产生交变磁场,与内部永磁铁相互作用,形成周期性吸合或排斥力。
振膜振动发声:这种力推动振膜振动,振膜的振动传递到空气中,从而产生声音。
频率依赖性:发声频率完全由输入信号的频率决定,因此可通过调节驱动信号实现音调变化。
结构特点
无源蜂鸣器内部结构相对简单,主要包括:
永磁铁:提供固定磁场。
电磁铁(音圈):通入交变电流后产生可变磁场。
振膜:将磁场变化转化为机械振动,进而发声。
外壳:保护内部元件,优化声学效果。
驱动方式
无源蜂鸣器需外部提供特定信号才能发声:
驱动信号要求:需输入2K~5kHz的方波信号,通过调节频率控制音调,调节占空比控制音量。
直流电限制:若接入直流电,仅能在电路通断瞬间产生短暂声响,无法持续发声。
典型驱动电路:包含三极管、续流二极管、滤波电容等元件,以增强驱动能力并稳定信号。
二、代码
import time
import board
import pwmio
class BuzzerPlayer:
def init(self, pin=board.A0, base_volume=0.6):
"""初始化蜂鸣器播放器"""
self.buzzer = pwmio.PWMOut(
pin,
duty_cycle=0,
frequency=440,
variable_frequency=True
)
self.base_volume = base_volume
# 音符频率表
self.notes = {
"C4": 261.63, "CS4": 277.18, "D4": 293.66, "DS4": 311.13,
"E4": 329.63, "F4": 349.23, "FS4": 369.99, "G4": 392.00,
"GS4": 415.30, "A4": 440.00, "AS4": 466.16, "B4": 493.88,
"C5": 523.25, "CS5": 554.37, "D5": 587.33, "DS5": 622.25,
"E5": 659.25, "F5": 698.46, "FS5": 739.99, "G5": 783.99,
}
def play_tone(self, freq, duration, volume=None):
"""播放指定频率的声音"""
if volume is None:
volume = self.base_volume
if freq > 0:
self.buzzer.frequency = int(freq)
self.buzzer.duty_cycle = int(volume * 65535)
time.sleep(duration)
if freq > 0:
# 淡出效果
self.buzzer.duty_cycle = int(volume * 65535 * 0.3)
time.sleep(0.02)
self.buzzer.duty_cycle = 0
time.sleep(0.01) # 音符间间隔
def play_note(self, note_name, duration, volume=None):
"""播放音符(通过名称)"""
if note_name == "R" or note_name not in self.notes:
self.play_tone(0, duration, 0)
else:
self.play_tone(self.notes[note_name], duration, volume)
def play_song(self, song_data, tempo=1.0):
"""播放歌曲数据"""
for note, duration in song_data:
self.play_note(note, duration * tempo)
def beep(self, count=1, freq=1000, duration=0.1):
"""发出哔哔声(用于提示)"""
for _ in range(count):
self.play_tone(freq, duration, 0.8)
time.sleep(0.05)
TWINKLE_TWINKLE = [
("C4", 0.5), ("C4", 0.5), ("G4", 0.5), ("G4", 0.5),
("A4", 0.5), ("A4", 0.5), ("G4", 1.0),
("F4", 0.5), ("F4", 0.5), ("E4", 0.5), ("E4", 0.5),
("D4", 0.5), ("D4", 0.5), ("C4", 1.0),
]
player = BuzzerPlayer(board.A0, base_volume=0.7)
print("音乐播放器启动...")
player.beep(2, 1000, 0.1) # 启动提示音
time.sleep(0.5)
try:
while True:
print("播放: 小星星")
player.play_song(TWINKLE_TWINKLE, tempo=0.9)
time.sleep(1)
print("播放: 音阶练习")
# 上下行音阶
scale = ["C4", "D4", "E4", "F4", "G4", "A4", "B4", "C5",
"B4", "A4", "G4", "F4", "E4", "D4", "C4"]
for note in scale:
player.play_note(note, 0.2)
time.sleep(1)
print("播放: 和弦")
# C大调和弦
player.play_tone(261.63, 0.5) # C4
player.play_tone(329.63, 0.5) # E4
player.play_tone(392.00, 0.5) # G4
time.sleep(1)
except KeyboardInterrupt:
player.buzzer.duty_cycle = 0
print("\n程序结束")
三、蜂鸣器常见电路

实际连接原理图

我要赚赏金
