arduino学习笔记22 - 扬声器实验
实验材料:arduino duemilanove一块
8Ω 0.5W 喇叭一个
电位器一个
面包板一个
面包板连接线若干
电位器作用就是调节音量,一般是要求与喇叭阻抗匹配,本次实验没找到小阻值电位器,所以用了一个5K的。
注意:因为扬声器驱动电压要求比较小,远远小于5V,所以需要在扬声器上串联一个大于10uf的电解电容,电解电容负极连接喇叭的正极,电容正极连接另外一端。不接电容长时间使用,会烧毁扬声器。串联一个100Ω电阻也可以(因为电位器最小电阻为0)
上硬件连接图:
本次实验arduino命令中最重要的就是tone()命令。
tone()
tone(pin, frequency, duration)
tone(pin, frequency)
*pin代表连接扬声器的引脚,frequency代表发声频率,duration代表持续的时间,单位是毫秒。
描述:
在一个端口生成一个特定频率的方波,可以指定持续的时间。如果没有指定持续时间,就需要使用noTone()命令终止。端口用来连接到蜂鸣器或者是喇叭播放特定频率声音。
在同一时间,只能产生一个音调。如果已经有音调在某个端口播放,那这时再使用tone()命令将没有效果。如果新的tone()命令是作用在同一端口,将用新的音调替代。
使用tone()命令会干扰3号与11号的PWM输出(除mega以外的其他板子)。
注意:如果想要在不同的端口发出不同的音调,需要在下一个tone()命令前,先使用noTone()命令终止前面音调。
把下面的代码编译后上传进入arduino控制板:/*
Play Super Mario theme song with Arduino and speaker
circuit:
* 8-ohm speaker on digital pin 8
created 4 June 2011
by naozhendang.com
reference:
http://arduino.cc/en/Tutorial/Tone
*/
#define NOTE_B031
#define NOTE_C133
#define NOTE_CS1 35
#define NOTE_D137
#define NOTE_DS1 39
#define NOTE_E141
#define NOTE_F144
#define NOTE_FS1 46
#define NOTE_G149
#define NOTE_GS1 52
#define NOTE_A155
#define NOTE_AS1 58
#define NOTE_B162
#define NOTE_C265
#define NOTE_CS2 69
#define NOTE_D273
#define NOTE_DS2 78
#define NOTE_E282
#define NOTE_F287
#define NOTE_FS2 93
#define NOTE_G298
#define NOTE_GS2 104
#define NOTE_A2110
#define NOTE_AS2 117
#define NOTE_B2123
#define NOTE_C3131
#define NOTE_CS3 139
#define NOTE_D3147
#define NOTE_DS3 156
#define NOTE_E3165
#define NOTE_F3175
#define NOTE_FS3 185
#define NOTE_G3196
#define NOTE_GS3 208
#define NOTE_A3220
#define NOTE_AS3 233
#define NOTE_B3247
#define NOTE_C4262
#define NOTE_CS4 277
#define NOTE_D4294
#define NOTE_DS4 311
#define NOTE_E4330
#define NOTE_F4349
#define NOTE_FS4 370
#define NOTE_G4392
#define NOTE_GS4 415
#define NOTE_A4440
#define NOTE_AS4 466
#define NOTE_B4494
#define NOTE_C5523
#define NOTE_CS5 554
#define NOTE_D5587
#define NOTE_DS5 622
#define NOTE_E5659
#define NOTE_F5698
#define NOTE_FS5 740
#define NOTE_G5784
#define NOTE_GS5 831
#define NOTE_A5880
#define NOTE_AS5 932
#define NOTE_B5988
#define NOTE_C61047
#define NOTE_CS6 1109
#define NOTE_D61175
#define NOTE_DS6 1245
#define NOTE_E61319
#define NOTE_F61397
#define NOTE_FS6 1480
#define NOTE_G61568
#define NOTE_GS6 1661
#define NOTE_A61760
#define NOTE_AS6 1865
#define NOTE_B61976
#define NOTE_C72093
#define NOTE_CS7 2217
#define NOTE_D72349
#define NOTE_DS7 2489
#define NOTE_E72637
#define NOTE_F72794
#define NOTE_FS7 2960
#define NOTE_G73136
#define NOTE_GS7 3322
#define NOTE_A73520
#define NOTE_AS7 3729
#define NOTE_B73951
#define NOTE_C84186
#define NOTE_CS8 4435
#define NOTE_D84699
#define NOTE_DS8 4978
// notes in the melody:
int melody[] = {
NOTE_E4, NOTE_E4, NOTE_E4, NOTE_C4, NOTE_E4, NOTE_G4, NOTE_G3,
NOTE_C4, NOTE_G3, NOTE_E3, NOTE_A3, NOTE_B3, NOTE_AS3, NOTE_A3, NOTE_G3, NOTE_E4, NOTE_G4, NOTE_A4, NOTE_F4, NOTE_G4, NOTE_E4, NOTE_C4, NOTE_D4, NOTE_B3,
NOTE_C4, NOTE_G3, NOTE_E3, NOTE_A3, NOTE_B3, NOTE_AS3, NOTE_A3, NOTE_G3, NOTE_E4, NOTE_G4, NOTE_A4, NOTE_F4, NOTE_G4, NOTE_E4, NOTE_C4, NOTE_D4, NOTE_B3,
NOTE_G4, NOTE_FS4, NOTE_E4, NOTE_DS4, NOTE_E4, NOTE_GS3, NOTE_A3, NOTE_C4, NOTE_A3, NOTE_C4, NOTE_D4, NOTE_G4, NOTE_FS4, NOTE_E4, NOTE_DS4, NOTE_E4, NOTE_C5, NOTE_C5, NOTE_C5,
NOTE_G4, NOTE_FS4, NOTE_E4, NOTE_DS4, NOTE_E4, NOTE_GS3, NOTE_A3, NOTE_C4, NOTE_A3, NOTE_C4, NOTE_D4, NOTE_DS4, NOTE_D4, NOTE_C4,
NOTE_C4, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_C4, NOTE_A3, NOTE_G3, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_D4, NOTE_E4,
NOTE_C4, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_C4, NOTE_A3, NOTE_G3
};
// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
8,4,4,8,4,2,2,
3,3,3,4,4,8,4,8,8,8,4,8,4,3,8,8,3,
3,3,3,4,4,8,4,8,8,8,4,8,4,3,8,8,2,
8,8,8,4,4,8,8,4,8,8,3,8,8,8,4,4,4,8,2,
8,8,8,4,4,8,8,4,8,8,3,3,3,1,
8,4,4,8,4,8,4,8,2,8,4,4,8,4,1,
8,4,4,8,4,8,4,8,2
};
void setup() {
// iterate over the notes of the melody:
for (int thisNote = 0; thisNote < 98; 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;
tone(8, melody,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.
}实验效果如下:
http://player.youku.com/player.php/sid/XMzEyMTQwMjUy/v.swf 你好,请问扬声器频率和音乐谱子的对应关系你是怎么知道的呢?
比如多少的频率对应do,多少频率对应ri。
另外,回帖验证码好难看清楚。。。 效果很理想,就是声音有点小。 davidce 发表于 2012-5-18 17:16 static/image/common/back.gif
效果很理想,就是声音有点小。
不知道。。三极管扩流管用不。。。加电阻限制最大音量。 学习了就是编一首歌很麻烦 弘毅 发表于 2012-5-18 19:08 static/image/common/back.gif
不知道。。三极管扩流管用不。。。加电阻限制最大音量。
感觉很长的程序啊。 请问能不能调音啊,比如调成钢琴的音色什么的 Bravo!东东 发表于 2013-2-15 15:37 static/image/common/back.gif
请问能不能调音啊,比如调成钢琴的音色什么的
介个。。。貌似这个函数不行。 :funk::funk::funk:这是游戏音乐。。 我用 uno了 上传,但是无声音的,但是我用的是一般的那些蜂鸣器而已 布列松 发表于 2014-11-17 22:49 static/image/common/back.gif
我用 uno了 上传,但是无声音的,但是我用的是一般的那些蜂鸣器而已
那种小黑无源蜂鸣器也能用,正极在8号接口,负极GND,适当的电阻(220欧姆以上)能听到示例一样的声音,试一试~ 如果想用三极管放大,应该怎么接呢?
4欧和8欧的喇叭,小功率和大功率的喇叭,又有什么不同的接法呢? 好资料,研究下, 好资料,研究下, 本帖最后由 Stormer 于 2017-11-5 13:01 编辑
注意:因为扬声器驱动电压要求比较小,远远小于5V,所以需要在扬声器上串联一个大于10uf的电解电容,电解电容负极连接喇叭的正极,电容正极连接另外一端。不接电容长时间使用,会烧毁扬声器。串联一个100Ω电阻也可以
接这个电容的目的是什么? 是隔断直流吗?音频是通过数字口输出的PWM方波。 这个方波算是交流电? 如果它还是直流的话,那么加电容不就把信号都阻隔了吗?小白不明白。
页:
[1]
2