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

共1条 1/1 1 跳转至

Let'sDo2025第3期任务-拾色播放器-任务三

高工
2025-12-14 23:31:49     打赏


实现蜂鸣器驱动,并播放八阶音符;

一、了解蜂鸣器

无源蜂鸣器是一种依赖外部驱动信号发声的电子元件,其核心原理、结构特点、驱动方式及应用场景如下:

核心原理

无源蜂鸣器基于电磁感应原理工作:

音圈与磁场交互:当外部驱动信号通过音圈时,音圈产生交变磁场,与内部永磁铁相互作用,形成周期性吸合或排斥力。

振膜振动发声:这种力推动振膜振动,振膜的振动传递到空气中,从而产生声音。

频率依赖性:发声频率完全由输入信号的频率决定,因此可通过调节驱动信号实现音调变化。

结构特点

无源蜂鸣器内部结构相对简单,主要包括:

永磁铁:提供固定磁场。

电磁铁(音圈):通入交变电流后产生可变磁场。

振膜:将磁场变化转化为机械振动,进而发声。

外壳:保护内部元件,优化声学效果。

驱动方式

无源蜂鸣器需外部提供特定信号才能发声:

驱动信号要求:需输入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程序结束")

 

三、蜂鸣器常见电路

image.png

实际连接原理图

image.png

 



共1条 1/1 1 跳转至

回复

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