经典三问
Q: 传感器是什么?
A: 传感器是把现实里的光、温度、距离、声音、运动等变化,转换成电信号的器件。
Q: 为什么需要传感器?
A: STM32 只能处理引脚上的高低电平和电压,不能直接看见黑线、听见声音,也不知道轮子前面有没有障碍物。传感器把这些现实信息送到芯片面前。
Q: 传感器常见使用场景?
A: 循迹小车识别地面黑线,温度计测量环境温度,自动门感知有人靠近,手机判断自己是否被拿起,都是传感器在工作。
前面小车已经能让电机转起来,也能通过编码器知道轮子实际留下了多少脉冲。但它依然像闭着眼睛开车:不知道前面有没有东西,不知道地上的黑线在哪里,也不知道自己正处在亮处还是暗处。
小车需要开始认识车外的世界。
人靠眼睛看光线和颜色,靠耳朵听声音,靠皮肤感受温度和触碰。STM32 没有眼睛、耳朵和皮肤,它只有一些引脚和一颗处理数字的内核。传感器就是它认识现实的入口:把真实世界发生的变化,翻译成芯片能接收的电信号。
传感器到底在"感受"什么
传感器总是在观察某一种真实的量:
| 现实中的变化 | 传感器可能给出的信息 | 常见用途 |
|---|---|---|
| 光强、颜色、反射 | 电平或电压变化 | 循迹、自动亮灯 |
| 温度 | 电压或数字数据 | 温度计、恒温控制 |
| 距离、是否靠近 | 电平、时间或数字数据 | 避障、自动门 |
| 声音 | 电压变化 | 拍手开灯、声音检测 |
| 加速度、角速度 | 数字数据 | 手机旋转、姿态判断 |
| 轮子的转动 | 脉冲 | 测速、记录路程 |
最后一行已经见过了。编码器就是一种传感器:轮子转动是现实里的动作,A、B 两相脉冲是它交给 STM32 的消息。STM32 不能直接看见轮子转了多少圈,却能数脉冲。
不同传感器的外形、接线和输出方式各不相同,但中间都在做同一件事:
text
现实变化 -> 传感器 -> 电信号 -> STM32
温度不是电,距离不是电,黑线也不是电。它们先被传感器变成电平、电压、脉冲或一串数字,芯片才有机会去判断和处理。
STM32 能听懂的,只有电信号
对 STM32 来说,引脚上最直观的两种状态是高电平和低电平。前面按键松开、按下时,PB11 读到的就是这两种状态;编码器 A、B 相跳动时,给出的也是高低变化。
有些传感器只需要交出一个明确判断:
text
有人 / 没人
太亮 / 不太亮
压到黑线 / 没压到黑线
这种结果用高低电平就足够了。高电平代表一种状态,低电平代表另一种状态。程序读到以后,可以像读按键一样做出选择。
但现实世界不是所有变化都只有两种答案。房间里的光可以一点点变暗,水温可以从 20 摄氏度慢慢升到 21、22、23,黑线边缘也不是一条只有"黑"和"白"的绝对分界线。
传感器面对这些连续变化时,往往会给出连续变化的电压:光越强,电压可能越高;距离越近,电压可能越低。具体是变高还是变低,要看每一种传感器的设计;重要的是,中间存在很多状态,而不只 0 和 1。
text
低电平 高电平
0V ---- 0.8V ---- 1.6V ---- 2.4V ---- 3.3V
很暗 一般 很亮
高低电平像一道判断题,答案只有两项;连续电压更像一把刻度尺,能保留变化有多大。两种输出没有高低之分,取决于程序到底需要一个明确结论,还是需要知道中间细节。
灰度传感器怎样看见黑线
循迹小车常用的灰度传感器,看的不是"颜色"这个词本身,而是地面对光的反射。
传感器上通常有一只发光元件和一只接收元件。发光元件往地面照出光,接收元件等待地面反射回来的光:
text
发光 -> 地面 -> 反射光 -> 接收
白色表面通常反射更多光,黑色表面通常吸收更多光,反射回来的光就更少。接收元件感受到的光强不同,输出的电信号也会不同。
text
白底:反射光较多 -> 接收信号较强
黑线:反射光较少 -> 接收信号较弱
这里说"通常",是因为现实不会像示意图那样干净。地面材质、环境光、传感器离地高度、黑线颜色和污渍,都会改变反射效果。同一块白纸在强光和暗处反射出的结果也不同;同一条黑线,传感器抬高一点,读数也会变化。
所以灰度传感器不是在辨认"这一定是黑色",它是在比较"现在收到的反射光多不多"。小车沿黑线走,本质上是在利用黑线和背景之间足够明显的反射差异。
八只眼睛排成一排以后
一只灰度传感器只能知道自己脚下的一小块地方偏黑还是偏白。把八只传感器横着排在小车前方,它们就能同时看到左边、中间和右边的地面。
text
左侧 右侧
[1] [2] [3] [4] [5] [6] [7] [8]
黑线落在中间,中央几只看到的反射会和两侧不同;黑线偏左,左边几只的变化会更明显;黑线完全跑到边上,最外侧的传感器也会给出线索。
传感器本身只负责报告各自看到的反射情况。至于"黑线偏左时,左右轮应该怎样变化",是 STM32 根据这些信息做出的下一步动作。眼睛负责看,程序负责决定往哪里走。
现实变化怎样变成程序里的数字
灰度传感器接收到的光强是连续变化的,而 STM32 处理的是数字。中间还需要一个翻译过程:把某个时刻的电压变成一个可以比较、显示和计算的数。
一根传感器线上的电压,并不天然就是 C 语言里的整数;芯片需要按自己的规则量一次这个电压,再给程序一个数字。
同一块灰度模块有时会先帮忙做出"黑线 / 白底"的二选一判断,有时也会把连续变化的原始信号保留下来。前一种更容易让小车先沿线跑,后一种能看见黑白之间到底差了多少。
最后橘猫说
传感器不是 STM32 的装饰品,而是它通向现实世界的入口。编码器把轮子的转动变成脉冲,灰度传感器把地面的反射差异变成电信号;从这一刻起,小车不再只是照着命令转动,也开始有机会根据自己"看见"的东西改变动作。