你打印的光学编码器黑白码盘,为什么红外传感器读不出来?

首发于公众号「如是有为」 · 查看原文

你打印的光学编码器黑白码盘,为什么红外传感器读不出来?

很多年轻创客第一次做机器人小车、轮速测量、云台控制,都会遇到一个看起来很简单的问题:我能不能自己打印一个光学编码器码盘?

听起来当然可以。画一个黑白相间的圆盘,打印出来,贴到轮子上;旁边放一个反射式光电传感器,比如 QRD1114、TCRT5000 或者 QTR 系列模块;白色区域反光强,黑色区域反光弱,传感器输出高低电平。轮子转一圈,数一下脉冲,就知道速度和位置。

逻辑非常完美,直到你接上示波器或者逻辑分析仪,发现波形乱得一塌糊涂:黑区读不黑,白区也不够白,轮子慢慢转还能凑合,转快一点就开始丢脉冲。

这时候很多人的第一反应是怀疑代码。是不是中断写错了?是不是阈值没调好?是不是电机干扰太大?是不是 PID 参数太烂?

这些都有可能。

但还有一个更基础、更隐蔽的问题:你眼里的黑色,不一定是传感器眼里的黑色。

代码没错,也许是“黑色”骗了你

一个最常见的创客方案是这样的:画一个黑白相间的圆盘,打印出来,贴在轮子上;旁边放一个反射式光电传感器。白色区域反光强,黑色区域反光弱,传感器输出高低电平。轮子转一圈,数一下脉冲,就知道速度和位置。

这个逻辑没有问题。

问题在于,反射式光电传感器并不是在判断“颜色”,它判断的是目标波长下的反射强弱。

人眼看到的黑白,主要来自可见光波段。一个东西看起来黑,是因为它在可见光下反射少。可是很多反射式光电传感器用的是红外 LED,常见工作波长可能在 850 nm 或 940 nm 附近。这个波段,人眼基本看不见。

所以你用眼睛验码盘,验的是“可见光下黑不黑”;传感器验码盘,验的是“红外下反不反光”。

这两件事不是一回事。

一个黑色油墨,在你眼里可能黑得很漂亮;到了红外传感器眼里,它可能只是深灰,甚至和白区差不了多少。

于是你以为自己做的是黑白码盘,传感器看到的却是灰灰灰灰灰。

那它当然读不出来。

你眼里的黑,在红外眼里可能只是灰

为什么会这样?

因为油墨、纸张、塑料、涂层这些材料的吸收和反射,本来就和波长有关。

喷墨打印机打出来的黑色,主要是为了让人眼觉得黑。它只要在可见光下吸收得够多,就能完成“视觉黑色”的任务。

但红外光不一定买账。

有些黑色油墨在可见光下吸收强,到了近红外波段吸收能力下降。红外光可能穿过油墨层,打到底下的纸张或塑料基材上,再反射回来。

这时候就出现了一个很反直觉的现象:肉眼看到的是黑区,红外传感器看到的却可能是反光区。

很多人会尝试把黑色打印得更深,比如重复打印两遍、三遍。这个方法有时有效,有时没用。关键不在于它肉眼看起来有没有更黑,而在于它在传感器工作波长下有没有真正变成低反射。

换句话说,你要解决的不是“黑给人看”的问题,而是“黑给传感器看”的问题。

这就是光学编码器里最朴素、也最容易被低估的一句话:

码盘不是画黑白格子那么简单。

打印三遍也没用:黑给人看,不等于黑给传感器看

这个问题不是凭空想象出来的。早年 Parallax 论坛上有一个很典型的创客案例:有人用 QRD1114 反射式红外传感器做自制光学编码器码盘,图案是喷墨打印的黑白条纹。他在台架上测试时发现,传感器和图案本身看起来都没问题,示波器上也能看到变化,但喷墨打印出来的黑区“不够黑”,无法可靠地让传感器关断;他还提到,黑色电工胶带做的图案在高速下工作很好,而喷墨打印在卡纸上的“黑色”被传感器看得像白色一样,因为它依然反射大量红外。

