锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

【树莓派C语言开发】实验09:有源和无源蜂鸣器模块

时间:2022-12-18 03:30:00 cm220连接器板对线连接器的产生cl09连接器971c连接器

文章目录

  • 前言
  • 1.实验器材
  • 2.实验原理
  • 3.有源蜂鸣器模块
    • 3.1代码示例
    • 3.2编译代码
    • 3.3实验效果
  • 4.无源蜂鸣器
    • 4.1代码示例
      • 音频频率对照表
      • softTone软件音频库
    • 4.2编译代码
    • 4.3实验效果
  • 结语

前言

最近学习激情不是很高。虽然学了很多代码,但是高数和大物直接烂了,呜呜呜呜呜

image-20220416182617922

关注这个专栏,和我一起学习树莓派开发板30 经典实验

C语言代码,0基础分析!

  • 还在等什么?心不如行动!点我注意

  • 本专栏代码仓库:Raspberry-practice


1.实验器材

下:有源蜂鸣器;上:无源蜂鸣器

它们的外观几乎是一样的。假如未组装的单独模块,无源蜂鸣器底部的电路引脚是绿色的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

4.1代码示例

//无源蜂鸣器
#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选项,实测不需要加入也可以正常编译出来

4.2编译代码

gcc 09passivebuzzer.c -o PASSIVE -lwiringPi

4.3实验效果

蜂鸣器的确发出了不同频率的声音,但是我感觉它并没有唱歌,哈哈😂

录音文件也放在gitee仓库里面啦!👉传送门


结语

这两个传感器和之前实验中出现的双色LED很像,不过一个是以声音为媒介,一个是以光为媒介来传递信息

本篇博客到这里就结束啦,如果有什么问题,欢迎在评论区提出哦!

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章