很多人觉得扫地机器人这东西,要么是“真香神器”,要么是“智商税”。我属于中间偏执的那一类——买过成品机,把家里的石头和科沃斯都拆过,后来干脆自己动手攒了一台。今天写这篇,不吹不黑,只聊一个事:怎么样才能拥有一台“你自己的”扫地机器人。我整理出三条路线,外加一张攒机路线图,从纯小白到电路动手党,都能找到自己的切入点。
先说结论:三条路线分别是“买成品机”、“买模块半成品自己拼”和“全自主攒机”。前两条适合大多数人,第三条是真正的“攒机”玩法。不管走哪条,你对扫地机器人的理解都会比只看广告的人深一个层级。这篇文章会把每条路线的成本、难度、时间、踩坑点都说透,重点放在第三条路线,因为这才是标题里“攒机”两个字的核心价值。
1. 三条路线:从“买现成”到“全自主”
1.1 路线一:成品机的“零门槛”与“天花板”
第一条路线最简单,打开电商平台,花一两千买个主流品牌的扫拖一体机,开箱、联网、建图、让它自己跑。这条路线的优势是省心,激光雷达、陀螺仪、路径规划算法、防跌落传感器这些复杂的软硬件人家都给你调好了,你只需要定期倒尘盒。
但我得说句实话,成品机的“天花板”非常明显。我拆过自家那台两千价位的机器,内部结构其实不复杂——一个激光雷达、两个驱动轮、一个万向轮、一套边刷和滚刷机构、一块电池、一块主板。真正值钱的是它的导航算法和APP云端服务,而这些恰恰是你无法改造和升级的部分。你想让它扫得更细一点、定点清扫某个区域、换一套更高效的吸风结构,对不起,厂商没给你留这个口子。
所以路线一的真正问题是:你拥有的只是“使用权”,不是“掌控权”。它坏了、旧了、想改,你都使不上力。适合人群:预算充足、不想折腾、只想要结果的人。但如果你想拥有一台“自己的”扫地机器人,我会建议你至少走完路线二再看。
1.2 路线二:半DIY模块化方案,图的是什么
第二条路线是购买模块化组件自己组装。目前市面上有不少扫地机器人底盘套件,比如带电机驱动的底盘模块、现成的碰撞传感器模块、Arduino或ESP32控制板、红外避障模块,甚至还有开源的扫地机固件项目,可以刷到兼容主板上。
我为什么推荐这条路线?因为它是“攒机”的入门阶梯。你不需要画PCB、不需要设计机械结构,只需要把模块互相插好线、写一段控制逻辑,就能得到一台可以满地跑的小机器。这个过程带来的价值,是让你彻底搞明白机器人最基本的几个子问题:怎么走直线(轮速控制)、怎么感知障碍(传感器)、怎么决定下一步动作(决策逻辑)。
我身边很多朋友都是从这条路走进机器人坑的。半DIY方案的难度大概在进阶水平,会一点Arduino基础知识、能看懂接线图就能搞定。成本大概在三百到八百元之间,比你买成品机便宜得多,而且所有零件坏了都能单独换。它的短板也很明显:清扫能力弱,没有建图能力,路径随机,更像“会跑的玩具”而非“清扫工具”。但作为学习和把玩的载体,它比成品机有意思十倍。
1.3 路线三:全自主攒机,玩的就是掌控感
第三条路线就是真正的“攒机”——从零开始,自己选主控、传感器、电机驱动、电池、底盘架构和清扫机构,自己写程序,自己做结构组装。路线图里最关键的一点是:先确定你的机器到底要承担什么角色。
如果是为了扫地,那主控选型、清扫机构设计、吸风通道的密封性都是重点;如果是为了学习和把玩,那重心就放在运动控制、避障逻辑和路径规划上;如果要兼顾,那就需要综合设计。我自己的第一台攒机作品走了偏学习路线,清扫功能很弱,但避障和沿墙逻辑做得还算扎实,因为我觉得这部分才是能迁移到任何机器人项目的底层能力。
全自主攒机的成本波动很大。控制在三百块以内能做出能跑的小车,五百到八百块能做出像样的扫地机器人,上探到一千多块可以加装树莓派实现建图导航。时间和精力成本是最高的,我从画结构到稳定跑起来,前后花了两个周末外加好几个晚上。遇到问题的时候,论坛上的开源资料帮了大忙。这条路适合愿意查资料、愿意试错的人,收获是三条路线里最大的。
1.4 三条路线怎么选:预算、动手能力与时间成本
我做了一张选型对照表,方便各位直接对号入座:
| 对比维度 | 路线一:成品机 | 路线二:半DIY模块 | 路线三:全自主攒机 |
|---|---|---|---|
| 预算 | 800-3000元 | 300-800元 | 300-1500元 |
| 时间投入 | 1天 | 2-3天 | 2-4周 |
| 动手难度 | 无 | 低-中 | 中-高 |
| 清扫效果 | 强 | 弱 | 中(可调) |
| 可玩性 | 低 | 高 | 极高 |
| 故障可修性 | 低(保修期内不敢拆) | 高 | 高 |
| 学习价值 | 低 | 中 | 高 |
我的建议是:如果你只是想家里干净,别犹豫,走路线一;如果你对机器人怎么工作有好奇心,走路线二;如果你看完这篇文章手痒难耐、家里还有一堆闲置的开发板和传感器,那直接跳到路线三。接下来整篇文章的重点,就是第三条路线的完整路线图。
2. 攒机路线图的核心部件拆解
2.1 主控选型:Arduino、ESP32还是树莓派
攒机第一步是选主控,它决定了你能写出多复杂的逻辑。市面上常用的三款主控各有各的脾气。
Arduino Uno/Nano是我最推荐的入门选择。它上手门槛极低,网上教程一抓一大把,用C语言写控制逻辑,烧录简单,稳定可靠。缺点也很明显:单线程、性能弱、没有网络功能,跑不了SLAM建图算法,RAM更是小得可怜,复杂地图数据塞不下。
ESP32是我自己攒机时用的主控。它比Arduino强大得多,双核240MHz,有Wi-Fi和蓝牙,能接入智能家居协议,内存也勉强够跑简化的栅格地图。价格甚至比Arduino还便宜,一块开发板十几块钱二十块钱就能拿下。缺点是引脚和时钟配置比Arduino复杂,新手上手会有一段落差,而且3.3V逻辑电平和一些5V传感器接的时候需要转换。
树莓派这类Linux单板电脑是终极方案,能跑完整SLAM、用摄像头做视觉识别、甚至部署轻量级神经网络。缺点也明显:开机慢、功耗高、价格贵,还配着一堆外设。我用树莓派做过一次语音助手联动,但作为扫地机器人的主控,总觉得像用大炮打蚊子——性能溢出不说,供电和管理复杂度也上来了。
我的建议很直接:想先跑通做个原型,用Arduino;想做一台真正有点智能、能连接网络和家庭的机器,用ESP32;想冲刺研究级建图导航,再上树莓派。扫地机器人攒机路线图里,ESP32是我的主力推荐。
2.2 传感器组:避障、沿墙、碰撞检测
一台扫地机器人眼睛由三种传感器组成:碰撞传感器、红外测距传感器和(可选的)陀螺仪/编码器。
碰撞传感器是所有扫地机的地板,我用的是一组微动开关,装在机器前端和两侧的弹性缓冲板上。撞到障碍物时,缓冲板向里缩,微动开关被触发,主控就知道“撞到了”。选用时要注意触发力度,我买过一批太灵敏的开关,还没碰到就触发,机器变成了“神经质”,在开阔地疯狂转向。后来换成需要明显位移才能触发的型号才正常。
红外测距传感器是避障的关键。我用的方案是让两个红外收发管一组,放在机器前左右方向,发射红外光并检测反射光强度,感知前方是否有障碍物以及大致距离。这个方案成本很低,一组几块钱,缺点是容易受环境光干扰,在大太阳地板上可能误判。为了抑制干扰,我让红外发射以38kHz频率调制,接收端用一体化红外接收头,效果稳定很多。
陀螺仪和编码器是路线图里容易被忽略的部分。陀螺仪用MPU6050,能感知机器朝向变化,避免走曲线;电机编码器能反馈轮子实际转速,才能做到两个轮子速度一致。这两样东西决定了扫地机器人能不能走直线,我在第三节会细讲。没有它们,你的机器会像喝醉了一样在房间里画圈圈。
2.3 电机与驱动:轮子怎么听话
轮子驱动我用的是TT马达加编码器的方案。TT马达很常见,减速比1:48,扭矩适中,价格几块钱一个。编码器通过霍尔传感器输出转动脉冲,主控计算脉冲来估算转速。这个方案是“攒机”路线图里最经典的配置。
电机驱动板选择方面,我建议直接用TB6612FNG。相比老式L298N,它体积小、压降小、发热低,PWM调速线性也更好。接线时要注意逻辑电压和电机电压分开供电,不然主控很容易被电机的电流尖峰打死。
这里有个关键概念叫“闭环控制”。如果你只给两个电机塞一个固定PWM占空比,由于轮胎摩擦、电压波动和电机个体差异,左右轮实际转速很难一致,机器就跑不直。配合编码器,主控不断读取左右轮转速,用PID算法修正PWM,让两个轮子始终维持在目标转速。我把PID调参放在下面第五节讲,这里只先记住一句话:没有编码器反馈的扫地机器人是不合格的。
2.4 清扫机构设计:毛刷、尘盒与风道
清扫机构是扫地机和普通小车的本质区别。攒机路线图里最简单的清扫方案是一个边刷加一个中扫毛刷的组合。边刷负责把墙边和缝隙的垃圾扒到中间,中扫毛刷负责把垃圾扬起,再配合风扇和尘盒收集。
边刷电机我用的是N20微型减速电机配合硅胶边刷支架,转速控制在两三百转。中扫部分我做过两个版本:第一版直接用N20带一根橡胶棒,转起来纯属“扰民”,地面灰尘根本扬不起来。第二版换成了带毛刷滚轮的结构,扫地效果立刻提升。核心经验是:毛刷滚轮必须紧贴地面,但又不能被压死,一般留0.5毫米左右的间隙最好。
风道和尘盒的设计是最容易被忽略的“隐形重点”。风扇电机放在尘盒上游还是下游、风道有没有漏气,直接决定吸力。我第一版用了二手涡扇,直接把风扇怼在尘盒开口处,结果尘盒里永远空荡荡,垃圾全被卡在毛刷处。后来把尘盒做成一个密封盒子,进风口加了一层滤网,风机放在出风口后面抽气,这样才能形成负压,垃圾才真正被吸进尘盒。实测下来,密封性对吸力的影响远大于风机本身的功率。
3. 实战:从零件到一台能跑的扫地机器人
3.1 底盘组装与接线
我来说说我攒机的实际过程,按步骤走完,各位至少能复刻一个能跑的原型。
底盘我用的是一块8毫米厚的亚克力板,尺寸大概20×20厘米,两层结构:下层装电机和电池,上层装主控和驱动板。四个角装上碰撞缓冲传感器,前端装红外避障模块。这样设计的理由是:重心低,不容易在越障时翻车;上下分层方便拆装,调试时不用每次都把整个机器掀开。
接线顺序我总结成一句口诀:先电源、再电机、后传感器。电源地用独立线束连接,正负极之间加一个1000微法电解电容做滤波,防止电机启停瞬间拉低电压导致主控复位。我用的是两节18650电池串联,标称7.4V,给驱动板供电,再通过降压模块输出5V给主控、输出3.3V给红外传感器和MPU6050。多说一句,不要直接用AMS1117给电机电路供电,电流不够,电压还会被拖垮。
TB6612驱动板的接线比较直观:VM接电池正极,VCC接逻辑电压5V,AIN1/AIN2和BIN1/BIN2接主控四路GPIO,PWMA/PWMB接PWM引脚。电机编码器的输出接到主控的外部中断引脚上,这样能在轮子转动时立刻触发脉冲计数。
3.2 基础运动控制程序
接线完成后,第一件事不是加传感器,而是先写一个最基础的运动控制程序,验证电机能不能转、编码器能不能读到数。我用ESP32和Arduino框架,核心代码如下:
#include <Arduino.h> // 电机驱动引脚 #define AIN1 16 #define AIN2 17 #define PWMA 18 #define BIN1 19 #define BIN2 21 #define PWMB 22 // 编码器引脚(外部中断) #define ENC_A_LEFT 34 #define ENC_A_RIGHT 35 volatile long leftCount = 0; volatile long rightCount = 0; void IRAM_ATTR leftEncoder() { leftCount++; } void IRAM_ATTR rightEncoder() { rightCount++; } void setup() { Serial.begin(115200); pinMode(AIN1, OUTPUT); pinMode(AIN2, OUTPUT); pinMode(BIN1, OUTPUT); pinMode(BIN2, OUTPUT); pinMode(PWMA, OUTPUT); pinMode(PWMB, OUTPUT); attachInterrupt(digitalPinToInterrupt(ENC_A_LEFT), leftEncoder, RISING); attachInterrupt(digitalPinToInterrupt(ENC_A_RIGHT), rightEncoder, RISING); } void setMotor(int pwmA, int pwmB) { digitalWrite(AIN1, pwmA > 0 ? HIGH : LOW); digitalWrite(AIN2, pwmA > 0 ? LOW : HIGH); digitalWrite(BIN1, pwmB > 0 ? HIGH : LOW); digitalWrite(BIN2, pwmB > 0 ? LOW : HIGH); ledcWrite(0, abs(pwmA)); ledcWrite(1, abs(pwmB)); } void loop() { setMotor(200, 200); // 左右轮同向200/255占空比 delay(1000); Serial.printf("L:%ld R:%ld\n", leftCount, rightCount); }这里有几个坑提醒一下:ESP32的PWM通道需要用ledcSetup和ledcAttachPin提前配置,上面代码里我简化了这部分,各位务必补上;编码器中断函数里做了IRAM_ATTR标记,不然在Wi-Fi启用后会触发复位或崩溃。跑起来后观察串口输出的左右轮脉冲数,如果相差很大,说明两个轮子的驱动力矩确实不同,这就是后面需要PID校准的原因。
3.3 避障与沿墙逻辑的实现
电机验证完毕,接下来就是给扫地机器人加“性格”——也就是避障行为逻辑。这一步是整个项目最有意思的地方,因为有无数种设计方案,从最简单的“碰撞则转向”到带状态机的“沿墙清扫”都可行。
我的实现方式是红外传感器先探测,超声波或者碰撞传感器兜底。逻辑框架是:前方没有障碍物时直行;红外检测到左前方或右前方有障碍,就朝相反方向转向;碰撞传感器触发时,先倒退半秒,再随机转一个角度继续走。
这里有一个关键的设计决策:“随机转角”不能是等概率随机,否则机器会在原地反复转圈,我管这叫“脱困不足”。我实现的策略是生成一个非对称的随机角度,比如偏向连续性方向的60度到120度,这样在房间里转一圈回来大概率能覆盖边缘区域。沿墙逻辑则用侧面红外传感器,保持与墙面15厘米左右距离行驶,一旦距离变远,就向墙内转向。
用状态机的方式实现最清晰。把机器当前状态分成IDLE、FORWARD、TURNING、BACKOFF、WALL_FOLLOW几个状态,每个状态下执行对应动作,根据传感器事件切换状态。这样写出来的代码逻辑清晰,方便排查问题,也方便后续加建图逻辑。我把这个状态机看作扫地机器人攒机路线图里最核心的知识点。
4. 常见问题与排查实录
4.1 走不直、乱撞怎么办
“走不直”是我被问到最多的问题。排除机械因素后,问题基本出在轮速闭环没做好。我第一次攒机时,左右轮脉冲差高达15%,机器每两米就偏了一个身位。后来给两个电机各加了一个增量式PID控制器,误差才压到2%以内。
增量式PID的思路是:在每个循环周期里,读取当前编码器计数,和期望值做差,用比例、积分、微分三个环节计算PWM补偿量。我这里给出一个能用的简化版本:
typedef struct { float kp, ki, kd; float target, lastError, integral; } PID_T; float updatePID(PID_T* pid, float current) { float error = pid->target - current; pid->integral += error; float derivative = error - pid->lastError; pid->lastError = error; return pid->kp * error + pid->ki * pid->integral + pid->kd * derivative; }调参的经验是:先只调kp,从0.1开始缓慢往上加,直到转速接近目标值但有轻微抖动;再加一点点ki消除稳态误差;kd我一般设得很小甚至为零。特别注意integral项要限幅,不然机器启动瞬间的误差会导致积分饱和,一启动就飞轮全开。我在实际调试中还加过一个“防抖”技巧:PID输出值在极小范围内变化时,直接保持上一次输出,能延长电机驱动管寿命。
4.2 清扫效果差的三个真相
很多人绕过了路线一直接走路线三,攒出来的机器扫不干净,于是回来问我怎么回事。我总结了三个最容易被忽略的真相。
第一个真相是最基本的物理问题:吸力不是风机的错,是风道的漏。用一张纸巾贴住尘盒进风口,如果纸巾能被吸住且风机转速不衰减,说明风道密封性合格;如果风机转了但纸巾纹丝不动,十有八九是漏气。我用美工胶带把尘盒盖和风道接口缠了两圈,吸力立刻上来。
第二个真相是毛刷的“抛尘”作用比吸力更重要。扫地机器人能否把地上的灰尘“端”起来,核心在于中扫毛刷的高速转动。很多人攒机时只重视吸尘电机,结果毛刷转速太低,垃圾被扫到旁边又弹走。我给中扫毛刷单独加了一条PWM通道,转速调到3000转以上,效果明显改善。
第三个真相是续航和尘盒容量的本质矛盾。扫地机的尘盒只有几百毫升,越小的尘盒越需要频繁清理。攒机方案里我倾向于做大尘盒而不是加强吸力,因为风机的静压和风量之间存在权衡,尘盒体积大,风机在运行时反而不容易堵死。
4.3 电池续航短,升级方向
我最初用两节18650电池,容量标称2600mAh,实测续航只有四十几分钟,还没跑完一个客厅就趴窝。排查发现不是电池虚标,而是驱动电路静态功耗太高:ESP32开发板LED灯、降压模块空载电流、电机PWM频率设置太高都成了“电老虎”。
优化方向有几个。把开发板上的电源指示灯焊掉,空载功耗从几十毫安直接降到几毫安;降压模块换成低静态电流的型号,比如MT2492系列,做到几十微安级空载;电机PWM频率从1kHz降到20kHz左右的高级PWM模式,可以减少开关损耗。这样组合优化后,续航提升到两个小时左右。
如果还嫌不够,不要盲目加电池,要考虑并联扩容和放电倍率。18650要选动力电池或者阻值低的型号,不然放电电流不足,电机一拉高负载电压就剧烈波动,主控会反复复位。我在后期换成了两串的21700电池组,容量翻倍,电压平台更稳,扫地时的韧性显著上升。
5. 成本、安全与后续扩展
5.1 全套攒机成本明细
很多读者最关心的就是“自己攒一台到底要花多少钱”。我把常见配置的零配件价格整理成表,按我自己第二版的配置来算:
| 部件 | 型号/方案 | 参考价格 |
|---|---|---|
| 主控 | ESP32 DevKit | 15元 |
| 电机驱动 | TB6612FNG模块 | 8元 |
| TT电机+编码器 | 带霍尔编码器 | 25元/个 |
| 电池 | 两串18650+保护板 | 40元 |
| 红外避障模块 | 38kHz红外对管 | 10元 |
| 微动开关 | 碰撞缓冲组 | 10元 |
| MPU6050 | 六轴陀螺仪模块 | 8元 |
| 亚克力底盘 | 定制双层板 | 30元 |
| 清扫机构 | N20电机+毛刷+尘盒 | 35元 |
| 降压模块 | MT2492/AMS1117 | 6元 |
合计约两百元出头。我再算上杂七杂八的螺丝、线材、热缩管、杜邦线,总成本控制在三百元内。这个价格只有成品扫地机的五分之一,但动手带来的满足感完全不是一回事。如果你想更高阶,比如加树莓派、激光雷达和SLAM建图,那预算就要上到一千以上,性能和“智商”也会有明显飞跃。
5.2 安全注意事项
攒机过程里最容易忽视的就是安全问题。我拆过不少别人的DIY小车,有的真的让我捏一把汗。
电池安全排第一。18650电池一定要配保护板,不配保护板的电芯在过放、过流时都可能鼓包甚至起火。充电时也必须用专门的平衡充或者带保护的充电模块,绝不能直接用可调电源瞎怼。我见过一个案例,把两串电池直接接到USB充电器上,几分钟就把保护板烧了。
走线安全排第二。电机进线要选用0.5平方毫米以上的硅胶线,别贪图细线节省空间。所有焊点要套热缩管,所有接线端子要做绝缘处理。主控和电池之间一定要串联一个自恢复保险丝或物理开关,这样调试时能一键断电,避免不小心烧板子。我还习惯在风扇或电机堵转时加了软件层面的超时保护,防止堵转电流长期拉高造成过热。
最后一个安全问题是运行时的人机环境。扫地机运行时周围不要有裸露的线材和宠物毛团,边刷缠线是大家都会遇到的事。我后期给边刷加了一个弹性的过载保护结构,缠死后会自动打滑,而不是硬转导致电机烧毁。
5.3 进阶方向:导航、建图与联动
攒机走到这个阶段,机器已经能跑了,但我身边的人玩到这一步往往不会停下,因为更大的乐趣在后面。
第一个进阶是导航建图。用树莓派加激光雷达,跑开源的Cartographer或ROS的gmapping算法,就能让扫地机器人从“随机乱逛”进化为“地图清扫”。这一阶段会用到里程计、IMU、激光雷达数据融合,对有人想入门SLAM来说,是个特别好的实践平台。我之前用ESP32做实时数据采集,把串口数据传给电脑上跑ROS的虚拟机,在客厅里跑出过一张还不错的栅格地图。
第二个进阶是联网智能联动。ESP32本身就支持接入MQTT或Home Assistant,扫地机器人扫描完一个区域后,可以联动智能灯、空气净化器、加湿器设备。比如我在扫地机回充时让客厅灯自动调亮,便于观察清扫效果,这种自定义联动是成品机永远给不了的体验。
第三个进阶是边缘计算视觉识别。树莓派加一个广角摄像头,跑YOLO之类的目标检测模型,就能识别是袜子、电线还是宠物粪便,决策“绕过去”还是“停下来”。门槛偏高,但对有兴趣的人来说,这是把扫地机器人从“家用工具”变成“机器人学习平台”的里程碑。
最后再分享一个我自己的小习惯:每完成一个功能迭代,都用Markdown补一段调试日志,记录当时的参数、现象和修改原因。攒机最大的乐趣不是让机器变聪明,而是让你越来越清楚每个细节背后的原理。下次再遇到问题时,翻翻日志,很多坑都能快速绕过去。
这篇路线图写到这里,我实验台上那台自攒扫地机器人还在角落里沿着墙边来回走。它走得不算优雅,吸力也不算大,但我每次拆开底盘换零件、调参数的时候,都会觉得这三百块花得比买一台成品机值太多了。如果看完你也手痒,建议先从最便宜的Arduino小车轮子方案开始,一次只加一个功能,剩下的,交给耐心就好。