Arduino程序设计(六)蜂鸣器实验

本文详细介绍了有源蜂鸣器和无源蜂鸣器的工作原理、区别,以及在Arduino平台上的实验,包括有源蜂鸣器控制实验(LED与蜂鸣器交互)、无源蜂鸣器的频率调节、触发报警声和播放音乐,旨在帮助读者理解并进行实际操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

  • 本文主要介绍两种蜂鸣器的区别和蜂鸣器控制实验,主要内容包括:
  • 1、有源蜂鸣器和无源蜂鸣器的工作原理及主要区别;
  • 2、有源蜂鸣器实验主要介绍有源蜂鸣器的控制;
  • 3、无源蜂鸣器实验分为三个实验,分别为调节蜂鸣器输出频率、无源蜂鸣器触发报警声及无源蜂鸣器播放音乐。

一、蜂鸣器简介

1、蜂鸣器的工作原理

  • (1)有源蜂鸣器:
  • ① 有源蜂鸣器(Active buzzer)内建了一组固定的频率,只要接通电源,就会发出固定的音调。蜂鸣器的源,这里指的是震荡源。也就是说有源蜂鸣器内部带有多谐振荡器,可以产生 1.5kHZ-2.5kHZ 的电压信号,由此有源蜂鸣器才能发声。
  • ② 有源蜂鸣器、无源蜂鸣器的外型很像,一般有源蜂鸣器会在上面贴一个白色贴纸,另外,有源蜂鸣器底部也会有胶封,无源蜂鸣器的底部可以直接看到电路板。有源蜂鸣器往往比无源的贵一点,就是因为里面多个震荡电路。
  • ③ 有源蜂鸣器的优点是,编程控制简单方便,适合大部分的简单使用场景。缺点是只能在固定频率上运行,从而降低了随着应用需求变化而实现备用频率的灵活性。
  • ④ 有源蜂鸣器工作的理想信号是直流电,通常标示为VDC、VDD等。因为蜂鸣器内部有一简单的振荡电路,能将恒定的直流电转化成一定频率的脉冲信号,从而实现磁场交变,带动铝片振动发音。但是在某些有源蜂鸣器在特定的交流信号下也可以工作,只是对交流信号的电压和频率要求很高,此种工作方式一般不采用。
  • (2)无源蜂鸣器:
  • ① 无源蜂鸣器(Passive Buzzer)在字义上说,即不带振荡源,在没有振荡电路情况下接上直流电,因输出电压没有变化,蜂鸣器片仍然保持沉默,所以我们需从外接振荡器。
  • ② 优点:首先,零件数量少,售价较低,其次,我们可脱离一般蜂鸣器只可发出单音的局限,自由控制输出声音频率,便可透过编程写出不同音阶和延续时间,合成一首旋律美妙的音乐。
  • ③ 无源蜂鸣器没有内部驱动电路,有些公司和工厂称为讯响器,国标中称为声响器。无源蜂鸣器工作的理想信号方波。如果给予直流信号蜂鸣器是不响应的,因为磁路恒定,钼片不能振动发音。

2、有源蜂鸣器和无源蜂鸣器的区别

  • 有源蜂鸣器和无源蜂鸣器的区别分为以下6部分,具体内容如下:
  • ① 这里的“源”不是电源,而是指震荡源;
  • ② 有源蜂鸣器内部带震荡源,所以一通电就会叫;
  • ③ 无源蜂鸣器内部不带震荡源,所以用直流信号无法令其鸣叫,必须用2K~5K的方波驱动;
  • ④ 外观不同:如下图所示,左侧带标签纸的是有源蜂鸣器,右侧是无源蜂鸣器;
    在这里插入图片描述
  • ⑤ 高度不同:有源蜂鸣器高度为9mm,而无源蜂鸣器高度为8mm;
  • ⑥ 优点不同:
  • a. 无源蜂鸣器的优点:便宜,声音频率可控,可以做出多来米发索拉西的效果,在一些特例中,可以和LED复用一个控制口;
  • b. 有源蜂鸣器的优点:程序控制方便。

