最新消息:

Arduino教程┃蜂鸣器模块的认识

Arduino 少儿编程 2926浏览 0评论

蜂鸣器模块

它是一种一体化结构的电子讯响器,分为有源蜂鸣器与无源蜂鸣器。这里的“源”不是指电源,而是指震荡源,有源蜂鸣器内部带震荡源,所以只要一通电就会响,而无源内部不带震荡源,所以如果仅用直流信号无法令其鸣叫,必须用2K-5K的方波去驱动它。从外观上看,两种蜂鸣器区别不大。

一、无源、有源的区别

无源需要2k-5k的方波来驱动发声,所以音色多变。

有源则通电就能蜂鸣,发音频率固定,音色单一。

Arduino教程┃蜂鸣器模块的认识

因为从外观上基本无法区分,所以在教学过程中请大家一定要仔细辨别,避免乌龙。

二、蜂鸣器基本驱动程序编写

无源蜂鸣器程序编写:

int pinBuzzer = 3; //管脚D3连接到蜂鸣器模块的信号脚

void setup() {

  pinMode(pinBuzzer, OUTPUT); //设置pinBuzzer脚为输出状态

}

void loop() {

   long frequency = 300; //频率, 单位Hz

   //用tone()函数发出频率为frequency的波形

   tone(pinBuzzer, frequency );

   delay(1000); //等待1000毫秒

   noTone(pinBuzzer);//停止发声

   delay(2000); //等待2000毫秒

}

程序说明:对于无源蜂鸣器模块,必须使用tone()函数,通过PWM管脚,输出一个波形,才能让无源蜂鸣器发声。

运行效果: 蜂鸣器发出”beep beep”声音,响一秒, 停两秒。

有源蜂鸣器程序编写:

int pinBuzzer = 3; //管脚D3连接到蜂鸣器元件的基极

void setup() {

  pinMode(pinBuzzer, OUTPUT); //设置pinBuzzer脚为输出状态

}

void loop() {

   digitalWrite(pinBuzzer, HIGH);//输出HIGH电平,停止发声

   delay(3000); //等待3000毫秒

   digitalWrite(pinBuzzer, LOW);//输出LOW电平,发声

   delay(1000); //等待1000毫秒

}

程序说明:有源蜂鸣器,只需要写入一个低电平或高电平即可触发让其鸣叫(具体要看生产厂家的硬件),即digitalWrite(管脚号,LOW/HIGHT)。

运行效果:等待3秒后鸣叫1秒,循环往复。

三、无源蜂鸣器演奏曲目Arduino程序编写示例

1、警报声

void setup()

{

  pinMode(3,OUTPUT);

}

void loop()

{

  for(int i=200;i<=800;i++)       //用循环的方式将频率从200HZ 增加到800HZ

  {

    tone(3,i);                    //在四号端口输出频率

    delay(5);                     //该频率维持5毫秒

  }

  delay(4000);                    //最高频率下维持4秒钟

  for(int i=800;i>=200;i–)

  {

    tone(3,i);

    delay(10);

  }

}

2、葫芦娃

#define NOTE_D0 -1

#define NOTE_D1 262

#define NOTE_D2 293

#define NOTE_D3 329

#define NOTE_D4 349

#define NOTE_D5 392

#define NOTE_D6 440

#define NOTE_D7 494

#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 523

#define NOTE_DH2 586

#define NOTE_DH3 658

#define NOTE_DH4 697

#define NOTE_DH5 783

#define NOTE_DH6 879

#define NOTE_DH7 987

//以上部分是定义是把每个音符和频率值对应起来,其实不用打这么多,但是都打上了,后面可以随意编写D调的各种歌,我这里用NOTE_D+数字表示音符,NOTE_DH+数字表示上面有点的那种音符,NOTE_DL+数字表示下面有点的那种音符。这样后面写起来比较好识别。

#define WHOLE 1 

#define HALF 0.5 

#define QUARTER 0.25 

#define EIGHTH 0.25

#define SIXTEENTH 0.625

//这部分是用英文对应了拍子,这样后面也比较好看

int tune[] = 

{ 

  NOTE_DH1,NOTE_D6,NOTE_D5,NOTE_D6,NOTE_D0, 

  NOTE_DH1,NOTE_D6,NOTE_D5,NOTE_DH1,NOTE_D6,NOTE_D0,NOTE_D6,

  NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,NOTE_D0,NOTE_D6, 

  NOTE_DH1,NOTE_D6,NOTE_D5,NOTE_DH1,NOTE_D6,NOTE_D0, 

  NOTE_D1,NOTE_D1,NOTE_D3,

  NOTE_D1,NOTE_D1,NOTE_D3,NOTE_D0,

  NOTE_D6,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,

  NOTE_D5,NOTE_D1,NOTE_D3,NOTE_D0, 

  NOTE_DH1,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,

  NOTE_D5,NOTE_D1,NOTE_D2,NOTE_D0,

  NOTE_D7,NOTE_D7,NOTE_D5,NOTE_D3,

  NOTE_D5,

  NOTE_DH1,NOTE_D0,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D5,NOTE_D6,NOTE_D6,

  NOTE_D0,NOTE_D5,NOTE_D1,NOTE_D3,NOTE_D0,

  NOTE_DH1,NOTE_D0,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D5,NOTE_D6,NOTE_D6,

  NOTE_D0,NOTE_D5,NOTE_D1,NOTE_D2,NOTE_D0,

  NOTE_D3,NOTE_D3,NOTE_D1,NOTE_DL6,

  NOTE_D1,

  NOTE_D3,NOTE_D5,NOTE_D6,NOTE_D6,

  NOTE_D3,NOTE_D5,NOTE_D6,NOTE_D6,

  NOTE_DH1,NOTE_D0,NOTE_D7,NOTE_D5,

  NOTE_D6,

};//这部分就是整首曲子的音符部分,用了一个序列定义为tune,整数