你打印的光学编码器黑白码盘,为什么红外传感器读不出来?

这个案例很适合拿来理解反射式编码器的第一层问题。

你以为你在调代码,实际上你可能在跟油墨的光谱特性较劲。

你以为你在做数字电路,实际上你前面还有一个小型光学系统。

你以为传感器读的是黑白,实际上它读的是反射率。

这也是为什么有时候换一张纸、换一种打印机、换一卷黑色胶带,效果会比改半天程序还明显。

真正决定波形的,不是颜色,是反射对比度

反射式编码器真正需要的,不是“看起来黑白分明”,而是白区和黑区在目标波长下有足够高的反射差异。

可以用一个简单公式理解:

C=Rwhite−RblackRwhite+Rblack.C=\frac{R_{\mathrm{white}}-R_{\mathrm{black}}}{R_{\mathrm{white}}+R_{\mathrm{black}}}.

这里的 (C) 是对比度,RwhiteR_{\mathrm{white}} 是白区反射率,RblackR_{\mathrm{black}} 是黑区反射率。

假设白区反射率是 0.8,黑区反射率是 0.1:

C=0.8−0.10.8+0.1≈0.778.C=\frac{0.8-0.1}{0.8+0.1}\approx0.778.

这个对比度就比较舒服。传感器看到的黑白差异很明显,波形幅值大,边沿也比较利索。

但如果白区还是 0.8,黑区反射率升到 0.4:

C=0.8−0.40.8+0.4≈0.333.C=\frac{0.8-0.4}{0.8+0.4}\approx0.333.

这时候肉眼可能还能看出黑白,传感器看到的差异已经小很多了。

差异小,会带来一串麻烦:信号幅值变小,边沿变慢,阈值更容易漂,环境光更容易干扰,轮子转快时更容易丢脉冲。

所以不要只问:“这个码盘看起来黑不黑?”

真正应该问的是:

在我的传感器工作波长下,黑区反射率到底够不够低?

调阈值之前,先拿万用表测一下黑区

很多自制编码器的问题,最后都绕回到一个很朴素的动作:拿实际使用的传感器,测一下材料。

把传感器固定好,距离不要乱动,分别对准白区和黑区,测输出电压。有万用表,就看静态电压差;有示波器,就看波形幅值和边沿;有逻辑分析仪,就看高速旋转时有没有毛刺和丢脉冲。

可以拿几种材料做对比:普通喷墨打印黑块、激光打印黑块、黑色电工胶带、黑色记号笔、哑光黑喷漆、白纸。

这个实验很有意思,因为结果经常和肉眼判断不完全一致。肉眼最黑的材料,不一定是传感器输出最低的材料;看起来普通的黑色胶带,反而可能比某些喷墨黑块更适合红外传感器。

再往下排查,还可以看传感器距离、安装角度、遮光结构和码盘贴装。反射式传感器对几何位置很敏感,太近、太远、角度偏了,都会让白区和黑区差别变小。环境光也会参与进来,尤其太阳光里有红外成分,一个简单的遮光罩,有时能让波形干净很多。

这些动作不复杂,但很有效。

它们会把问题从“感觉哪里都不对”,变成“到底是材料、距离、光照还是代码”。

小车只是抖一下,工业现场可能就是报警

在创客小车上,码盘读不稳,最多是速度估计抖一下,PID 难调一点,轮子跑得不太直。

但到了工业编码器,这个问题会被放大很多倍。

工业光学编码器不是简单数黑白格子。尤其是高分辨率编码器,读头往往不是只输出一个高低电平,而是要从码盘图案里提取高质量的模拟信号,比如正弦、余弦、索引信号、多轨 Nonius 信号,再交给后级电路或算法做插值和绝对位置解算。

这时候,码盘上的黑白图案不再只是“看起来清不清楚”的问题。

