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

蜂鸣器实验

  • 前言
  • 一、蜂鸣器简介
    • 1、蜂鸣器的工作原理
    • 2、有源蜂鸣器和无源蜂鸣器的区别
    • 3、蜂鸣器模块电路原理图
  • 二、有源蜂鸣器实验
    • 有源蜂鸣器控制
  • 三、无源蜂鸣器实验
    • 1、调节蜂鸣器输出频率
    • 2、无源蜂鸣器触发报警声
    • 3、无源蜂鸣器播放音乐
  • 参考资料


前言

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

一、蜂鸣器简介

1、蜂鸣器的工作原理

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

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

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

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

  • 带放大功能的蜂鸣器模块原理图,如下图所示:
    Arduino程序设计(六)蜂鸣器实验_第2张图片

二、有源蜂鸣器实验

有源蜂鸣器控制

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

  • (2)有源蜂鸣器控制的电路图,如下图所示:
    Arduino程序设计(六)蜂鸣器实验_第3张图片

  • (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)调节蜂鸣器输出频率的电路图,如下图所示:
    Arduino程序设计(六)蜂鸣器实验_第4张图片

  • (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)无源蜂鸣器触发报警声的电路图,如下图所示:
    Arduino程序设计(六)蜂鸣器实验_第5张图片

  • (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)无源蜂鸣器播放音乐的电路图,如下图所示:
    Arduino程序设计(六)蜂鸣器实验_第6张图片

  • (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秒后,循环重新开始
}

附录:《天空之城》音乐简谱
Arduino程序设计(六)蜂鸣器实验_第7张图片


参考资料

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

你可能感兴趣的:(Arduino,arm开发,单片机)