float duration[]=

{ 

  1,1,0.5,0.5,1, 

  0.5,0.5,0.5,0.5,1,0.5,0.5, 

  0.5,1,0.5,1,0.5,0.5, 

  0.5,0.5,0.5,0.5,1,1,

   1,1,1+1,

   0.5,1,1+0.5,1,

   1,1,0.5,0.5,1,

   0.5,1,1+0.5,1,

   0.5,0.5,0.5,0.5,1+1, 

  0.5,1,1+0.5,1, 

  1+1,0.5,0.5,1, 

  1+1+1+1,  0.5,0.5,0.5+0.25,0.25,0.5+0.25,0.25,0.5+0.25,0.25, 

  0.5,1,0.5,1,1, 

  0.5,0.5,0.5+0.25,0.25,0.5+0.25,0.25,0.5+0.25,0.25, 

  0.5,1,0.5,1,1, 

  1+1,0.5,0.5,1, 

  1+1+1+1,

   0.5,1,0.5,1+1,

   0.5,1,0.5,1+1,

   1+1,0.5,0.5,1,

   1+1+1+1

};//这部分是整首曲子的接拍部分,也定义个序列duration,浮点(数组的个数和前面音符的个数是一样的,一一对应么)

int length;//这里定义一个变量,后面用来表示共有多少个音符

 int tonePin=9;//蜂鸣器的pin

 void setup()

 {

   pinMode(tonePin,OUTPUT);//设置蜂鸣器的pin为输出模式 

  length = sizeof(tune)/sizeof(tune[0]);//这里用了一个sizeof函数,可以查出tone序列里有多少个音符 

} 

void loop() 

{ 

  for(int x=0;x<length;x++)

  {

    tone(tonePin,tune[x]);//此函数依次播放tune序列里的数组,即每个音符 

    delay(400*duration[x]);//每个音符持续的时间,即节拍duration,400是调整时间的越大,曲子速度越慢,越小曲子速度越快,自己掌握吧 

    noTone(tonePin);//停止当前音符,进入下一音符

  } 

  delay(5000);//等待5秒后,循环重新开始

 }

3、欢乐颂

#define D0 -1

#define D1 262

#define D2 293

#define D3 329

#define D4 349

#define D5 392

#define D6 440

#define D7 494

#define M1 523

#define M2 586

#define M3 658

#define M4 697

#define M5 783

#define M6 879

#define M7 987

#define H1 1045

#define H2 1171

#define H3 1316

#define H4 1393

#define H5 1563

#define H6 1755

#define H7 1971

//列出全部D调的频率

#define WHOLE 1

#define HALF 0.5

#define QUARTER 0.25

#define EIGHTH 0.25

#define SIXTEENTH 0.625

//列出所有节拍

int tune[]=        //根据简谱列出各频率

{

  M3,M3,M4,M5,

  M5,M4,M3,M2,

  M1,M1,M2,M3,

  M3,M2,M2,

  M3,M3,M4,M5,

  M5,M4,M3,M2,

  M1,M1,M2,M3,

  M2,M1,M1,

  M2,M2,M3,M1,

  M2,M3,M4,M3,M1,

  M2,M3,M4,M3,M2,

  M1,M2,D5,D0,

  M3,M3,M4,M5,

  M5,M4,M3,M4,M2,

  M1,M1,M2,M3,

  M2,M1,M1

};

float durt[]=       //根据简谱列出各节拍

{

  1,1,1,1,

  1,1,1,1,

  1,1,1,1,

  1+0.5,0.5,1+1,

  1,1,1,1,

  1,1,1,1,

  1,1,1,1,

  1+0.5,0.5,1+1,

  1,1,1,1,

  1,0.5,0.5,1,1,

  1,0.5,0.5,1,1,

  1,1,1,1,

  1,1,1,1,

  1,1,1,0.5,0.5,

  1,1,1,1,

  1+0.5,0.5,1+1,

};

int length;

int tonepin=5;   //得用5号接口

void setup()

{

  pinMode(tonepin,OUTPUT);

  length=sizeof(tune)/sizeof(tune[0]);   //计算长度

}

void loop()

{

  for(int x=0;x<length;x++)

  {

    tone(tonepin,tune[x]);

    delay(500*durt[x]);   //这里用来根据节拍调节延时,500这个指数可以自己调整,在该音乐中,我发现用500比较合适。

    noTone(tonepin);

  }

  delay(2000);

}

除使用Arduino IDE编写外,也可以使用Scratch或Mixly的模块化编程软件编写,但是歌曲一长,模块就会很多,程序的可读性会比较差。

以上部分程序来自互联网,仅供大家学习使用。

您必须 登录 才能发表评论!