做一台会自己绕着客厅跑、碰到沙发腿知道拐弯、还顶着两只猫耳朵的清洁小车,这事我从画草图到能稳定跑完一圈,前后断断续续折腾了三个多月。中间烧过一块驱动板,废掉两版外壳,也经历过测距读数突然跳到八千多、机器原地打转的半夜。市面上扫地机器人几百块就能买到,功能还比我自己做的强,但亲手做一台的意义不在于替代它,而在于把"感知—决策—执行"这条链路完整地走一遍,走通之后你会发现,激光测距、电机闭环、状态机这些词不再是数据手册里的名词,而是你手里这台小车每一次转弯的依据。这篇内容面向的是有基础电子和编程概念、想动手做一台桌面级移动机器人的人,也适合正在做课程设计或毕业作品、需要一个可扩展平台的同学。我会把造型、选型、装配、代码、调试、维护整条线拆开讲,重点放在那些文档里不会写、只有装上去跑起来才会暴露的细节上。
1. 猫型外壳背后的工程账:造型如何反向约束底盘设计
很多人做移动机器人第一步是买底盘,第二步是往上堆传感器,最后再想办法套个外壳。这个顺序放在猫型机器人上会非常痛苦,因为猫的体型是"窄、长、有头有尾",而常见亚克力圆盘底盘的直径往往比猫身宽度还大。我第一版就是先做了一个直径18厘米的圆盘,结果外壳画出来像一只被压扁的仓鼠,头重脚轻,转弯时外侧轮几乎要离地。所以这个项目我建议反过来:先把造型的尺寸定死,再让机械和电气去适配它。
1.1 四条腿是装饰,三个轮子才是真相
猫型机器人最容易让人误解的地方是腿。四条腿如果真做成行走机构,成本和调试难度会翻好几倍,需要十二个舵机做步态,还要处理重心转移。我选择的是"视觉四条腿"方案:身体两侧各挂两片弧形侧板,从正面看是四条腿的轮廓,实际支撑靠两个驱动轮加一个前部或后部的万向球轮。这样做的直接好处是运动学模型退化成标准的差速驱动,所有轮式机器人的代码和调试经验都能直接复用。
侧板的安装位置有讲究。如果侧板底部离地太近,过门槛或者压到地毯边缘时会刮擦,机器会突然失速;离地太高又失去"腿"的视觉比例。我实测下来,侧板最低点距离地面留8到12毫米比较合适,既能过常见的3到5毫米门槛条,又不会在视觉上显得悬空。侧板本身用2毫米厚的亚克力或者3D打印的PLA都可以,PLA的问题是悬臂结构容易在夏天软化变形,如果家里温度高,建议侧板加一条横向加强筋,或者直接用亚克力。
万向轮的位置决定了整机的转向手感。放在身体前端(猫的胸口位置)时,转弯半径小,适合在沙发腿之间穿梭,但直线稳定性差一些;放在后端(猫的尾部)时直线更稳,转弯时前端摆动幅度大,容易蹭到墙。我最终选择前置万向轮,原因是猫型机器人头部本来就重(装了测距模块和舵机),前置支撑能把重心压在三角支撑面内,爬地毯边缘时不容易后翻。
1.2 头部视角决定了测距方案的上限
猫的头部天然是一个"云台"位置,这是这个造型最大的工程红利。测距传感器装在头部,配合一个9克舵机左右摆动,就能用一颗单点传感器覆盖前方大约120度的扇区,成本比多装三四颗传感器低得多,也比固定安装的覆盖范围宽。但这里有个容易被忽略的约束:头部的高度决定了传感器能"看到"什么。
装得太低,比如离地5厘米,传感器视线会被地毯绒毛、拖鞋、地上的电线大量遮挡,读数频繁跳变;装得太高,比如离地20厘米,又会漏掉低矮的障碍物,比如茶几底横梁、宠物的食盆边缘。我把头部传感器的光轴定在离地约11厘米,这个高度能越过大部分地毯绒毛,又能扫到沙发腿和椅子横档。如果你的家具普遍偏低,可以适当下移到9厘米,代价是要在滤波上多下功夫。
头部的摆动角度也需要限制。舵机从中间位置向左右各摆55度左右就够了,再大的角度会让传感器斜着打到自己的身体侧板,产生持续的近距离读数,程序会误判为前方有障碍。我在第一版里给了左右各80度,结果每次摆到极限就触发转向,机器像喝醉一样原地画圈,排查了半天才发现是"自己看见自己"。后来在侧板内侧贴了一圈黑色植绒胶带,配合把角度收窄到55度,问题才彻底消失。
还有一个造型带来的隐性好处:猫型外壳对家里宠物的接受度明显更高。我测试的时候家里那只猫对圆盘底盘的小车会哈气拍打,换成猫型外壳之后它只是远远看着,偶尔过来闻一下。如果你家里有宠物,外壳的圆角和低速启动策略值得多花点心思,启动时给一个缓加速斜坡,避免突然窜出去吓到动物。
2. 从主控到测距模块:一份踩过坑的选型清单
选型这件事,网上教程大多给的是"能用就行"的清单,但实际装到一台会移动、会震动、要靠电池供电的机器上,很多在桌面上跑得好好的模块会集体罢工。我把自己实际用过和淘汰掉的方案整理出来,重点说清楚每一项为什么这么选,以及换一个方案会付出什么代价。
2.1 主控板到底该选哪一档
主控这块我试过三种:经典的大板、窄长条的 Nano 类板子、以及性能更强的 32 位板。结论是这台机器用 Nano 类的小板就够了,原因不是性能,而是空间。猫身内部要同时塞下电池、驱动板、降压模块、舵机线和一堆杜邦线,大板的尺寸会直接把电池挤到无处安放。
资源占用上算一笔账:两路电机 PWM 占2个引脚,两个编码器各占1个中断引脚,舵机1个,测距模块走 I2C 占2个,再加上一个蜂鸣器或者状态灯,总共10个引脚左右。Nano 类的板子引脚数刚好够,留不出太多余量,所以如果你打算后期加陀螺仪或者红外接收,建议一开始就用引脚更多的型号,或者把测距模块和显示屏挂到同一条 I2C 总线上省引脚。
真正需要注意的是供电和中断。这类小板子的板载稳压芯片在输入7.4V时发热明显,我曾经连续跑二十分钟后摸上去烫手,后来改成电池先经过独立的降压模块降到5V再喂给板子,板载稳压只做备份。中断引脚方面,编码器读数必须走硬件中断,如果选用没有足够外部中断引脚的板子,就只能靠轮询,高速时丢计数,走直线会明显跑偏。
2.2 单点ToF、多路ToF还是旋转扫描
测距方案是整个项目里分歧最大的地方,我把三种主流路线摊开对比一下:
| 方案 | 成本量级 | 覆盖范围 | 主要问题 | 适合谁 |
|---|---|---|---|---|
| 单点ToF加舵机摆动 | 低 | 前方约120度扇区 | 有扫描周期,快速接近的障碍可能漏检 | 预算有限、追求动手乐趣 |
| 三到五颗ToF固定安装 | 中 | 前方加两侧 | I2C地址冲突,需要额外引脚做地址切换 | 想要即时响应、不介意布线 |
| 旋转激光扫描模组 | 高 | 360度 | 成本高、体积大、功耗高 | 想做完整建图与路径规划 |
我最终走的是第一条路线,核心考虑是成本和造型匹配。单点 ToF 模块体积小,正好能塞进猫的"鼻子"位置,一颗舵机就能让它左右张望,从行为上看也更像一只活的动物。代价是扫描周期:舵机从左到右扫一遍大约需要300到400毫秒,如果机器以每秒0.3米的速度前进,一个扫描周期内会前进10到12厘米,理论上存在漏检窗口。实际使用中这个问题不大,因为我在正前方额外固定了一颗不摆动的测距模块做"近距急停",两颗模块一颗负责"看远找路",一颗负责"贴身保命",分工明确。
如果选多颗固定安装的方案,一定要处理 I2C 地址问题。同型号的 ToF 模块出厂地址相同,挂两条在同一总线上会直接冲突,表现为读数全是同一个值或者干脆读不到。解决办法是用模块上的使能引脚逐个上电改地址,这个过程在代码里要加延时,上电顺序错了就改不成功。我第一次做的时候没加延时,三颗模块地址全乱,排查了一个晚上。
2.3 电机、驱动与轮径的匹配计算
电机我选的是带编码器的减速电机,减速比大约1比120,空载转速在每分钟一百多转。轮径用的是直径65毫米的橡胶轮。这两个参数决定了机器人的理论速度:
速度 = 轮子周长 × 转速 ÷ 减速比
轮子周长约0.204米,电机输出轴转速按每分钟110转算,换算成每秒约1.83转,乘以周长得到每秒约0.37米。这个速度对室内清洁来说偏快,实际运行时我用 PWM 限到六成左右,落在每秒0.2米上下,既不会撞得太狠,清洁头也有足够的驻留时间。
驱动板方面,双路直流电机驱动模块是标配,选的时候注意持续电流要留出一倍余量。堵转的时候电机电流会飙升到额定值的好几倍,我第一块驱动板就是在机器卡在沙发底下、电机堵转十几秒之后烧掉的,症状是其中一个通道彻底失效,机器只会原地转圈。换成持续电流更大的模块之后,又在代码里加了堵转检测:如果 PWM 输出正常但编码器在500毫秒内没有计数变化,就判定为堵转,立即反转后退再重新规划方向。这个保护逻辑救了我至少三次。
轮径还会影响里程计算。编码器每转的脉冲数乘以减速比,再除以轮子周长,才是每脉冲对应的行进距离。这个系数不准,走直线和沿边都会出问题。我的做法是让机器人在一条两米长的直线上跑十次,记录编码器累计值,取平均反推系数,比按理论值算准确得多,因为轮子有打滑、有压缩变形。
2.4 电源架构:为什么我放弃了单节升压
电源这块踩的坑最多。最早我用单节锂电池加升压模块给整机供电,图的是充电方便、体积小。实际跑起来问题一大堆:电机启动瞬间电流冲击大,升压模块输出被拉塌,主控直接复位,表现就是机器每隔十几秒突然停一下重新启动,像在思考人生。
后来改成两节电池串联,标称7.4V,再分三路:一路直接给电机驱动,一路降压到5V给主控和舵机,一路给测距模块。这样电机的大电流波动不会直接冲击主控的供电轨。即便如此,还是要在电机电源端并一个大容量电解电容,我用了470微法,并在主控电源入口串了一个肖特基二极管做隔离,防止电机反向电动势倒灌。加完这两样之后,复位问题基本绝迹。
电池容量和续航的换算在后面的章节会详细算,这里先给结论:两节18650、单节容量2500毫安时、串联后是7.4V 2500毫安时,整机平均电流实测在600毫安左右,理论续航约4小时,实际因为电机堵转、爬地毯等因素,能稳定跑2小时上下。
3. 机械装配:猫的身体里要塞下多少东西
装配顺序错了会非常难受,因为很多东西装上去之后就挡住了下一层的螺丝孔。我第二版外壳返工了两次,都是因为先把电池仓封死,结果发现驱动板要换、线要重走。这一节把堆叠顺序和开孔位置讲清楚,照着做能少走不少弯路。
3.1 三层夹心结构的堆叠顺序
我把猫身内部从下到上分成三层:
- 底层:两个驱动电机、万向轮支架、电池仓。这一层承重最大,底板厚度建议不低于3毫米,否则压上电池之后会中间下凹,导致轮子不能同时着地,走起来一颠一颠。
- 中层:驱动板、降压模块、电源开关和充电接口。这一层走线最密,建议在底板上预留扎带孔,把电机线单独捆在一侧,避免和信号线绞在一起。
- 顶层:主控板、测距模块、舵机。顶层要方便打开,我用的是一块可拆卸的盖板,用磁吸加两颗螺丝固定,调试的时候掀开就能插线。
层与层之间用铜柱支撑,高度按元件最高点来定。我最初用了25毫米的铜柱,结果驱动板的接线端子顶到了顶层盖板,盖不上。后来改成35毫米,空间一下子宽裕了,代价是整体高度增加,猫看起来变胖了。如果你对外观比例有要求,可以选矮一点的接线端子,或者把驱动板平放而不是立着装。
3.2 测距窗口的开孔与串扰
测距模块前面必须开窗口,这个窗口的处理直接决定读数质量。我试过三种做法:
第一种是完全敞开,模块裸露在外。读数最准,但灰尘和猫毛很快会糊在镜片上,一周就得擦一次。
第二种是贴一层透明亚克力。方便清洁,但亚克力对红外光有反射和衰减,读数会系统性偏小,而且亚克力表面一旦有划痕,反射就变得不稳定,读数开始乱跳。我测下来,2毫米亚克力会让近距离读数偏差在1到2厘米,远距离偏差更大。
第三种是在开孔处装一圈黑色遮光筒,前面不加任何透明材料。这是我现在用的方案,遮光筒深度约8毫米,内壁贴黑色植绒,能挡掉大部分侧向杂光和自身结构的反射,读数最稳定,缺点是仍需定期用棉签清理镜片。
另一个容易忽略的问题是两颗测距模块之间的串扰。如果急停模块和扫描模块装得太近,一个模块发射的红外光会被另一个接收到,产生虚假的近距离读数。解决方法是让它们的光轴错开角度,或者在代码里错开测量时序,不要同时触发。我采用的是错峰测量,两颗模块轮流读取,间隔20毫秒,实测下来串扰基本消失。
3.3 清洁模块与行走机构的耦合
清洁部分我做得比较克制,没有搞滚刷加吸尘的复杂结构,而是在猫的腹部装了一个小直径的软毛刷辊,由一个小电机通过皮带带动,配合一块可拆卸的静电除尘布。这样做的理由是功耗和重量可控,而且刷辊的转速不需要很高。
刷辊的位置很关键。装得太靠前,会把灰尘往机器后面推,扫不干净;装得太靠后,机器前轮压过之后再刷,效果也一般。我把它放在两个驱动轮中间偏前大约3厘米的位置,刷毛接触地面的深度控制在2到3毫米。刷毛压得太深,行走阻力明显增加,续航直接掉三成;压得太浅,只是轻轻擦过,几乎没有清洁效果。
刷辊电机和行走电机共用一路电源时,启动瞬间的电流冲击会叠加。我的处理是给刷辊电机单独一路开关控制,启动时先让行走机构稳定运行一秒,再启动刷辊,避免两个冲击叠在一起触发欠压保护。
4. 代码骨架:把距离读数变成可执行的行走决策
代码这部分我不想给一份完整源码让读者直接抄,因为每个人的引脚分配、模块型号、机械参数都不一样,抄过去大概率跑不起来。更有价值的是把结构讲清楚:数据从哪来、怎么处理、怎么影响决策,每一层的职责边界在哪里。照着这个骨架填自己的参数,调试起来会顺很多。
4.1 原始读数的噪声特征与滤波链路
测距模块的原始输出并不像数据手册上画的那么干净。我在静止状态下连续采集一千个点,目标是一面白墙,距离约80厘米,读数的分布在76到84厘米之间波动,偶尔会有几个离群点跳到一米五以上。这些离群点的来源包括环境光突变、目标表面反光特性、以及模块内部的测量时序抖动。
直接用原始值做判断会有两个后果:一是机器在障碍物边缘反复犹豫,走走停停;二是偶尔的远距离跳变会让机器误以为前方通畅,一头撞上去。
我的滤波链路分三级:
- 中值滤波:取最近5次读数排序后取中间值,专门干掉突跳的离群点。窗口不能太大,5个点比较合适,窗口到9个点以上时响应会明显变迟钝,靠近障碍物时的制动距离变长。
- 一阶低通:对中值滤波后的结果再做平滑,系数取0.3左右,让距离变化有阻尼感,避免机械振动直接传导到决策层。
- 变化率限制:如果相邻两次滤波结果跳变超过30厘米,本周期不采信,沿用上一次的值。这一条对快速移动的障碍物(比如猫从前面走过)特别有效,能避免机器因为一个瞬时读数做出过激转向。
这三级滤波加起来的计算量很小,在8位主控上跑完全无压力。需要提醒的是,滤波会引入延迟,三级叠加之后从"真实距离变化"到"程序感知到"大约有100毫秒的滞后。所以急停逻辑不能走滤波后的数据,要用急停模块的原始读数直接判断,宁可误停也不能漏停。
4.2 一个够用的避障状态机
我这台机器的行为逻辑没有用复杂的算法,就是一个五状态的状态机:
| 状态 | 触发条件 | 行为 | 退出条件 |
|---|---|---|---|
| 直行 | 默认 | 双轮同速前进 | 前方距离小于阈值 |
| 减速观察 | 前方距离进入预警区 | 降速并让头部左右扫描 | 距离恢复或进入危险区 |
| 转向 | 距离小于制动阈值 | 停车、后退一小段、转向 | 转向计时结束 |
| 沿边 | 侧向距离稳定在设定区间 | 单侧轮降速贴边行走 | 侧向距离突变 |
| 脱困 | 连续转向超过设定次数 | 后退加随机大角度转向 | 前方恢复通畅 |
阈值设定需要结合机器实际速度。以每秒0.2米的速度、滤波延迟0.1秒计算,从感知到障碍到真正停下,机器还会前进2厘米,加上刹车距离,制动阈值定在15厘米比较稳妥。预警区可以设在35厘米,给减速和扫描留出时间。
转向策略上,我一开始用的是固定角度转向,比如每次都转90度。实际跑起来发现机器会在同一个角落反复卡住,因为固定角度转完之后往往又面对同一面墙。后来改成"优先转向空间更大的一侧":左右扫描各取一个距离值,往距离大的方向转,角度在60到120度之间根据距离比例浮动。这个改动之后,机器在复杂家具环境里的覆盖率明显提升。
脱困逻辑是最后加的,起因是机器卡在椅子腿之间来回转向十几分钟。现在的规则是:连续转向达到5次仍未脱困,就执行一次后退30厘米加随机大角度转向,并且把这次的转向方向记录下来,短时间内不重复同一方向。这个简单策略解决了我遇到的全部卡死情况。
4.3 直线保持:编码器闭环的最小实现
差速驱动机器人走不直是通病,原因是两个电机的特性不可能完全一致,同样的 PWM 值,一个轮子转得比另一个快一点,跑两三米之后就会明显偏航。开环控制下,偏航只能靠撞墙来纠正,效率很低。
最小成本的解决方案是用编码器做速度闭环。思路很直接:每个控制周期读取左右轮的脉冲数,换算成实际速度,和目标速度做差,用比例积分控制调整 PWM。比例系数从小的开始试,我最初给的值太大,机器走起来像在抽搐,左右轮反复过冲;把比例系数降到原来的三分之一,积分项慢慢加上去,走直线就稳了。
除了速度闭环,我还加了一个"航向偏差补偿":比较左右轮累计脉冲数,如果差值超过设定阈值,就给慢的一侧略微提速。这个补偿不需要陀螺仪,靠里程计就能应付短距离直线,跑十米左右的偏差能控制在几厘米内。如果要跑更长的直线或者做精确的原地转向,还是得加陀螺仪,靠里程计在打滑的地面上会累积误差。
代码结构上,我把控制周期定在20毫秒,用定时器中断触发。主循环只负责状态判断和串口输出,所有和时间强相关的动作都放在中断里,这样即使串口打印拖慢了主循环,电机控制也不受影响。这一点很重要,我在调试初期把控制写在主循环里,一开串口监视器机器就走不稳,关掉就正常,查了很久才意识到是打印语句拖慢了循环周期。
5. 现场调试实录:三类反复出现的问题与定位链路
调试阶段遇到的问题,绝大多数不是代码写错了,而是物理世界和程序假设之间的偏差。这一节我按"现象—排查路径—根因—修复"的顺序记录三个最有代表性的问题,重点在排查路径,因为同样的现象可能有完全不同的原因,直接给答案反而容易误导。
5.1 距离突然变成8190:I2C与量程边界
现象是串口里偶尔打印出8190这个数字,对应的距离判断全部失效,机器会把这个值当成"前方无限远",然后一头撞上去。第一次遇到时我以为是模块坏了,换了一颗新的,问题依旧。
排查路径是这样的:先看这个数值是不是固定值,确认每次出现都是8190,说明不是随机噪声,而是某种错误码;然后查模块的数据手册,发现超出量程或者测量无效时,模块会返回一个特定的边界值;接着测试返回条件,用手在模块前面快速挥动,返回8190的频率明显上升,基本确认是"测量超时或无效"。
根因有两个:一是模块的量程模式设置不对,默认模式的有效量程比标称值短,超过这个距离就返回无效值;二是 I2C 总线上偶尔出现通信错误,读到的数据本身就是坏的。
修复分两步。第一步在代码里加有效性判断:读数超过设定上限或者等于那个边界值时,直接丢弃,沿用上一次的有效值,并且连续无效超过5次就触发一次传感器重新初始化。第二步在硬件上加 I2C 上拉电阻,我原来依赖模块自带的弱上拉,线一长信号就变差,加了两个4.7千欧的外部上拉之后,通信错误率大幅下降。
还有一个容易忽略的点:I2C 线不能和电机线捆在一起走。我最初为了整洁把四根线绑成一束,结果电机一转,测距读数就开始漂。分开走线、交叉时保持垂直,问题就消失了。
5.2 黑色地毯上的"隐身"障碍
家里有一块深色长毛地毯,机器每次走到地毯边缘就直直撞上去,完全不带减速。但同样的位置放一个纸箱,机器能正常避开。
这类问题的本质是测距原理决定的。ToF 模块靠接收目标反射回来的光来计算距离,深色、粗糙、吸光的表面反射率极低,返回的信号很弱,模块要么测不到,要么测出来的距离比实际远很多。长毛地毯还有一个额外问题:绒毛会让光在纤维之间多次散射,回波被严重延迟,读数可能虚高十几厘米。
排查的时候我做了个简单实验:用不同颜色的纸板在同一距离测试读数,白色、灰色、黑色三种纸板的读数差异肉眼可见,黑色纸板的读数比实际距离远了将近二十厘米,而且波动很大。这就解释通了。
这类问题没有软件上的完美解法,只能靠冗余传感器兜底。我在机器前端下方加了一个简单的机械触须开关,一根细弹簧丝,碰到障碍物会闭合。软件上把触须信号作为最高优先级的急停输入,不管测距读数是多少,触须一闭合立刻停车后退。成本几毛钱,但解决了测距方案在低反射率表面上的系统性盲区。
同样的道理适用于玻璃门和镜面。玻璃对红外光几乎是穿透的,模块会测到玻璃后面的距离,机器会以为前方通畅。镜面则会把光反射到奇怪的方向。如果家里有落地玻璃或者大镜子,触须开关几乎是必需品。
5.3 电机一启动,测距就抽风
现象很怪:机器静止时测距读数非常稳定,一旦电机开始转,读数就开始大幅波动,误差能到半米。关掉电机又恢复正常。
排查从电源入手。我先用示波器看主控的5V供电轨,电机启动瞬间有明显的电压跌落和尖峰毛刺,幅度接近1V。这说明电机换向产生的干扰通过电源串到了测距模块。
第一步处理是电源隔离,给测距模块单独一路低压差稳压,输入端加大电容,输出端加小电容。改善明显但没有根治。第二步处理是走线,把测距模块的排线从电机线旁边挪开,缩短到5厘米以内,并且用屏蔽线。这一步之后波动幅度降到十几厘米。
第三步是软件层面的错峰:在电机 PWM 的关断间隙触发测距测量,避开电流跳变最剧烈的时刻。具体做法是把测距读取安排在控制周期的末尾,此时 PWM 刚完成一个周期,电流相对平稳。三步叠加之后,电机运行时的测距波动控制在3厘米以内,已经不影响决策了。
这个过程告诉我一个经验:移动机器人上的传感器问题,八成先从电源和走线找原因,剩下两成再去看代码。很多人一遇到数据异常就怀疑算法,其实物理层的干扰才是大头。
6. 续航、噪声与长期使用的维护细节
机器能跑起来只是开始,能不能长期稳定地用,取决于一些不起眼的细节。这一节讲三件事:续航怎么算准、噪声从哪里来、以及一份我自己在用的维护清单。
6.1 电池容量与实测续航的换算
理论续航的算法很简单:电池容量除以平均电流。但"平均电流"这个数必须实测,不能拍脑袋。我的做法是把万用表串在电池输出端,让机器在典型环境里跑完整整一轮,记录电流变化,然后取时间加权平均。
实测下来各路电流大致是:主控和测距模块合计约80毫安,舵机在摆动时平均约120毫安(静止时很低,但一直在小幅修正),两个行走电机在正常速度下合计约350毫安,刷辊电机约60毫安。总计约610毫安。用2500毫安时的电池算,理论续航约4.1小时。
实际续航只有2小时左右,差距来自几个方面:电机堵转和爬地毯时电流会翻倍;电池电压下降后,同样的 PWM 输出得到的实际功率下降,机器会变慢但电流不一定降低;电池的实际可用容量在放电后期会明显缩水。所以工程上一般按理论值的50%到60%估算实际续航,比较靠谱。
低电压保护必须做。锂电池过放会永久损伤,我在代码里设了电压监测,低于设定阈值就强制进入返航或停车状态,并让蜂鸣器间歇报警。分压电阻的精度会影响判断,建议用1%精度的电阻,并且在实际电压下校准一次,不要直接用理论分压比。
6.2 噪声来源的逐一压制
我最初那版机器跑起来像一台小型搅拌机,主要噪声源有三个:
- 减速齿轮的啮合噪声:这是最主要的,尤其在低速时特别明显。换用金属齿轮的减速电机会好一些,但成本上升。折中方案是在电机和底板之间加一层1毫米厚的硅胶垫,减少振动传导到外壳。
- 外壳共振:薄壁的3D打印外壳会把电机振动放大。解决办法是在外壳内壁贴一层薄薄的阻尼材料,或者在设计时增加加强筋改变共振频率。我在顶盖内侧贴了一圈泡棉胶带,噪声主观感受下降了三分之一。
- 刷辊与地面的摩擦声:刷毛太长或者压得太深时会发出持续的沙沙声。调整刷毛接触深度到2毫米左右,噪声会明显减小,清洁效果基本不受影响。
需要提醒的是,不要为了降噪把电机 PWM 频率调得太低。频率低于听觉范围时电机会发出明显的啸叫,反而更难听。我试过几个频率,最终定在能避开共振点又不产生刺耳啸叫的区间,具体值因电机而异,需要自己试。
6.3 一份可执行的月度维护清单
这台机器用到现在快半年,我整理了一份每月做一次的维护清单,花不了十五分钟,但能避免大部分"突然不好用了"的情况:
- 用棉签蘸少量无水酒精擦拭测距模块的镜片,注意不要用力按压镜片。
- 拆下刷辊,清理缠绕的毛发。长头发是刷辊的最大杀手,缠多了电机会过载。
- 检查驱动轮表面是否有磨损或者粘附物,橡胶轮粘上灰尘后抓地力下降,走直线会变差。
- 检查所有接线端子的松紧,特别是电池接口和电机接口,振动会导致接触不良。
- 用毛刷清理主控板上的灰尘,重点看散热片附近。
- 跑一次自检程序,让机器原地转一圈、前后各走半米,观察编码器计数是否对称,不对称说明有轮子打滑或者电机老化。
- 检查电池外观,有没有鼓包,充电时是否异常发热。
这份清单里最容易偷懒的是第二条,但恰恰是最影响体验的。我有一次出差两周回来,刷辊被头发缠死,电机堵转把驱动通道烧了,修了一天。从那以后我把清理刷辊设成了手机上的月度提醒。
如果你打算把这台机器长期放在家里跑,建议再准备一套易损件备件:一组刷辊、一根皮带、两颗测距模块。这些东西单价都不高,坏了能立刻换,不至于因为等快递让机器躺半个月。
最后分享一个我自己摸索出来的小技巧:调试阶段给机器加一个"慢速模式"开关,长按机身按键进入,所有速度降到正常值的三成,同时串口输出详细日志。排查问题时用慢速模式跑一遍,很多在正常速度下转瞬即逝的现象会变得非常清楚,比如转向时哪个轮子先动、测距在哪个角度开始跳变,一目了然。这个开关后来成了我最常用的调试工具,比反复改代码烧录高效得多。