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

news/2025/2/12 13:47:15/

文章目录

  • 前言
  • 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.实验器材

  • 树莓派开发板
  • 40p软排线+T型转接板+面包板
  • 有源蜂鸣器
  • 无源蜂鸣器
  • 一堆跳线

IMG_20220416_183003

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

它们的外观几乎一样。如果是没有装配好的单独模块,无源蜂鸣器底部的电路引脚带有绿色pcb,而有源蜂鸣器底部是黑色塑料外壳。因为模块已经焊接到了电路板上,所以我们看不到它们的底部引脚。


2.实验原理

蜂鸣器属于声音模块。有源蜂鸣器常用于发出单一的提示性报警声音,没有频率变
化,内置振荡器;无源蜂鸣器的驱动方式为频率脉冲驱动,可以发出各种有频率的信号声
音。

  • 有源蜂鸣器内部有一个简单的振荡电路,能将恒定的直流电转化成一定频率的脉冲信号,程序控制方便但频率固定,单片机一个高低电平就可以让其发出声音。
  • 无源蜂鸣器和电磁扬声器一样没有内部驱动电路,需要接在音频输出电路中才能发声。如果给直流信号是不响的,因为磁路恒定,必须用2K-5K的方波去驱动它。声音频率可控,可以做出“多来米发索拉西”的效果。
  • 在一些特例中,可以和LED复用一个控制口。

它们的电路原理图是一样的,只是控制方式不同

9.有源蜂鸣器原理图

因为有两个不同的模块,所以下文将分开讲解

3.有源蜂鸣器模块

有源蜂鸣器有内置振荡源,只需要接线就会发出蜂鸣声,但它的发声是固定频率的。这点和内置了控制芯片的七彩LED模块很相似。

树莓派T型转接板有源蜂鸣器
GPIO 0GPIO 17I/O
3.3V3.3VVCC
GNDGNDGND

09_Active Buzzer_bb

在连接上电路后,有源蜂鸣器就会哔哔哔叫。我们可以通过控制输入电平的高低,来控制它的开关

3.1代码示例

//有源蜂鸣器
#include <wiringPi.h>
#include <stdio.h>#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);           // 延时100msdigitalWrite(makerobo_BuzzerPin, HIGH); // 蜂鸣器设置为高电平,关闭蜂鸣器delay(100);           // 延时100ms}   return 0;
}

3.2编译代码

第一次编译这个代码的时候,出现了下面的报错。意思其实很简单,就是wiringPi库没有连接上,因为我忘记在最末尾加上-lwiringPi

image-20220416190317957

正确的编译指令如下

gcc 09activebuzzer.c -o ACTIVE -lwiringPi

编译成功

image-20220416191550146

3.3实验效果

改变delay函数的参数,就能听到蜂鸣器声音的变换。设置成delay(1000)可以延长声音效果

  • 第一次接线的时候,我不小心把它接在了5v的管脚上,导致输入高电平并不能关闭蜂鸣器,而是近似于改变了蜂鸣器的频率(我听不出是音量变了还是频率变了)
  • 修正错误,接线在3.3v管脚上后,有源蜂鸣器可以正常关闭

总所周知,图片是没有声音的。所以我把两个情况的录音文件都放在了gitee仓库👉传送门


4.无源蜂鸣器

无源蜂鸣器可以通过输入pwm控制发声频率

它的接线方式和有源蜂鸣器相同

树莓派T型转接板无源蜂鸣器
GPIO 0GPIO 17I/O
3.3V3.3VVCC
GNDGNDGND

09_Passive Buzzer_bb

IMG_20220416_194303

4.1代码示例

//无源蜂鸣器
#include <wiringPi.h>
#include <softTone.h>
#include <stdio.h>#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,以此类推可得到其他节拍对应的时长。这样,利用不同的频率,加上与拍数对应的延时,就构成了乐曲。

以上引用自这位大佬的博客👉原文链接

我找来了一章音符与频率的对照表,供大家参考

image-20220416200432752

softTone软件音频库

类似于softPWM,wiringPi库中还包含了一个软件音频库,通过输入不同的音频频率来使无源蜂鸣器发出不同的声音

光影魔术手拼图

这里提到了需要在编译文件时加入-lpthread选项,实测不需要加入也可以正常编译出来

4.2编译代码

gcc 09passivebuzzer.c -o PASSIVE -lwiringPi

image-20220416194131124

4.3实验效果

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

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


结语

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

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

QQ图片20220416195218


http://www.ppmy.cn/news/880827.html

相关文章

【STM32学习笔记】(10)——蜂鸣器实验详解

蜂鸣器实验 蜂鸣器的简介 蜂鸣器是一种一体化结构的电子讯响器&#xff0c;采用直流电压供电&#xff0c;广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂鸣…

【致敬嵌入式攻城狮第2期活动预热征文】——蜂鸣器(内化)

&#x1f64c;秋名山码民的主页 &#x1f602;一个打过一年半的oier&#xff0c;写过一年多的Java&#xff0c;现在致力于学习iot应用的普通本科生 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f64f;作者水平有限&#xff0c;如发现…

华军:坚持就是胜利(附图)

华军&#xff1a;坚持就是胜利(附图) 凭借着与多来米的合作&#xff0c;华军赢得了商业资本的支持&#xff0c;摆脱了资金困境并坚持到了现在。在与商业资本说“再见”后&#xff0c;华军欲在个人网站与商业化运作之间打一个小心的“擦边球”。他的理念是——坚持就是胜利.....…

中国的漫威,还很遥远么

我们都知道漫威宇宙&#xff0c;从《X战警》到《复仇者联盟》&#xff0c;无论是《钢铁侠》&#xff0c;《蜘蛛侠》&#xff0c;《美国队长》&#xff0c;《雷神》&#xff0c;以及浩克&#xff0c;《奇异博士》等等&#xff0c;每个英雄在中国都有无数的粉丝&#xff0c;那么恶…

(二十三)树莓派3B+ 驱动蜂鸣器播放《茉莉花》

在上一篇(十二)树莓派3B node-rpio库的使用–硬件PWM中已经介绍了树莓派的PWM的使用。这里实际就是在上一个的基础之上的一个应用。需要一些关于简谱和蜂鸣器的基本知识了。 1.简谱相关知识 简谱是指一种简易的记谱法。有字母简谱和数字简谱两种。 数字简谱以可动唱名法为基础…

蜂鸣器(有源蜂鸣器无源蜂鸣器)

蜂鸣器原理 蜂鸣器发声原理是电流通过电磁线圈&#xff0c;使电磁线圈产生磁场来驱动振动膜发声的&#xff0c;因此需要一定的电流才能驱动它&#xff0c;单片机IO引脚输出的电流较小&#xff0c;单片机输出的TTL电平基本上驱动不了蜂鸣器&#xff0c;因此需要增加一个电流放大…

实用客户端示例应用教程-websocket教程翻译记录

原文&#xff1a; https://docs.websocketpp.org/md_tutorials_utility_client_utility_client.html 注意网页上的内容不完整&#xff0c;需要在github里面获取完整的文档。 一. 初始设置与基础知识 设置基本类型&#xff0c;打开和关闭连接&#xff0c;发送和接收消息。 Ste…

Unity游戏源码分享-Unity手游火柴忍者游戏StickmanDojo

Unity游戏源码分享-Unity手游火柴忍者游戏StickmanDojo 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88050234