模块熟悉
第 17 课:蜂鸣器——发出声音
套件里最省心的输出模块,但"有源"这两个字容易理解反
我是吴老师。这是「模块熟悉」单元里最轻松的一节。
前面几节课,你学的都是"读"——读光、读温度、读距离,每一样都要动点脑子:要标定、要换算、要看时序。
这节课反过来,是"让它动"。而且这个模块特别省心——接上电,它就响。
代码也就五六行,跟第 6 课点灯差不多。
但我还是给它排了一整节课,因为这里面有个坑,而且这个坑很阴。
坑不在电路上,不在代码里——在那个模块的名字里。
看视频时注意的三件事
先看视频,视频里我把它拆开讲了。
第一,注意接线只有三根。
VCC、I/O、GND。跟 LED 模块是一模一样的结构:一个电源、一个地、一个信号。第 6 课那张接线表你可以直接翻出来对着看。
第二,注意"高电平触发"是什么意思。
就是从 I/O 那根线给一个高电平,它就响;给低电平,它就停。
什么叫"给高电平"? 就是你写 digitalWrite(5, HIGH),那根引脚上变成 3.3V。
是不是听着特别耳熟? 对,这跟点灯是同一件事。第 6 课你写
HIGH灯亮、写LOW灯灭;这里写HIGH它响、写LOW它停。一模一样的两个动作。
第三,注意视频里会出现"有源"和"无源"两个词。
这两个词是这节课的全部难点,下一节我专门讲。你先记住一件事:我们套件里的,是有源的那种。
一、"源"指的是振荡源,不是电源
这是全课最容易理解反的地方,我把它放在最前面说清楚。
看到"有源",很多人的第一反应是"哦,需要接电源的"。然后看到"无源",就想"那这个不用接电源吧"。
全错。
这里的"源",指的是"振荡源"——也就是"负责产生音调的那个东西"。
- 有源 = 它自带音源。你一给它电,它内部的电路自己就开始振动,就响了。
- 无源 = 它没有音源。你得用信号告诉它"振动多快",它才响。
"电源"和"音源"是两件事,别看混了。
两个都得接电源。 无源蜂鸣器不接电源照样不响——它只是需要电源之外,再额外告诉它频率。
记这个窍门:有源 = 自带音源(自己会响),无源 = 没有音源(要你给它)。跟"要不要接电"一点关系都没有。
那"音源"具体是干什么的?它决定声音的高低。
声音的高低,取决于振动快不快——振动越快,音调越高。有源蜂鸣器内部的电路只按一个固定速度振动,所以它只有一个音。
二、坏消息:它只有一个音调
直接说结论:套件里这颗,做不出曲子。
我知道你看到蜂鸣器,第一个念头大概是"能不能让它弹《小星星》"。很遗憾,不能。
原因就是刚才说的:有源蜂鸣器内部的振荡电路是固定死的,你给它的只有"通电 / 断电"两种命令。你没法告诉它"这一声要高一点"。
它只会"嘀——"。
你唯一能控制的,是"响多久、停多久"。
| 你能控制 | 你不能控制 |
|---|---|
| 什么时候响、响多久、停多久 | 音调高低 |
| (每隔半秒嘀一声) | (想让它唱"哆来咪") |
所以别对着它试半天"是不是我代码写错了"。 不是你写错了,是这颗元件就这个本事。
想弹曲子怎么办? 单买一个无源蜂鸣器,几块钱。它没有内部音源,音调完全由你给的频率决定——你给 262 Hz 就发"哆",给 294 Hz 就发"来"。到那时候再回来玩《小星星》。
这也是个有用的经验:拿到一个元件,先搞清楚它的能力边界在哪,再想用它做什么。这跟第 16 课那句"先看手册参数,再决定它能干什么"是同一个道理。
三、好消息:它跟 LED 用法一模一样
坏消息说完了,说好消息——这个模块简单到不像话。
因为它跟 LED 模块的用法完全一样:
| 代码 | 引脚电压 | LED | 蜂鸣器 |
|---|---|---|---|
digitalWrite(x, HIGH) |
3.3V | 亮 | 响 |
digitalWrite(x, LOW) |
0V | 灭 | 停 |
看到没有?右边那两列是同步的。
第 6 课我撂过一句话:"学会点灯,你就学会了一半的输出设备。"
这句话在这儿兑现了。
你在第 6 课学的
pinMode(5, OUTPUT)、digitalWrite、delay——一个字都不用改,换个引脚号就能让蜂鸣器响。 你甚至不用重新理解任何原理。
这就是输出设备的通用套路:主控给一个电平,模块自己去做该做的事。LED 把电变成光,蜂鸣器把电变成声音,后面第 18 课的舵机把电变成角度——它们收到的命令长得一模一样。
四、动手:三步,每步都听得见
接线(接之前先断电):
| 蜂鸣器 | 接到 |
|---|---|
| VCC | 3.3V |
| GND | GND |
I/O |
GPIO5 |
GPIO3上还留着第 6 课的 LED,GPIO4上留着第 9 课的按钮。蜂鸣器我们用GPIO5,三个模块可以一直插着,互不打架。引脚选
GPIO3~GPIO7这一带就行,别用GPIO2、GPIO8、GPIO9(第 4 课那张表)。
第一步:先让它一直响
跟点灯一样,先从最丑的版本开始。
void setup() {
pinMode(5, OUTPUT);
}
void loop() {
digitalWrite(5, HIGH); // 一直响
}烧进去。
听到声音了吗?
听到了就成了。 你刚刚用那几行字,让一个物理设备发出了声音。
没响?按第 5 课那个顺序查:电 → 信号 → 代码。
- 先量
VCC上有没有 3.3V- 再量
I/O那根线通不通(顺便量一下它现在是不是 3.3V——程序正在输出高电平)- 最后才怀疑代码
九成的"没反应"都在前两步。你已经不是第一次遇到"没反应"了,别再靠猜。
第二步:让它"嘀、嘀、嘀"
一直响太吵了。加上"停"和"等",就变成了报警器那种节奏:
void loop() {
digitalWrite(5, HIGH);
delay(200); // 响 0.2 秒
digitalWrite(5, LOW);
delay(800); // 停 0.8 秒
}这段代码,跟第 6 课让灯闪的那段,是不是一模一样? 只差一个引脚号。
现在自己改数值玩:
delay(200)改成delay(50)→ 嘀嘀嘀嘀嘀,听着就急了- 两个都改成
delay(500)→ 变成了老式闹钟那种"嘀、嘀、嘀" - 改成
delay(1000)和delay(1000)→ 慢悠悠的,像倒车提示音
这就是"调参数"——第 6 课讲过,逻辑不动、只改数值看效果。那是写程序里最常见的一件事。
用万用表量一下 I/O 脚:响的那一瞬间是 3.3V,停的时候是 0V。
看见了吗?声音背后就是一个电压在跳。 万用表反应没那么快,你可能只看到数字在 3.3 和 0 之间闪——这个"闪",就是声音的形状。
第三步:跟按钮结合起来——按下就响
这一步是复习第 9 课,不是新东西。
把第 9 课那个闭环里的 LED 换成蜂鸣器,别的一个字都不改:
void setup() {
pinMode(4, INPUT_PULLUP); // 按钮(第 9 课那个)
pinMode(5, OUTPUT); // 蜂鸣器
}
void loop() {
int btn = digitalRead(4); // 第 1 步:读
if (btn == LOW) { // 第 2 步:判断
digitalWrite(5, HIGH); // 第 3 步:响
} else {
digitalWrite(5, LOW); // 不按就停
}
}按下去就响,松开就停。 一个门铃,五秒钟就做出来了。
注意
if (btn == LOW)这句:它假设你的按钮是"按下为低"。这是第 9 课你用万用表量出来的结论——如果你当时量出来是"按下为高",那这里就写HIGH。别照抄,用你自己量过的那个值。 这就是"先测,再猜"。
而且你看——这已经是一个完整的闭环了:
| 环节 | 用了什么 |
|---|---|
| 传感器 | 按钮(读 GPIO4) |
| 判断 | if (btn == LOW) |
| 执行器 | 蜂鸣器(写 GPIO5) |
第 9 课学的那个骨架,这节课换了个零件又走了一遍。 后面第 28 课倒车雷达、第 30 课坐姿提醒器,都是这个骨架 + 一个传感器而已。
自测
答案与解析
"源"指的是振荡源——负责产生音调的那个部件。无源的内部没有它,所以你必须用代码送一个特定频率的方波过去,它才发声。注意:两种蜂鸣器都要接电源,"源"跟"电源"是两个不同的东西。这是本课最容易理解反的一个字。
答案与解析
delay 改的是"响多久、停多久"——那是节奏,不是音高。音高取决于振动频率,而有源蜂鸣器的振动频率是内部电路定死的,你没法改。想弹曲子得单买无源蜂鸣器(几块钱),音调由你给的频率决定。先搞清楚元件的能力边界,再想用它做什么。
答案与解析
这两个模块都是三根线(电源/地/信号)+ 高电平触发。第 6 课的 pinMode、digitalWrite、delay 一个字都不用改,换个引脚号就能用。这就是第 6 课说的"学会点灯就学会一半的输出设备"——输出模块收到的是同一种命令,只不过一个把电变成光、一个把电变成声音。
答题要点
答题要点应该包含:传感器是按钮(读 GPIO4,按下时电平翻转);判断是 if (btn == LOW) 这个条件——板子在"想"该不该响;执行器是蜂鸣器(写 GPIO5,高电平就响)。三个环节缺一不可:只读按钮不响(白算),只让它一直响(那叫演示不叫作品)。它的结构跟第 9 课的"按钮点灯"完全一样,只是把 LED 换成了蜂鸣器——这正是第 9 课说的"换的是零件,骨架没变"。
拓展无源蜂鸣器是怎么弹出《小星星》的?音符和频率之间是什么关系?
这个问题课上不讲,留给你自己找答案——**问 AI 是最好的办法**。
提示:搜"音名 频率 对照表 262Hz"、"Arduino tone 函数 简谱"。想一想:如果"哆"是 262 Hz、"来"是 294 Hz,那《小星星》头两句(哆哆嗖嗖啦啦嗖)要怎么写成代码?顺便想想:为什么这个套件里配的是有源的那种?
拓展手机能放音乐,蜂鸣器只能"嘀"一声,差别在哪?
这个问题课上不讲,留给你自己找答案——**问 AI 是最好的办法**。
提示:搜"蜂鸣器 扬声器 区别 音质"。想一想:蜂鸣器靠一块金属片振动,手机喇叭靠什么?如果振动的材料不一样,能发出来的声音会有什么不同?
本节你要动手做的事
- [ ] 接好三根线:
VCC→3.3V,GND→GND,I/O→GPIO5(接之前先断电) - [ ] 先让它一直响,跑通最丑的版本——别一上来就写复杂代码
- [ ] 改成"嘀嘀嘀",然后自己改
delay的数值,听出快慢的变化 - [ ] 用万用表量
I/O脚:响的时候是不是 3.3V?停的时候是不是 0V?这一步别跳过 - [ ] 跟按钮结合:按下就响,松开就停——按钮的那个判断条件用你自己量出来的值
- [ ] 想清楚一件事:为什么它只有一个音? 想明白了,你以后就不会在它身上浪费时间了
这节课你做的东西很小:三根线、五六行代码、一声"嘀"。
但有两件事值得你带走。
第一件,你已经能一眼看穿"有源/无源"这种命名陷阱了。 一个名字有歧义,很多成年人接错了还在那儿改代码。你没有——你去看了它的内部结构,搞清楚了"源"到底指什么。
第二件,第 6 课那句话在这儿兑现了。 你学点灯的时候,可能觉得"不就是让一个灯亮吗"。现在你知道了:同一个 digitalWrite,换一个模块就从光变成了声音。
后面还有舵机(角度)、OLED(画面)——它们收到的命令,本质上还是这一套。
下一节我们学舵机。那是个"能转到指定角度"的电机,做云台、做小门、做机械臂都靠它。它比蜂鸣器麻烦一点——启动电流大,得单独给它 5V 供电,还得共地(第 4 课那个词,还记得吧)。