它会变成一整套系统工程问题:目标波长下的反射率,明暗对比度,边沿锐度,光斑尺寸,线宽和读头阵列周期匹配,码盘偏心和倾斜,材料批次一致性,温湿度老化,污染和油雾,装配公差。

创客项目里,看到的是“脉冲丢了”。

工业现场里,看到的可能是“相位误差”“插值噪声”“周期性谐波”“速度波纹”“客户设备报警”。

同一个物理问题,放在不同产品层级里,后果完全不一样。

到了 PNH3348 这类产品,问题不再是“有没有脉冲”

这里可以看一个成熟工业产品例子:iC-Haus 的 iC-PNH3348。

你打印的光学编码器黑白码盘,为什么红外传感器读不出来?

公开资料里,iC-PNH 系列被定义为 Phased Array Nonius Encoder,面向紧凑型高分辨率绝对编码器,可通过 Nonius 插值实现很高的单圈分辨率,并使用单片 3 通道 HD Phased Array 来获得较好的信号匹配。PNH3348 相关资料还明确把它列为 EncoderBlue® Phased Array Nonius Encoder。

这就和创客常用的 QRD1114 完全不是一个层级了。

QRD1114 那类玩法,本质上是“黑白差异足够大,我就输出高低电平”。

PNH3348 这类高分辨率光学编码器方案,关心的是从码盘图案里采出来的正余弦信号够不够干净:幅值是否一致,偏置是否可控,相位是否稳定,谐波是否够低,不同 Nonius 轨道之间的相位关系是否可靠。

换句话说,创客项目问的是:

“有没有脉冲?”

工业高分辨率编码器问的是:

“这个相位可信吗?”

这两个问题,中间隔着一整套光学、模拟电路、信号处理和量产工艺。

高分辨率编码器最怕的,是“差一点”的码盘

在低分辨率脉冲计数场景里,码盘差一点,有时还能靠阈值硬扛。

但在高分辨率光学编码器里,最怕的恰恰是“差一点”。

不是完全不能用,而是波形看起来还能跑,但相位已经不干净了。

黑区不够暗,会降低调制度;白区反射不稳定,会造成幅值波动;边沿不锐,会引入高次谐波;码盘图案线宽误差,会改变正余弦波形;不同半径轨道的工艺误差,会破坏 Nonius 轨道之间的相位关系。

这些问题最后都会进入插值算法。

而插值算法不是魔法。它可以补偿一部分偏置、增益和相位误差,但如果前端光学信号本身已经畸变得很厉害,后端算法只能把问题算得更精细,不能把一个差码盘变成好码盘。

这就是成熟产品和创客项目最大的区别。

创客项目里,信号不好,很多时候还能调阈值。

工业编码器里,信号不好,调阈值往往不够。

因为它要的不是“过没过门限”,而是“相位有没有被污染”。

蓝光不是换个 LED,码盘也要跟着换脑子

PNH3348 还有一个很值得注意的点:它不是前面 QRD1114 例子里那种红外小传感器。

公开资料把 PNH3348 放在 EncoderBlue® 路线下。很多人一听“光学编码器”,脑子里默认就是红外,但成熟工业产品不一定都用红外。有的用红外,有的用红光,有的用蓝光。

你打印的光学编码器黑白码盘,为什么红外传感器读不出来?

波长一变,码盘材料的判断标准也要变。

前面讲喷墨黑色在红外下可能不黑;到了蓝光方案,问题就变成:码盘材料在蓝光波段下的反射、吸收、散射和边沿成像是否满足要求。

蓝光波长更短,理论上有利于提高空间分辨能力,对高线数码盘和高 CPR 方案有吸引力。但它也会带来新的工程约束:码盘表面粗糙度对散射的影响可能更明显,油墨、镀膜、基材在蓝光下的反射率必须重新验证,污染、划伤、胶层、保护膜可能改变蓝光响应,LED 光谱分布、光电二极管响应、码盘反射谱都要匹配。

所以,从红外换到蓝光,不是简单地“把 LED 换个颜色”。

