模块熟悉
第 14 课:红外传感器——前面有东西吗
它不是感应人的,是"发一束光出去,看有没有反射回来"
我是吴老师。这节课一上来,我得先把你脑子里可能有的一个印象打碎。
你看到"红外传感器"这四个字,是不是想到了这个场景——
人一走到门口,灯自动亮了。人一走,灯自己灭了。
商场门口那个"欢迎光临"的门铃、楼道里的感应灯、大堂的自动门,都是这个效果。
但我要明确告诉你:那个东西,跟你手上这个模块,不是一回事。
一、它不是那个"感应人"的红外
你说的那种、能隔好几米感应到人走过来的,正式名字叫 PIR——人体红外传感器。它干的事是:感受人身上发出来的热量。人是个三十多度的热源,走到它前面,它"热"到了,就触发。
你手上这个,不是。
它是红外反射式的——发射 + 反射:
- 板上一个透明的灯珠,一直在往外发红外光(红外光人眼看不见,所以那个灯珠看着像没亮)
- 旁边一个黑色的接收头,专门看有没有红外光回来
- 光打到前面的东西上,弹回来,接收头收到 → 它就输出一个电平
说白了就是:拿个手电筒往黑地里照,有墙就有一片光反回来,没墙就照到空里去了。
看这张图,两件事一起看:
| 人体红外 PIR(不是我们的) | 红外反射模块(是我们的) | |
|---|---|---|
| 靠什么工作 | 感受人体发出的热量 | 发一束光,看反不反射回来 |
| 能测多远 | 好几米 | 只有几厘米 |
| 分得清人吗 | 能(人体温度跟墙不一样) | 分不清——纸箱子、书本、你的手,一视同仁 |
| 输出什么 | 有动静就"报一下" | 一直告诉你"现在有没有东西挡着" |
看到最后一行没有?这就是关键区别。
PIR 是"有人经过"这个事件;我们这个,是"前面有没有东西"这个状态。
所以别拿它做"人走到门口自动开门"——它根本做不到。不是因为代码写得不好,是它的物理原理就不支持:几厘米的距离,你人往那一站,它只知道"有东西",不知道那东西是你还是你书包。这是这节课最重要的一个认知。
二、认识你手上这一块
模块长这样:一块蓝色的小板,上面最显眼的是两个圆圆的、像小眼睛一样的东西。怎么认?看颜色:
| 元件 | 长相 | 干什么 |
|---|---|---|
| 发射管 | 透明的、有点像磨砂的小灯珠 | 一直在发红外光 |
| 接收头 | 黑色的,圆圆的,中间有点凹 | 看有没有红外光回来 |
记住一句话:透明的那个负责"喊",黑色的那个负责"听"。 这两个元件焊死在板上,你接反不了——你要接的只有下面那三根针。
板上还有两样东西:
- 一个蓝色的十字小电位器——它就是调"能看多远"的,后面专门讲
- 一个小指示灯——检测到东西的时候会变,接线前先看它,那是最直接的反馈
注意:不同批次的板子,灯的数量和亮灭规律可能不一样。别背,看你自己手上那块。
接线:三根线
丝印是 OUT GND VCC,跟按钮一样三根线:
| 红外模块 | 接到 |
|---|---|
| VCC | 3.3V |
| GND | GND |
OUT |
GPIO4(一个数字引脚) |
注意 OUT 接的是数字引脚,不是 GPIO0~GPIO5 那种模拟引脚。
我特意选了 GPIO4——跟第 8 课按钮那节课一个脚。 为什么?因为你马上会看到,它俩是同一类东西。
三、它只回答"有"或者"没有"
这是这节课的第二个重点。
前面的光敏、热敏、麦克风,给你的都是一个连续的数值——0 到 4095 之间的任何一个数,你能看出"有多亮""有多响"。
红外不是。红外给你的只有两种答案。
看这张图:左边是数字信号,只有高低两档,直上直下;右边是模拟信号,连续起伏,哪都能去。
我们的红外,是左边那种。
| 光敏(模拟) | 红外(数字) | |
|---|---|---|
| 回答的问题 | 有多亮? | 前面有没有东西? |
| 输出 | 0 ~ 4095,连续 | 高电平 / 低电平,就俩 |
| 代码函数 | analogRead |
digitalRead |
| 比喻 | 一个"体温计" | 一个"门卫",只回答有人/没人 |
这个比喻你记住:它是门卫,不是测距仪。
你问门卫"外面那个人离门口几米",门卫只会一脸茫然地看着你——那不是他的活。 他只负责告诉你"有没有"。
想测"多远",得等下一节课。 下一节的超声波模块,才是真正的"测距仪"。
这就是三种传感器的性格:光敏说"多少",红外说"有/没有",超声波说"几厘米"。你后面几个实战课题,就是分别用这三种性格各做一个东西。现在先把每种性格摸清楚。
四、为什么只有几厘米
你实际跑一遍就会发现:它只能感觉到几厘米以内。 手放到十厘米开外,它就"瞎"了。这不是坏了,这是它的设计。
两个原因,都挺朴素:
第一,发射管功率很小。 它就是个几毫米的小灯珠,不是探照灯。第二,光是一路散开的——发出去的时候是一小束,走到一米开外已经摊成很大一片了。摊开之后,能弹回接收头的就剩那么一丁点。
打个比方:你在黑屋子里拿手电照墙,近处一片亮;照十米外的墙,就是一个小光斑,还得看那墙反不反光。
那个蓝色电位器是干嘛的
就是调这个距离的。
它控制的不是"发射功率",而是接收头的灵敏度——相当于给它配副眼镜,调它"多微弱的光也算看见了"。
- 往一个方向拧 → 更灵敏,几厘米外的东西也能触发(但可能太灵敏,环境光把它晃到,一直报"有东西")
- 往另一个方向拧 → 更迟钝,得凑得很近才认
这个电位器直接决定你的作品能不能用。 比如做寻迹小车,你得把它调到一个"刚好只认地上那条黑线"的位置——调太灵,白底也触发;调太钝,黑线来了也不理你。
怎么找到那个位置?没有公式,就是拧。 一边拧一边试,试到它该响的时候响、该停的时候停。
这就是第 11 课那个"标定"的另一个版本。 上次是"先测再定阈值",这次是"先拧再定位置"——同一件事:参数得在你的实际环境下调出来,抄不来。
五、它真正的两个用途
它不是用来"感应人"的,那它能干什么?
两个经典用途,都是几厘米内的活:
用途一:寻迹(跟着线走)
这是它最值钱的用法。
原理特别巧妙:黑线不反光,白底反光。
- 模块对着白纸 → 光打上去,白纸把光反射回来 → 接收头收到 → "有东西!"
- 模块对着黑线 → 光打上去,被黑色吸掉了,几乎不反射 → 接收头啥也没收到 → "没东西!"
所以它其实一直在问:"我脚下是白的还是黑的?"
寻迹小车就是这么干的:车头底下装两个红外模块,一左一右。左边那个照到黑线了,说明车偏右了,就往左拐一点。来回修,车就跟着线走了。
这里有个坑你迟早会踩:如果黑线印得不够黑、或者地面本身是深色,它可能就分不出来了。寻迹好不好用,一半靠代码,一半靠你的线和底够不够"黑白分明"。
用途二:避障(前面有东西就报警)
撞墙之前停一下、倒车的时候滴滴响——这就是避障。
但它只有几厘米,所以:
- ✅ 适合:慢速的、贴着走的(小车慢慢往前挪,碰到东西前停下)
- ❌ 不适合:快的、要提前预判的(几厘米对一辆跑起来的车来说,来不及了)
第 27 课的红外感应灯,就是从这个用途来的。
六、它跟第 8 课的按钮,是一家人
前面我说了 OUT 接 GPIO4,跟按钮一个脚。现在把这件事讲透。
你回想一下按钮:要么按下,要么没按;读到 HIGH 或 LOW;用 digitalRead 读。
红外是一模一样的结构。 区别只在——"按下"这个动作,是谁做的:
| 按钮 | 红外 | |
|---|---|---|
| 什么让它变 | 你的手指按下去 | 有东西挡在它前面 |
| 你做的事 | 一根手指 | 一张纸片、一个纸箱子、你的手 |
| 读到的 | HIGH / LOW |
HIGH / LOW |
| 用什么读 | digitalRead |
digitalRead |
| 属于 | 数字输入 | 数字输入 |
看出来没有——代码几乎一模一样。
void setup() {
Serial.begin(115200);
pinMode(4, INPUT); // 数字输入
}
void loop() {
Serial.println(digitalRead(4)); // 不停地读、不停地打印
delay(100);
}这就是"数字输入"这一类的样子。 你这辈子做的东西里,凡是"是/否"类的输入——按钮、红外、霍尔开关、倾斜开关——全都是这三行代码。
换的是零件,骨架没变。 这句话我从第 9 课说到现在,你该有感觉了。
关于
INPUT还是INPUT_PULLUP:红外模块板上有自己的输出电路,一般写INPUT就行,不会悬空。但你别信我,信你的读数——如果数字一直是乱的、不跟着手变,改成INPUT_PULLUP再试一次。 这就是第 5 课那句"先测,再猜"。
七、动手:先把它摸熟
第一步:接好线,跑上面的代码,打开串口监视器。
第二步:看板上的小指示灯。 现在没有东西在前面,它是什么状态?
第三步:把手掌慢慢从远处凑近模块。 凑到某个距离的时候,你会看到两件事同时发生——板上的指示灯变了,串口里的数字也跳了。
记下这个距离:大概几厘米?再记下方向:是"有东西"的时候数字大,还是"没东西"的时候大。
这个方向别背,实测。 我这块板子可能是"有东西 = 低电平",你那块可能一样也可能不一样。唯一可靠的办法是:拿手挡一下,看数字怎么变。 这跟第 8 课按钮那次是一回事。
第四步:用万用表量一下。 拨直流电压档,黑表笔搭 GND,红表笔搭 OUT——没东西的时候多少伏?有东西的时候多少伏?
应该是一个接近 3.3V,一个接近 0V。 跟串口里打出来的数字对得上吗?
第五步,这一步最重要:拧那个蓝色电位器。
拿张纸片固定在离模块大概 5 厘米的地方,然后慢慢拧。
你会看到:往一个方向拧,它就"看见"了;往另一个方向拧,它就"瞎"了。
这就是"探测距离"在你手底下被拉长、被缩短。 你拧的不是一个抽象的参数,你拧的是这个东西的"视力"。
拧完记得把它拧回一个正常位置。 拧到极端(要么太灵要么太钝),后面的实验会莫名其妙地不工作——而且你已经忘了是你自己拧的。这种"自己给自己埋的坑",是硬件调试里最常见的。
第六步:黑白对比。 拿一张白纸和一块涂黑的纸(马克笔涂或者黑色电工胶布),放在离模块同样近的地方——白纸会让它"看见",黑的就不一定了。
这个差别,就是寻迹小车的全部秘密。
自测
答案与解析
别把它跟 PIR(人体红外) 搞混——PIR 靠感受人体发出的热量工作,能隔几米感应到人走动,那是商场自动门用的。我们这个靠发射红外光 + 接收反射光工作,有效距离只有几厘米,而且任何东西挡在前面都一样触发,它不知道那是你还是你的书包。
答案与解析
红外是门卫,只回答"有人/没人";光敏是体温计,能告诉你"多少度"。所以读红外用 digitalRead(得到 HIGH/LOW),读光敏用 analogRead(得到 0~4095)。红外给不了"多远",它压根不测距离——想测距离得用下一课的超声波。
答案与解析
正好反过来——黑色是吸光的,白色才反光。所以模块对着白纸时收到反射光("有东西"),对着黑线时收不到("没东西")。它不是"看见黑线",是"在别的地方都看得见、唯独黑线上看不见"。顺带一句:如果你的黑线不够黑、或者地面本身就是深色,这个办法就会失灵。
答题要点
答题要点应该包含:它调的是接收头的灵敏度,也就是"多微弱的光也算看见了",效果上就是改变有效探测距离——往一边拧更灵敏能探更远,往另一边拧更迟钝。为什么没有标准位置:因为你需要多远,取决于你的用途和环境——做寻迹时希望它只认那条黑线,环境光很亮时又得调钝一点免得误触发。只能在你自己的场景里一边拧一边试,这跟第 11 课光敏的标定是同一个道理:参数得在实际环境里调出来,抄不来。
拓展红外光人眼看不见,那你怎么知道那个"透明灯珠"真的在发光?
这个问题课上不讲,留给你自己找答案——**问 AI 是最好的办法**。
提示:搜"手机摄像头 红外 LED 可见"、"红外光 波长 780nm"。想一想:拿你手机的前置摄像头对着它拍一张,屏幕上会出现什么?为什么相机能看见、眼睛看不见?(试完记得把电位器拧回去)
拓展电视遥控器用的也是红外,它跟这个模块有什么不一样?为什么遥控器隔着五米都能用,这个模块只有几厘米?
这个问题课上不讲,留给你自己找答案——**问 AI 是最好的办法**。
提示:搜"红外遥控 38kHz 载波 NEC 编码"、"红外接收头 原理"。想一想:遥控器只是"照一下",还是在发送一串有规律的信号?它凭什么能抗住阳光的干扰?
本节你要动手做的事
- [ ] 认清两个"眼睛":哪个是透明的发射管、哪个是黑色的接收头,用手指点一下确认
- [ ] 接好线:
VCC→3.3V,GND→GND,OUT→GPIO4(接之前先断电) - [ ] 跑通读数:手从远处慢慢凑近,看串口数字什么时候跳、板上小灯什么时候变,记下方向和大概距离
- [ ] 万用表量一次:没东西和有东西时,
OUT对GND各是多少伏? - [ ] 拧电位器:固定一张纸片在 5 厘米处,左右拧,亲眼看探测距离被拉长、缩短
- [ ] 黑白对比:白纸 vs 涂黑的纸,放在同样的距离,看它认不认
- [ ] 做完自测题
这节课的知识点少得可怜:pinMode(4, INPUT) 加一句 digitalRead(4)。但你带走了两样更值钱的东西。
第一样:一种新的输入"性格"。 到现在为止你手上有三种——光敏给"多少",红外给"有/没有",你还没见过给"几厘米"的。下一节课就补上。
第二样:一个特别重要的习惯——先搞清楚一个传感器"不能做什么"。
红外为什么做不了自动门?不是因为代码难,是因为它压根不具备那个物理能力。这个判断,你必须在动手之前就做出来。
新手最容易犯的错,不是写错代码,是选错了零件,然后花一整天去调试一个物理上就不可能实现的东西。 那种挫败感最伤人——你会以为是自己不行。其实不是你不行,是那个方案本来就不成立。
以后每拿到一个模块,先问一句:"它到底在测什么?它的物理极限在哪?" 想清楚了再动手,能省你一整天。
下一节我们学超声波模块——套件里唯一能测距离的那个。 它会告诉你"前面那个东西离你 37 厘米",而不是只喊一声"有东西"。
而且它是四根线的,比别的模块多一根。多出来的那根是干嘛的?下节课说。