- 前言
- 1.实验器材
- 2.实验原理
- 3.有源蜂鸣器模块
- 3.1代码示例
- 3.2编译代码
- 3.3实验效果
- 4.无源蜂鸣器
- 4.1代码示例
- 音符频率对照表
- softTone软件音频库
- 4.2编译代码
- 4.3实验效果
- 结语
最近学习激情不是很高,虽然代码学了很多,但是高数和大物直接摆烂了,呜呜呜呜
关注本专栏,和我一起学习树莓派开发板30+经典实验!
C语言代码,0基础剖析!
还等什么😍心动不如行动!👉点我关注
本专栏代码仓库📝:Raspberry-practice
1.实验器材
- 树莓派开发板
- 40p软排线+T型转接板+面包板
- 有源蜂鸣器
- 无源蜂鸣器
- 一堆跳线
下:有源蜂鸣器;上:无源蜂鸣器
它们的外观几乎一样。
如果是没有装配好的单独模块,无源蜂鸣器底部的电路引脚带有绿色pcb,而有源蜂鸣器底部是黑色塑料外壳。
因为模块已经焊接到了电路板上,所以我们看不到它们的底部引脚。
2.实验原理
蜂鸣器属于声音模块。
有源蜂鸣器常用于发出单一的提示性报警声音,没有频率变
化,内置振荡器;无源蜂鸣器的驱动方式为频率脉冲驱动,可以发出各种有频率的信号声
音。
- 有源蜂鸣器内部有一个简单的振荡电路,能将恒定的直流电转化成一定频率的脉冲信号,程序控制方便但频率固定,单片机一个高低电平就可以让其发出声音。
- 无源蜂鸣器和电磁扬声器一样没有内部驱动电路,需要接在音频输出电路中才能发声。
如果给直流信号是不响的,因为磁路恒定,必须用2K-5K的方波去驱动它。
声音频率可控,可以做出“多来米发索拉西”的效果。
- 在一些特例中,可以和LED复用一个控制口。
它们的电路原理图是一样的,只是控制方式不同
因为有两个不同的模块,所以下文将分开讲解
3.有源蜂鸣器模块有源蜂鸣器有内置振荡源,只需要接线就会发出蜂鸣声,但它的发声是固定频率的。
这点和内置了控制芯片的七彩LED模块很相似。
树莓派 | T型转接板 | 有源蜂鸣器 |
---|---|---|
GPIO 0 | GPIO 17 | I/O |
3.3V | 3.3V | VCC |
GND | GND | GND |
在连接上电路后,有源蜂鸣器就会哔哔哔叫。
我们可以通过控制输入电平的高低,来控制它的开关
3.1代码示例//有源蜂鸣器
#include
#include
#define makerobo_BuzzerPin 0 // 有源蜂鸣器管脚定义
int main()
{
//初始化连接失败时,将消息打印到屏幕
if(wiringPiSetup() == -1){
printf("setup wiringPi failed !");
return 1;
}
pinMode(makerobo_BuzzerPin, OUTPUT); // 有源蜂鸣器设置为输出模式
// 无限循环
while(1)
{
digitalWrite(makerobo_BuzzerPin, LOW);
// 蜂鸣器为低电平触发,所以使能蜂鸣器让其发声
delay(100); // 延时100ms
digitalWrite(makerobo_BuzzerPin, HIGH);
// 蜂鸣器设置为高电平,关闭蜂鸣器
delay(100); // 延时100ms
}
return 0;
}
3.2编译代码
第一次编译这个代码的时候,出现了下面的报错。
意思其实很简单,就是wiringPi库没有连接上,因为我忘记在最末尾加上-lwiringPi
了
正确的编译指令如下
gcc 09activebuzzer.c -o ACTIVE -lwiringPi
编译成功
3.3实验效果改变delay函数的参数,就能听到蜂鸣器声音的变换。
设置成delay(1000)
可以延长声音效果
- 第一次接线的时候,我不小心把它接在了5v的管脚上,导致输入高电平并不能关闭蜂鸣器,而是近似于改变了蜂鸣器的频率(我听不出是音量变了还是频率变了)
- 修正错误,接线在3.3v管脚上后,有源蜂鸣器可以正常关闭
总所周知,图片是没有声音的。
所以我把两个情况的录音文件都放在了gitee仓库👉传送门
4.无源蜂鸣器
无源蜂鸣器可以通过输入pwm
来控制发声频率
它的接线方式和有源蜂鸣器相同
树莓派 | T型转接板 | 无源蜂鸣器 |
---|---|---|
GPIO 0 | GPIO 17 | I/O |
3.3V | 3.3V | VCC |
GND | GND | GND |
//无源蜂鸣器
#include
#include
#include
#define makerobo_BuzPin 0 // 有源蜂鸣器管脚定义
// 音谱定义
// 低C音符的频率
#define Tone_CL1 131
#define Tone_CL2 147
#define Tone_CL3 165
#define Tone_CL4 175
#define Tone_CL5 196
#define Tone_CL6 221
#define Tone_CL7 248
// 中C音的频率
#define Tone_CM1 262
#define Tone_CM2 294
#define Tone_CM3 330
#define Tone_CM4 350
#define Tone_CM5 393
#define Tone_CM6 441
#define Tone_CM7 495
// 高C音符的频率
#define Tone_CH1 525
#define Tone_CH2 589
#define Tone_CH3 661
#define Tone_CH4 700
#define Tone_CH5 786
#define Tone_CH6 882
#define Tone_CH7 990
// 第一首歌音谱
int makerobo_song_1[] = {Tone_CM3,Tone_CM5,Tone_CM6,Tone_CM3,Tone_CM2,Tone_CM3,Tone_CM5,Tone_CM6,Tone_CH1,Tone_CM6,Tone_CM5,Tone_CM1,Tone_CM3,Tone_CM2,
Tone_CM2,Tone_CM3,Tone_CM5,Tone_CM2,Tone_CM3,Tone_CM3,Tone_CL6,Tone_CL6,Tone_CL6,Tone_CM1,Tone_CM2,Tone_CM3,Tone_CM2,Tone_CL7,
Tone_CL6,Tone_CM1,Tone_CL5};
// 第一首歌节拍
int makerobo_beat_1[] = {1,1,3,1,1,3,1,1,1,1,1,1,1,1,3,1,1,3,1,1,1,1,1,1,1,2,1,1,
1,1,1,1,1,1,3};
// 第二首歌音谱
int makerobo_song_2[] = {Tone_CM1,Tone_CM1,Tone_CM1,Tone_CL5,Tone_CM3,Tone_CM3,Tone_CM3,Tone_CM1,Tone_CM1,Tone_CM3,Tone_CM5,Tone_CM5,Tone_CM4,Tone_CM3,Tone_CM2,
Tone_CM2,Tone_CM3,Tone_CM4,Tone_CM4,Tone_CM3,Tone_CM2,Tone_CM3,Tone_CM1,Tone_CM1,Tone_CM3,Tone_CM2,Tone_CL5,Tone_CL7,Tone_CM2,Tone_CM1
};
// 第二首歌节拍
int makerobo_beat_2[] = {1,1,1,3,1,1,1,3,1,1,1,1,1,1,3,1,1,1,2,1,1,1,3,1,1,1,3,3,2,3};
int main()
{
int i;
//初始化连接失败时,将消息打印到屏幕
if(wiringPiSetup() == -1){
printf("makerobo setup wiringPi failed !");
return 1;
}
//软件模拟Tone库初始化识别,将消息打印到屏幕
if(softToneCreate(makerobo_BuzPin) == -1){
printf("makerobo setup softTone failed !");
return 1;
}
while(1){
printf("makerobo music is being played...\n"); // 开始播放音乐
// 播放第一首歌音乐
for(i=0;i<sizeof(makerobo_song_1)/4;i++){
softToneWrite(makerobo_BuzPin, makerobo_song_1[i]);
//第一首歌音谱
delay(makerobo_beat_1[i] * 500); //第一首歌节拍
}
// 播放第二首歌音乐
for(i=0;i<sizeof(makerobo_song_2)/4;i++){
softToneWrite(makerobo_BuzPin, makerobo_song_2[i]);
//第二首歌音谱
delay(makerobo_beat_2[i] * 500); //第二首歌节拍
}
}
return 0;
}
音符频率对照表
音阶
音阶是音乐必不可少的要素,主要由声音的频率决定。通过给蜂鸣器不同频率的音频脉冲,可以产生不同的音阶,而要产生某频率的音频脉冲,最简单的办法是以该音频的频率除以2的值,函数使用该值为参数改变蜂鸣器输入方波信号的频率,蜂鸣器上就可发出该频率的声音。
若想改变音阶,只需要改变频率即可。下表为各音调音符频率对照表,据此可产生不同音阶的音符。
“#”表示半音,用于上升或下降半个音,乘以2就提升该声音一个8度音阶,减半则降一个8度。
节拍
若要构成音乐,光有音阶是不够的,还需要节拍,也就是音符持续时间的长短,一般用拍数表示。至于1拍是多少秒,没有严格的规定,只要节拍适宜,声音悦耳即可。
假如某首歌曲的节奏是每分钟120拍,那么1拍为
0.5s
,1/4拍为0.125s
,以此类推可得到其他节拍对应的时长。这样,利用不同的频率,加上与拍数对应的延时,就构成了乐曲。
以上引用自这位大佬的博客👉原文链接
我找来了一章音符与频率的对照表,供大家参考
softTone软件音频库类似于softPWM
,wiringPi库中还包含了一个软件音频库,通过输入不同的音频频率来使无源蜂鸣器发出不同的声音
这里提到了需要在编译文件时加入-lpthread
选项,实测不需要加入也可以正常编译出来
gcc 09passivebuzzer.c -o PASSIVE -lwiringPi
4.3实验效果
蜂鸣器的确发出了不同频率的声音,但是我感觉它并没有唱歌,哈哈😂
录音文件也放在gitee仓库里面啦!👉传送门
结语
这两个传感器和之前实验中出现的双色LED很像,不过一个是以声音为媒介,一个是以光为媒介来传递信息
本篇博客到这里就结束啦,如果有什么问题,欢迎在评论区提出哦!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)