整个码盘工艺、材料选择、检测规范都要跟着变。

这才是工业编码器的真实难度。

阵列能救局部缺陷,救不了系统性材料错误

PNH3348 这类 Phased Array 架构,有一个很重要的产品价值:它不是一个孤零零的光电点在看码盘,而是一组单片集成的光电传感器阵列在对周期图案做空间采样。

这类架构可以带来两个好处。

第一,它能平均掉一部分局部缺陷。比如码盘上某个小污点、微小划伤,不一定立刻让整个信号崩掉。

第二,它能改善一部分装配容差。通过阵列采样、差分结构和相位信息处理,系统对一定范围内的偏心、倾斜、距离变化会更有韧性。

但这里有一个前提:

码盘图案本身必须在目标波长下足够可控。

如果码盘材料批次变化导致反射谱整体变了,或者边沿扩散整体变严重,那么阵列采到的就不是理想周期信号,而是带畸变的周期信号。

阵列可以缓解局部随机缺陷。

但阵列救不了系统性材料错误。

这句话,放在工业编码器里非常重要。

因为很多量产问题不是某一片码盘有脏点,而是一整批材料的光谱响应变了;不是某一条线有瑕疵,而是整个工艺窗口偏了;不是一个点坏了,而是所有点都“差一点”。

这类问题最难,因为它还能跑。

但跑出来的信号已经不干净。

真正难的,不是把信号读出来,而是让它一直可信

做编码器久了以后,我越来越觉得,光学编码器最有意思的地方,不是某一个器件有多复杂,而是它把很多看似不起眼的东西绑在了一起。

一颗 LED 的波长,一层油墨的吸收,一片码盘的表面粗糙度,一个读头的安装高度,一点点偏心,一点点灰尘,最后都会落到同一个地方:

信号质量。

在创客项目里,这个信号质量可能表现为“脉冲有没有读稳”。

在工业编码器里,它会变成更细的东西:正余弦幅值是否一致,相位是否稳定,Nonius 轨道之间的关系是否可靠,插值之后的角度噪声是否还能接受。

所以,QRD1114 那个论坛案例和 PNH3348 这类高分辨率产品,看起来隔得很远,其实底层问题有点像。

一个是在桌面上问:

这个黑白码盘为什么读不出来?

另一个是在产品里问:

这套光学链路出来的相位,能不能长期相信?

前者靠万用表、示波器、换材料,很快就能看到差异。

后者要靠材料规范、光谱测试、结构公差、老化验证和批次追溯,把这些差异控制在量产范围内。

它们的工具不一样,代价不一样,但起点是一样的:

不要只相信肉眼看到的黑白,要回到传感器真正工作的那个波长。

传感器不相信颜色,传感器只相信物理

很多人第一次做光学编码器,会把它理解成一个“黑白识别”问题。

这当然没错,但只说对了一半。

更准确地说,它是一个小型光学测量系统。里面有光源、材料、几何结构、光电转换、电路阈值、算法处理和机械误差。肉眼看到的黑白,只是这个系统里最直观、也最容易骗人的一层。

QRD1114 会遇到这个问题。

TCRT5000 会遇到这个问题。

到了 PNH3348 这类成熟高分辨率光学编码器方案里,它不会消失,只会换一种更专业、更昂贵的形式出现:幅值不一致、相位误差、谐波、插值噪声、批次漂移。

这也是我觉得光学编码器很有意思的地方。

它表面上很简单,就是一片码盘、一束光、一个传感器。

但真正做进去以后会发现,传感器看到的从来不是“黑白格子”。

它看到的是反射率、相位、噪声和误差。

所以,当一个自制码盘读不稳时,代码当然要查,电路当然也要查。但别忘了拿同一个传感器,照一下黑区和白区。

有时候答案会很直接:

不是黑区画错了。

是它在传感器眼里,根本没那么黑。

应作如是观
公众号「如是有为」二维码

关注公众号「如是有为」

微信扫一扫,新文章先在公众号发出。