3、蜂鸣器模块电路原理图

  • 带放大功能的蜂鸣器模块原理图,如下图所示:
    在这里插入图片描述

二、有源蜂鸣器实验

有源蜂鸣器控制

  • (1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。

  • (2)有源蜂鸣器控制的电路图,如下图所示:
    在这里插入图片描述

  • (3)实现功能:

  • ① 第一次按下按键,LED点亮,同时蜂鸣器响500ms停止;

  • ② 第二次按下按键,LED熄灭,同时蜂鸣器响500ms停止;

  • ③ 第三次按下按键,重复操作①;

  • ④第四次按下按键,重复操作②,以此类推。

代码实现:

//有源蜂鸣器实验
/*① 第一次按下按键,LED点亮,同时蜂鸣器响500ms停止;
  ② 第二次按下按键,LED熄灭,同时蜂鸣器响500ms停止;
  ③ 第三次按下按键,重复操作①;
  ④第四次按下按键,重复操作②,以此类推*/

#define LED 9
#define KEY 7
#define Buzzer 11

int KEY_NUM = 0;      //按键键值变量

void setup()
{
  pinMode(LED, OUTPUT);     //LED为IO输出
  pinMode(KEY, INPUT_PULLUP); //按键为IO带上拉输入
  pinMode(Buzzer, OUTPUT);  //蜂鸣器为IO输出
  digitalWrite(Buzzer, LOW); //蜂鸣器初始为不鸣叫
}

void loop()
{
  ScanKey();              //按键扫描
  if (KEY_NUM == 1)       //当有按键按下时
  {
    digitalWrite(LED, !digitalRead(LED)); //LED状态翻转
    BuzzerDi();          //滴一声
  }
}

void ScanKey()
{
  KEY_NUM = 0;
  if (digitalRead(KEY) == LOW)
  {
    delay(20);              //延时去抖动
    if (digitalRead(KEY) == LOW)
    {
      KEY_NUM = 1;        //设置键值
      while (digitalRead(KEY) == LOW); //松手检测
    }
  }
}

void BuzzerDi()
{
  digitalWrite(Buzzer, HIGH);     //蜂鸣器响
  delay(500);                      //延时500ms
  digitalWrite(Buzzer, LOW);      //蜂鸣器关闭
}

三、无源蜂鸣器实验

1、调节蜂鸣器输出频率

  • (1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。

  • (2)调节蜂鸣器输出频率的电路图,如下图所示:
    在这里插入图片描述

  • (3)实现功能:电位器调节蜂鸣器输出频率

代码实现:

//无源蜂鸣器实验
//电位器调节蜂鸣器输出频率

#define Pot A0
#define Buzzer 11

int PotBuffer = 0;

void setup()
{
  pinMode(Buzzer,OUTPUT);  //蜂鸣器引脚设定为输出
}

void loop()
{
  PotBuffer = analogRead(Pot);    //读取AD值
  
  for(int i = 0 ; i < 100 ; i++)    //循环100次
  {
    digitalWrite(Buzzer,HIGH);    //设置输出高电平
    delayMicroseconds(PotBuffer); //延时PotBuffer值 us
    digitalWrite(Buzzer,LOW);     //设置输出低电平
    delayMicroseconds(100);       //延时100us
  }

  delay(1000);                    //延时1000ms
}

2、无源蜂鸣器触发报警声

  • (1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。

  • (2)无源蜂鸣器触发报警声的电路图,如下图所示:
    在这里插入图片描述

  • (3)实现功能:按一下按键,触发蜂鸣器报警,蜂鸣器循环播放报警器的声音。

代码实现:

//无源蜂鸣器实验
//按一下按键,触发蜂鸣器报警,蜂鸣器循环播放报警器的声音

#define KEY 7
#define Buzzer 11

int KEY_num = 0;      //按键按下标志

void setup()
{
  pinMode(KEY, INPUT); //按键为IO输入
  pinMode(Buzzer, OUTPUT);  //蜂鸣器为IO输出
  digitalWrite(Buzzer, LOW); //没有按键按下,蜂鸣器不鸣叫
}

void loop()
{
  ScanKey();              //按键扫描

  //蜂鸣器发出报警声
  if (KEY_num == 1)
  {
    for (int j = 0; j < 100; j++)
    {
      for (int i = 200; i <= 800; i++) //频率不断上升
      {
        tone(Buzzer, i);
        delay(5);
      }
      delay(4000);//保持频率最高的点延迟4秒
      for (int i = 800; i >= 200; i--) //频率在不断下降
      {
        tone(Buzzer, i);
        delay(10);
      }
    }
  }
  else
  {
    noTone(Buzzer);//关闭蜂鸣器
  }
}

void ScanKey()
{
  KEY_num = 0;
  if (digitalRead(KEY) == LOW)
  {
    delay(10);              //延时去抖动
    if (digitalRead(KEY) == LOW)
    {
      KEY_num = 1;      //按键按下标志
      while (digitalRead(KEY) == LOW); //松手检测
    }
  }
}

3、无源蜂鸣器播放音乐

  • (1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。

  • (2)无源蜂鸣器播放音乐的电路图,如下图所示:
    在这里插入图片描述

  • (3)实现功能:蜂鸣器播放音乐《天空之城》,伴随LED灯闪烁

代码实现:

//无源蜂鸣器实验
//实现功能:蜂鸣器播放音乐《天空之城》,伴随LED灯闪烁


//定义把每个音符和频率值对应起来
#define NOTE_D0 -1
#define NOTE_D1 294
#define NOTE_D2 330
#define NOTE_D3 350
#define NOTE_D4 393
#define NOTE_D5 441
#define NOTE_D6 495
#define NOTE_D7 556

#define NOTE_DL1 147
#define NOTE_DL2 165
#define NOTE_DL3 175
#define NOTE_DL4 196
#define NOTE_DL5 221
#define NOTE_DL6 248
#define NOTE_DL7 278

#define NOTE_DH1 589
#define NOTE_DH2 661
#define NOTE_DH3 700
#define NOTE_DH4 786
#define NOTE_DH5 882
#define NOTE_DH6 990
#define NOTE_DH7 112

//用英文对应拍子
#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.25
#define SIXTEENTH 0.625

//整首曲子的音符部分,用了一个序列定义为tune,整数
int tune[] =
{
  NOTE_D0, NOTE_D0, NOTE_D0, NOTE_D6, NOTE_D7, NOTE_DH1, NOTE_D7, NOTE_DH1, NOTE_DH3, NOTE_D7, NOTE_D7, NOTE_D7, NOTE_D3, NOTE_D3,
  NOTE_D6, NOTE_D5, NOTE_D6, NOTE_DH1, NOTE_D5, NOTE_D5, NOTE_D5, NOTE_D3, NOTE_D4, NOTE_D3, NOTE_D4, NOTE_DH1,
  NOTE_D3, NOTE_D3, NOTE_D0, NOTE_DH1, NOTE_DH1, NOTE_DH1, NOTE_D7, NOTE_D4, NOTE_D4, NOTE_D7, NOTE_D7, NOTE_D7, NOTE_D0, NOTE_D6, NOTE_D7,
  NOTE_DH1, NOTE_D7, NOTE_DH1, NOTE_DH3, NOTE_D7, NOTE_D7, NOTE_D7, NOTE_D3, NOTE_D3, NOTE_D6, NOTE_D5, NOTE_D6, NOTE_DH1,
  NOTE_D5, NOTE_D5, NOTE_D5, NOTE_D2, NOTE_D3, NOTE_D4, NOTE_DH1, NOTE_D7, NOTE_D7, NOTE_DH1, NOTE_DH1, NOTE_DH2, NOTE_DH2, NOTE_DH3, NOTE_DH1, NOTE_DH1, NOTE_DH1,
  NOTE_DH1, NOTE_D7, NOTE_D6, NOTE_D6, NOTE_D7, NOTE_D5, NOTE_D6, NOTE_D6, NOTE_D6, NOTE_DH1, NOTE_DH2, NOTE_DH3, NOTE_DH2, NOTE_DH3, NOTE_DH5,
  NOTE_DH2, NOTE_DH2, NOTE_DH2, NOTE_D5, NOTE_D5, NOTE_DH1, NOTE_D7, NOTE_DH1, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH3,
  NOTE_D6, NOTE_D7, NOTE_DH1, NOTE_D7, NOTE_DH2, NOTE_DH2, NOTE_DH1, NOTE_D5, NOTE_D5, NOTE_D5, NOTE_DH4, NOTE_DH3, NOTE_DH2, NOTE_DH1,
  NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH6, NOTE_DH6, NOTE_DH5, NOTE_DH5, NOTE_DH3, NOTE_DH2, NOTE_DH1, NOTE_DH1, NOTE_D0, NOTE_DH1,
  NOTE_DH2, NOTE_DH1, NOTE_DH2, NOTE_DH2, NOTE_DH5, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH6, NOTE_DH6, NOTE_DH5, NOTE_DH5,
  NOTE_DH3, NOTE_DH2, NOTE_DH1, NOTE_DH1, NOTE_D0, NOTE_DH1, NOTE_DH2, NOTE_DH1, NOTE_DH2, NOTE_DH2, NOTE_D7, NOTE_D6, NOTE_D6, NOTE_D6, NOTE_D6, NOTE_D7
};

//整首曲子的节拍部分,也定义个序列duration,浮点(数组的个数和前面音符的个数是一样的,一一对应)
float duration[] =

{
  1, 1, 1, 0.5, 0.5,     1 + 0.5, 0.5, 1, 1,     1, 1, 1, 0.5, 0.5,
  1 + 0.5, 0.5, 1, 1,     1, 1, 1, 1,          1 + 0.5, 0.5, 1, 1,
  1, 1, 0.5, 0.5, 0.5, 0.5,    1 + 0.5, 0.5, 1, 1,     1, 1, 1, 0.5, 0.5,
  1 + 0.5, 0.5, 1, 1,    1, 1, 1, 0.5, 0.5,     1 + 0.5, 0.5, 1, 1,
  1, 1, 1, 0.5, 0.5,    1, 0.5, 0.25, 0.25, 0.25, 0.5,    0.5, 0.5, 0.5, 0.25, 0.5, 1,
  0.5, 0.5, 0.5, 0.5, 1, 1,    1, 1, 1, 0.5, 0.5,    1 + 0.5, 0.5, 1, 1,
  1, 1, 1, 0.5, 0.5,    1.5, 0.5, 1, 1,    1, 1, 1, 1,
  0.5, 0.5, 1, 1, 0.5, 0.5,    1.5, 0.25, 0.5, 1,    1, 1, 1, 1,
  1, 1, 1, 1,    1, 1, 1, 1,    0.5, 0.5, 1, 1, 0.5, 0.5,
  1, 0.5, 0.5, 1, 1,    1, 1, 1, 1,    1, 1, 1, 1,
  0.5, 0.5, 1, 1, 0.5, 0.5,    1, 0.5, 0.25, 0.5, 1,    1, 1, 1, 0.5, 0.5
};

int length;//定义一个变量,表示共有多少个音符
int tonePin = 11; //定义蜂鸣器引脚
int led = 10;//定义LED引脚

void setup()
{
  pinMode(tonePin, OUTPUT); //设置蜂鸣器的pin为输出模式
  pinMode(led, OUTPUT);
  length = sizeof(tune) / sizeof(tune[0]); //这里用了一个sizeof函数, 可以查出tone序列里有多少个音符
}

void loop()
{
  for (int x = 0; x < length; x++) //循环音符的次数
  {
    //此函数依次播放tune序列里的数组,即每个音符
    tone(tonePin, tune[x]);

    //每个音符持续的时间,即节拍duration,调整时间的越大,曲子速度越慢,越小曲子速度越快,节奏可自行调整
    digitalWrite(led, HIGH);
    delay(300 * duration[x]);
    digitalWrite(led, LOW);
    delay(200 * duration[x]);
    
    //停止当前音符,进入下一音符
    noTone(tonePin);
  }
  delay(5000);//等待5秒后,循环重新开始
}

附录:《天空之城》音乐简谱
在这里插入图片描述


参考资料

参考资料1: 【雕爷学编程】Arduino动手做(49)—有源蜂鸣器模块2
参考资料1: Arduino应用笔记(一)利用蜂鸣器播放天空之城

<think>好的,用户想了解无源蜂鸣器的工作原理、使用方法以及电路驱动。首先,我需要回忆一下无源蜂鸣器和有源的区别。根据之前提供的引用,有源蜂鸣器内部有振荡源,而无源的需要外部驱动信号。这点很重要,所以用户可能已经知道这点,但需要深入解释。 接下来,工作原理部分。无源蜂鸣器需要外部提供方波信号,通过电磁效应让振动片发声。这里应该详细说明结构,比如电磁线圈、振动片,以及如何通过不同频率产生不同声音。可能需要提到频率范围,比如2k-5kHz,这样用户知道典型的工作参数。 使用方法方面,用户可能想知道如何实际连接电路。需要强调不能直接用IO口驱动,必须用三极管或MOS管放大电流。这里需要给出一个典型的电路图,比如NPN三极管的接法,基极电阻的计算,可能还需要提到PWM信号的重要性,以及如何改变频率来调整音调。 电路驱动部分,需要具体说明元件的选择,比如三极管型号、电阻阻值如何确定,以及保护二极管的作用。这里可能还需要提到微控制器的PWM配置,比如如何设置占空比和频率。用户可能对代码示例感兴趣,所以提供一个简单的Arduino代码会有帮助。 另外,用户可能遇到的问题,比如声音小或者不工作,需要检查哪些部分,比如驱动电流是否足够,三极管是否导通,频率是否正确。这部分可以作为使用注意事项补充进去。 最后,确保回答结构清晰,分点说明,并且引用提供的资料中的信息,比如驱动电路需要放大电流,引用中的例子提到使用三极管,所以需要正确引用[^1]。同时,生成的相关问题要围绕用户可能的后续疑问,比如如何选择蜂鸣器、与有源的区别、代码调试等。</think>### 无源蜂鸣器详解 #### 一、工作原理 无源蜂鸣器内部不含振荡电路,需通过外部输入**方波脉冲信号**驱动发声。其核心结构由电磁线圈、金属振动片和磁铁组成: 1. **电磁效应**:当线圈通入交变电流时,产生交变磁场; 2. **振动发声**:磁场与磁铁相互作用,带动振动片周期性振动; 3. **频率控制**:声调由输入信号频率决定(典型范围$2\text{kHz}-5\text{kHz}$),例如$4\text{kHz}$信号对应高频蜂鸣音。 #### 二、驱动电路设计 由于单片机I/O口驱动能力有限(通常$<20\text{mA}$),需外接放大电路: ```plaintext 典型三极管驱动电路 +5V ──┬───────────────┐ │ │ 蜂鸣器 NPN三极管(C) │ │ PWM信号─电阻1kΩ─B E─地 │ │ 反向二极管保护 ``` 1. **元件选型**: - 三极管:SS8050($I_c>100\text{mA}$) - 基极电阻:$R_b=\frac{V_{io}-V_{be}}{I_b}$(通常$1\text{kΩ}$) - 续流二极管:1N4148,防止反电动势损坏元件 2. **参数示例**: - 工作电压:$3.3\text{V}-5\text{V}$ - 驱动电流:$20\text{mA}-50\text{mA}$ - 阻抗匹配:$16Ω$蜂鸣器需$5V/30mA$驱动 #### 三、软件控制方法 需通过PWM生成可变频率信号(以Arduino为例): ```cpp void setup() { pinMode(9, OUTPUT); // PWM引脚 } void loop() { tone(9, 4000); // 4kHz频率 delay(1000); noTone(9); delay(1000); } ``` 关键配置: - 占空比:建议$50\%$(方波) - 频率精度:$\pm 1\%$(保证音准) #### 四、使用注意事项 | 问题现象 | 排查方向 | |----------------|-----------------------| | 无声 | 三极管极性/驱动电流不足 | | 声音失真 | PWM频率偏差/电压不稳 | | 发热严重 | 持续直流信号误触发 | | 响应延迟 | 负载电容过大 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值