
Arduino入门12: 用蜂鸣器制造声音
章节
类别和标签
许可
本教程系列是专门面向零基础的Arduino初学者,让初学者不仅对Arduino的历史,原理操作有基本的入门,而且对Arduino背后所代表的观念和思潮运动有所理解。脑震荡原创内容,请尊重作者的知识产权。
前言
今天我们学习一下如何用Arduino和蜂鸣器制造声音。能发出声音都元件很多,从简单的蜂鸣器,喇叭到能发出高质量音色的mp3扩展版,我们从最简单的蜂鸣器开始。
蜂鸣器
蜂鸣器(Buzzer) 是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。
蜂鸣器根据结构不同分为压电式蜂鸣器和电磁式蜂鸣器。压电式蜂鸣器 是以压电陶瓷的压电效应,来带动金属片的振动而发声;电磁式蜂鸣器是通过电流流过电磁线圈产生磁场。来带动金属片的振动而发声。无论是压电式蜂鸣器还是电磁式蜂鸣器,又都有有源和无源的区分,其中,“有源”是指蜂鸣器本身内含驱动了,直接给它一定的电压就可以响;“无源”是需要靠外部的驱动才可以响的
下面我们就用Arduino来驱动一下常见的有源蜂鸣器。
准备材料
Arduino UNO 1块
当然你也可以使用Arduino其它版本,比如Arduino Leonardo, Arduino Duemilanove。
Arduino USB线 1根
一端是A型,一端是B型的USB连接线,用来连接Arduino和电脑
迷你面包板 1块(可选)
面包线/跳线 若干根
两头都是针头的公对公面包线若干
有源蜂鸣器 1个
装有Arduino IDE的Mac/PC/Linux 1台
若没有安装,请参考《Arduino入门3: 安装和熟悉Arduino IDE》安装。
连接电路
电路连接相对简单,蜂鸣器有正负极之分。负极接Arduino的GND,正极接pin8。
代码
导入File>Examples>Digital>toneMelody
/*
Melody
Plays a melody
circuit:
* 8-ohm speaker on digital pin 8
created 21 Jan 2010
modified 30 Aug 2011
by Tom Igoe
This example code is in the public domain.
http://arduino.cc/en/Tutorial/Tone
*/
#include "pitches.h"
// notes in the melody:
int melody[] = {
NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};
// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
4, 8, 8, 4, 4, 4, 4, 4
};
void setup() {
// iterate over the notes of the melody:
for (int thisNote = 0; thisNote < 8; thisNote++) {
// to calculate the note duration, take one second
// divided by the note type.
//e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
int noteDuration = 1000 / noteDurations[thisNote];
tone(8, melody[thisNote], noteDuration);
// to distinguish the notes, set a minimum time between them.
// the note's duration + 30% seems to work well:
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// stop the tone playing:
noTone(8);
}
}
void loop() {
// no need to repeat the melody.
}
头部需要调用pitches.h,该文件定义了基本的音调对应的频率,其中NOTE_C4代表中音C,NOTE_FS4代表升F等。
/*************************************************
* Public Constants
*************************************************/
#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978
关于tone()函数
这里Arduino主要利用tone()函数发出声音,它主要有两种用法:
tone(pin, frequency, duration)
tone(pin, frequency)
*pin代表连接扬声器的管脚,frequency代表发声频率,duration代表持续的时间,单位是毫秒。
如果使用tone(pin, frequency),Arduino会向指定pin发送制定频率的方波,执行noTone()函数来停止。tone(pin, frequency, duration方法多了一个参数,代表发送方波持续的时间,到时自动停止发送信号,就不需要noTone()函数。
tone()函数对pin是有限制的,pin3-pin13,其他端口无法使用。
看一下效果:
0个留言