Arduino程序设计(六)蜂鸣器实验
·
蜂鸣器实验
前言
- 本文主要介绍两种蜂鸣器的区别和蜂鸣器控制实验,主要内容包括:
- 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应用笔记(一)利用蜂鸣器播放天空之城
更多推荐
已为社区贡献6条内容
所有评论(0)