
1. 项目概述从扫地到送饮料的硬件改造之旅几年前当我第一次拆开一台二手Roomba看到里面那个整洁的SCI串口时一个想法就冒了出来这台每天在地板上画圈的“勤劳工人”它的潜力绝不止于此。它有一套成熟的移动底盘、可靠的导航系统和持久的电池为什么不能让它干点更有趣的活儿比如在周末的下午当你窝在沙发里看球赛或者打游戏时让它自动识别你的位置并稳稳当当地把一杯冰镇饮料送到你手边。这个想法就是今天这个“热成像寻人饮料配送机器人”项目的起点。这个项目的核心是利用一块成本低廉但功能强大的微控制器——Raspberry Pi Pico W作为机器人的“新大脑”。Pico W负责接管Roomba原有的控制权同时整合两类关键传感器一个是能“看见”热量的AMG8833热成像传感器用于在房间里定位人体另一个是VL53L1X激光测距传感器充当机器人的“触角”防止它在行进中撞到家具。所有的控制逻辑包括手动遥控和自动寻人都通过Wi-Fi连接到云端的Adafruit IO平台来完成。这意味着你只需要一部手机或电脑就能在另一个房间甚至公司里指挥你的机器人完成配送任务。整个改造过程本质上是一次典型的嵌入式系统与物联网IoT技术的融合实践。它不要求你具备机器人学的博士学位但需要你对手工制作、基础电路焊接和Python编程有浓厚的兴趣和一定的耐心。最终你将得到的不只是一个会送饮料的玩具而是一个完全由你定义、可扩展性极强的智能硬件平台。你可以基于它轻松改造成宠物跟随器、移动安防摄像头或者任何你想象中的自动化助手。2. 核心硬件选型与设计思路解析2.1 主控单元为什么是Raspberry Pi Pico W在项目启动时主控芯片的选择是第一个关键决策。市面上有Arduino、ESP32、树莓派Zero等多种选择。我最终锁定Raspberry Pi Pico W主要基于以下几点考量首先性价比与性能的平衡。Pico W的核心是RP2040双核ARM Cortex-M0处理器运行频率高达133MHz这对于处理传感器数据流、运行寻人算法和维持Wi-Fi连接绰绰有余。其价格却与一块基础版Arduino Uno相当但性能远超后者。对于这个需要实时处理热成像网格数据和进行简单逻辑判断的项目Pico W提供了充足的算力储备。其次极佳的开发生态与灵活性。Pico W原生支持MicroPython和CircuitPython这两种高级语言极大地降低了嵌入式开发的门槛。特别是CircuitPython它将开发板模拟成一个U盘你可以像编辑文本文件一样修改code.py代码保存后立即自动运行调试体验无比流畅。这对于需要频繁调整逻辑和参数的机器人项目来说效率提升是巨大的。第三内置的Wi-Fi功能。这是Pico W相对于无Wi-Fi的Pico版本的核心优势。我们不需要额外附加ESP-01之类的模块节省了空间、布线和编程复杂度。其Wi-Fi模块稳定可靠足以满足与Adafruit IO平台进行MQTT通信的需求。注意虽然ESP32在Wi-Fi和蓝牙方面同样强大且价格更低但其在CircuitPython下的驱动库生态当时不如Pico W完善特别是对于某些特定传感器。Pico W的“开箱即用”体验和稳定的社区支持是项目快速推进的重要保障。2.2 感知系统热成像与测距的传感器组合逻辑机器人的“眼睛”由两个传感器构成它们的分工与合作是项目成功的关键。AMG8833热成像传感器这是实现“寻人”功能的灵魂。它是一个8x8的红外热电堆阵列能生成一个64像素的“温度图像”。人体约37°C与室内环境通常22-26°C有显著的温差因此在热成像图中会呈现为一个明亮的“热斑”。其工作原理是检测物体发出的远红外辐射而非可见光因此即使在完全黑暗的环境中也能工作。选择它的原因在于其小巧的体积、简单的I2C接口以及Adafruit提供了完善的CircuitPython驱动库让我们可以轻松读取每一个像素的温度值。VL53L1X激光测距传感器这是机器人的“保险杠”。Roomba本身有碰撞传感器但那是物理接触式的。我们加装的VL53L1X属于“非接触式”避障它通过发射激光并计算光反射回来的时间飞行时间法ToF来测量距离精度可达毫米级最大测距约4米。我们将它朝向前方实时监测机器人前方是否存在障碍物。当距离小于设定的安全阈值例如30厘米时主控程序会命令Roomba停止或转向避免碰撞。传感器融合策略两个传感器都通过I2C总线连接到Pico W。I2C总线允许多个设备共享数据线和时钟线仅靠设备地址区分这极大简化了布线。在程序中我们会先读取热成像数据分析热斑的中心位置判断人的大致方向。然后在向该方向移动前读取测距数据确认路径是否畅通。这种“先定位再探路”的循环构成了机器人自主导航的基础逻辑。2.3 通信与控制架构Adafruit IO平台的优势为什么不直接用手机蓝牙连接Pico W或者自己搭建一个局域网Web服务器选择Adafruit IO作为远程控制中枢是基于快速原型开发和可靠性的双重考虑。Adafruit IO是一个专为物联网项目设计的云服务平台。它为我们解决了三个棘手的问题穿透内网家庭Wi-Fi路由器通常具有NAT从外网无法直接访问内部的Pico W。Adafruit IO作为中间代理Pico W客户端和你的手机App控制端都主动连接到这个云服务器从而实现了双向通信无需复杂的路由器端口映射。提供现成的控制界面平台内置了仪表盘Dashboard功能可以像搭积木一样创建按钮、滑块、图表等控件并绑定到数据流Feed。我们只需在网页上拖拽就能生成一个专业的遥控界面省去了自己编写手机App或网页前端的巨大工作量。稳定的MQTT协议底层通信采用MQTT协议这是一种轻量级的、基于发布/订阅模式的消息协议特别适合物联网设备功耗低代码实现简单。当然免费账户有速率限制约30条消息/分钟这对于连续发送前进指令可能造成“指令节流”机器人会卡顿。我们的策略是在手动遥控模式下采用“点动”方式即按下按钮发送一次指令而不是持续发送。在自动寻人模式下算法本身是间歇性调整方向指令频率很低完美避开了限制。对于更高要求的应用可以升级到付费计划或自建MQTT服务器。3. 硬件搭建与电路连接详解3.1 Roomba SCI串口通信的底层原理要让Pico W控制Roomba必须理解其开放接口Open Interface, OI。Roomba机身顶部有一个7针的迷你DIN接口SCI端口这实际上是一个串行通信接口UART。iRobot公司公开了其通信协议允许开发者通过发送特定的字节序列Opcode来命令机器人执行动作如驱动轮子、播放声音、读取传感器等。通信参数是固定的115200波特率8位数据位无奇偶校验1位停止位8N1。Pico W的任意两个GPIO口都可以配置为UART的TX发送和RX接收。我们需要用三根线建立双向通信Pico的TX接Roomba的RXPin 2Pico的RX接Roomba的TXPin 3两者GND相连。重要提示Roomba的SCI端口不提供电源给外部设备切勿尝试从该端口取电否则可能损坏Roomba主板。Pico W必须由独立的5V USB电源供电。启动控制需要遵循一个严格的序列首先发送128Start命令唤醒Roomba的OI。接着发送131Safe Mode或132Full Mode命令进入可控模式。Safe模式会在碰撞时自动停止更安全Full模式则完全交由程序控制。此后才能发送驱动命令如137[Drive]等。驱动命令需要附带速度毫米/秒和半径毫米参数这些参数需要打包成2字节的有符号整数。3.2 电路连接实战与布线技巧清晰的接线是成功的一半。以下是完整的接线清单和步骤所需材料清单Raspberry Pi Pico WRoomba 600/800系列需确认有SCI端口Roomba SCI串口线或自制迷你DIN 7针母头 杜邦线Adafruit AMG8833热成像传感器Adafruit VL53L1X测距传感器STEMMA QT连接线或4根母对母杜邦线 x 25V USB充电宝及Micro USB数据线面包板可选用于测试阶段热熔胶枪及胶棒连接步骤Pico W与Roomba连接UART使用串口线将Roomba SCI端口的Pin 2 (RXD)连接到Pico W的GP0 (TX)。将Roomba SCI端口的Pin 3 (TXD)连接到Pico W的GP1 (RX)。将Roomba SCI端口的Pin 5 (GND)连接到Pico W的任意GND引脚。传感器与Pico W连接I2C这是共享总线可以串联。建议先连接AMG8833再从它的STEMMA QT端口引出线连接VL53L1X。AMG8833VIN- Pico W的3V3(OUT)引脚注意不是VBUS传感器是3.3V逻辑。GND- Pico W的GND。SCL- Pico W的GP5这是I2C1时钟线。SDA- Pico W的GP4这是I2C1数据线。VL53L1X通过另一根STEMMA QT线将其连接到AMG8833空出的端口上。VIN、GND、SCL、SDA会自动并联。供电将USB充电宝用Micro USB线连接到Pico W的USB接口。确保充电宝开关已打开。布线心得与避坑指南电源隔离务必确保Roomba和Pico W的电源是独立的。共地GND相连是为了提供统一的电压参考点这是串口通信所必需的但电源正极必须分开。线材固定在测试成功后强烈建议使用扎带或热熔胶将导线固定在Roomba机身内侧防止在运动中被卷入轮子或刷子。传感器朝向将热成像和测距传感器用热熔胶固定在机器前端并确保其朝向正前方无遮挡。你可以先用双面胶临时固定调整好最佳视角后再永久固定。上电顺序建议先启动Pico W连接USB电源待其启动完成看到CIRCUITPY盘符稳定再启动Roomba。这可以避免Roomba启动时串口上的杂讯干扰Pico W。4. 软件环境配置与核心代码剖析4.1 CircuitPython系统与库文件的部署Pico W出厂运行的是MicroPython我们需要将其刷写为CircuitPython以获得最佳的传感器库兼容性和开发体验。刷写固件访问CircuitPython官网找到Raspberry Pi Pico W的页面下载最新的.uf2固件文件。按住Pico W板上的白色BOOTSEL按钮不放同时将其通过USB线连接到电脑。松开按钮电脑会识别出一个名为RPI-RP2的可移动磁盘。将下载好的.uf2文件拖拽进该磁盘。Pico W会自动重启磁盘名称变为CIRCUITPY刷机完成。安装库文件从CircuitPython官网下载对应版本的“CircuitPython Library Bundle”库合集。打开压缩包找到lib文件夹。我们需要将以下库文件夹复制到Pico W的CIRCUITPY磁盘下的lib目录中adafruit_amg88xx(用于AMG8833)adafruit_vl53l1x(用于VL53L1X)adafruit_minimqtt(MQTT客户端)adafruit_io(Adafruit IO交互)adafruit_requests和adafruit_connection_manager(网络请求)wifi(Wi-Fi连接)配置网络凭据在CIRCUITPY磁盘根目录下用文本编辑器创建一个新文件命名为settings.toml。输入以下内容替换为你自己的信息CIRCUITPY_WIFI_SSID 你的Wi-Fi名称 CIRCUITPY_WIFI_PASSWORD 你的Wi-Fi密码 ADAFRUIT_AIO_USERNAME 你的Adafruit IO用户名 ADAFRUIT_AIO_KEY 你的Adafruit IO Active Key保存文件。这样代码中就可以安全地引用这些配置而无需将密码硬编码在程序里。4.2 主控程序逻辑与关键函数解读主程序code.py是机器人的大脑其逻辑流可以概括为初始化 - 连接网络 - 连接Adafruit IO - 订阅控制指令 - 进入主循环读取传感器、执行指令、自动寻人。以下是核心代码段的解析import board import busio import digitalio import time import wifi import socketpool import adafruit_minimqtt.adafruit_minimqtt as MQTT from adafruit_io.adafruit_io import IO_MQTT import adafruit_amg88xx import adafruit_vl53l1x # 1. 初始化UART与Roomba通信 uart busio.UART(board.GP0, board.GP1, baudrate115200, timeout0.1) def roomba_cmd(cmd_bytes): uart.write(cmd_bytes) time.sleep(0.05) # 命令间短暂延时 # 启动Roomba OI并进入安全模式 roomba_cmd(b\x80) # Start roomba_cmd(b\x83) # Safe Mode print(Roomba Initialized.) # 2. 初始化I2C与传感器 i2c busio.I2C(board.GP5, board.GP4) amg adafruit_amg88xx.AMG88XX(i2c) vl53 adafruit_vl53l1x.VL53L1X(i2c) vl53.start_ranging() # 启动测距 # 3. 连接Wi-Fi print(Connecting to WiFi...) wifi.radio.connect(os.getenv(CIRCUITPY_WIFI_SSID), os.getenv(CIRCUITPY_WIFI_PASSWORD)) print(Connected!) # 4. 连接Adafruit IO pool socketpool.SocketPool(wifi.radio) mqtt_client MQTT.MQTT(brokerio.adafruit.com, port1883, usernameos.getenv(ADAFRUIT_AIO_USERNAME), passwordos.getenv(ADAFRUIT_AIO_KEY), socket_poolpool) io IO_MQTT(mqtt_client) def handle_command(client, topic, message): 处理从Adafruit IO接收到的命令 print(fReceived command: {message}) if message forward: # 驱动命令速度100mm/s半径32768直行 roomba_cmd(b\x89\x00\x64\x80\x00) elif message stop: roomba_cmd(b\x89\x00\x00\x00\x00) # 速度0 # ... 其他命令处理backward, left, right等 io.add_feed_callback(roomba-steering, handle_command) io.subscribe(roomba-steering) print(Connecting to Adafruit IO...) io.connect() print(Connected!) # 5. 自动寻人函数 def find_human(): pixels amg.pixels # 获取8x8温度数组 # 简化算法寻找最高温的像素区域 max_temp -100 target_x, target_y -1, -1 for i in range(8): for j in range(8): if pixels[i][j] max_temp and pixels[i][j] 28: # 阈值过滤环境热源 max_temp pixels[i][j] target_x, target_y j, i # j是列水平方向 if target_x ! -1: # 根据热斑在网格中的水平位置决定转向 if target_x 3: return turn_left elif target_x 4: return turn_right else: # 检查前方距离 if vl53.distance 300: # 300mm内无障碍 return move_forward else: return stop_and_search return not_found # 6. 主循环 last_ping time.monotonic() mode manual # 或 auto while True: try: io.loop() # 维持MQTT连接处理消息 # 每10秒向Adafruit IO发送一次ping保持连接活跃 if time.monotonic() - last_ping 10: io.ping() last_ping time.monotonic() if mode auto: action find_human() # 根据find_human返回的动作执行Roomba命令 # ... (执行动作代码) # 短暂延时防止循环过快 time.sleep(0.1) except Exception as e: print(Error in main loop:, e) time.sleep(5)关键逻辑解析命令发送roomba_cmd函数封装了UART写入。Roomba驱动命令\x89后跟四个字节前两个是速度-500到500 mm/s后两个是半径-32768到32767。特殊值32768或32767代表直行。消息回调handle_command函数是MQTT订阅的回调。当Adafruit IO的roomba-steering数据流有新消息时此函数被触发根据消息内容执行对应动作。寻人算法find_human函数是一个简化的热源追踪算法。它遍历64个温度点找到超过阈值例如28°C高于室温的最高温点并将其水平坐标与网格中心比较决定向左转、向右转或直行。同时它会结合测距传感器的读数在直行前检查路径安全。主循环io.loop()必须被频繁调用以处理网络消息。我们通过定期io.ping()来保持连接不被服务器断开。4.3 Adafruit IO仪表盘配置实战软件的另一半在云端。我们需要在Adafruit IO上创建控制界面。创建数据流Feed登录Adafruit IO进入Feeds页面点击New Feed。创建一个名为roomba-steering的Feed。这个Feed将用于接收从控制面板发送的指令。创建仪表盘Dashboard进入Dashboards页面点击New Dashboard命名为“Roomba遥控器”。添加按钮控件在仪表盘内点击号选择Button控件。在配置页面Button Label填“前进”。在Feed中选择刚才创建的roomba-steering。Button Text Value填forward必须与代码handle_command中判断的字符串一致。关键步骤在ON PAYLOAD和OFF PAYLOAD部分只填写ON PAYLOAD为forward将OFF PAYLOAD留空。这样按钮在松开时不会发送任何消息避免因快速重复发送相同指令而触发Adafruit IO的免费账户节流限制。同理创建“后退”backward、“左转”left这里可以发送半径为正值的驱动命令实现原地左转、“右转”right、“停止”stop等按钮。还可以创建模式切换按钮例如一个开关按钮绑定到另一个Feed如roomba-mode发送auto和manual来切换机器人的手动/自动模式。配置完成后你的网页上就出现了一个专业的遥控面板。点击按钮指令就会通过云端下发到你的Pico W进而控制Roomba。5. 机械结构设计与装配要点5.1 激光切割保护盒的设计与制作电子部分不能裸露在外需要一个既能保护设备又能承载饮料的“上层建筑”。我选择用3mm厚的椴木板进行激光切割因为它易于加工、重量轻且外观整洁。设计考量尺寸与固定盒体底板尺寸需略小于Roomba顶部平台并在四角预留孔位用于穿过扎带或粘贴强力魔术贴实现与Roomba机身的牢固连接。必须避开Roomba顶部的“CLEAN”按钮、指示灯和悬崖传感器窗口。传感器开窗前侧面板需要精确开两个方孔分别用于露出热成像传感器和测距传感器的探测窗口。开孔尺寸应比传感器本身略大确保无遮挡但也不能太大影响美观。设备舱与饮料舱分区我将盒子设计为前后两个区域。前部是“设备舱”放置Pico W、面包板如果使用和线束。后部是“饮料舱”底部挖出一个圆形凹槽用于稳定放置易拉罐或标准杯型的饮料杯。两个区域之间用隔板分开防止可能的冷凝水或饮料泼洒损坏电路。散热与维护在设备舱的侧面和顶部设计了一些栅格状开口用于Wi-Fi信号穿透和电路散热。顶板设计为可滑动或通过磁吸方式打开方便后续更换充电宝或调试代码。制作流程使用激光切割软件如LaserCAD、LightBurn导入SVG/DXF图纸文件。将3mm椴木板放入激光切割机设置合适的功率和速度进行切割。小功率多次切割比一次高功率切割效果更好能减少边缘灼烧。切割完成后用砂纸轻轻打磨切割边缘去除毛刺。采用木工白胶进行粘合。在接缝处涂抹均匀用夹子固定静置至少12小时使其完全干透。白胶的强度足够且比热熔胶更美观、牢固。等待胶水干燥期间可以在内壁粘贴一些绒布或EVA泡棉用于减震和保护设备。5.2 整机集成与走线优化装配顺序至关重要能避免很多返工。内部设备固定首先将Pico W和传感器用尼龙柱和螺丝固定在盒底板上。避免使用双面胶夏天高温容易脱落。将USB充电宝用强力魔术贴固定在设备舱的预留位置。魔术贴方便日后取下充电。使用理线槽或螺旋管将连接Roomba SCI口的串口线和传感器I2C线束收纳整齐并用扎带固定在盒内壁上。凌乱的线缆是故障的主要来源。盒体与Roomba的连接在Roomba顶部清洁干净的平面上粘贴四条高强度工业魔术贴勾面。在盒体底板对应位置粘贴魔术贴的毛面。将盒子对准位置用力按压确保粘合牢固。这种连接方式足够应对机器人的加速和转向同时又允许你在需要时将整个上层建筑快速拆下。最终检查确保所有线缆在Roomba转动时不会被轮子或边刷缠绕。打开Roomba电源手动推动它前进、后退、旋转观察线缆是否有拉扯风险。将一杯水测试用放入饮料舱让Roomba执行一些急停、转弯动作测试饮料的稳定性。必要时可以在饮料舱内加装硅胶防滑垫。6. 调试、优化与故障排除实录6.1 常见问题与解决方案速查表在开发过程中我遇到了几乎所有可能遇到的问题。下表总结了典型故障现象、原因分析和解决方法故障现象可能原因排查步骤与解决方案Pico W无法连接Wi-Fi1.settings.toml文件格式错误或未保存。2. Wi-Fi密码错误或网络隐藏。3. 路由器屏蔽了2.4GHz频段Pico W仅支持2.4G。1. 检查CIRCUITPY盘根目录下settings.toml文件内容确保无多余空格使用英文引号。2. 尝试在代码中直接写入SSID和密码测试测试后务必改回。3. 登录路由器后台确认2.4GHz网络已开启并尝试关闭Wi-Fi的“双频合一”功能。Adafruit IO连接失败1. AIO Key或用户名错误。2. 网络防火墙阻止MQTT端口1883。3. 免费账户达到连接数或消息限制。1. 在Adafruit IO网站重新生成AIO Key并更新settings.toml。2. 尝试使用手机热点测试排除公司或学校网络限制。3. 检查Adafruit IO账号的“Throttling”状态减少不必要的频繁消息发送。Roomba对指令无反应1. 串口线接反TX/RX交叉。2. 波特率设置错误。3. 未发送正确的启动序列Start - Safe/Full Mode。4. Roomba电量过低进入休眠。1. 交换Pico上GP0和GP1的连接线。2. 确认代码中UART初始化波特率为115200。3. 在代码中检查roomba_cmd(b\x80)和roomba_cmd(b\x83)是否成功执行。4. 为Roomba充电。热成像传感器检测不到人1. I2C地址冲突或接线错误。2. 传感器镜头有污渍或遮挡。3. 温度阈值设置过高。4. 人与机器人距离太远AMG8833有效距离约7米。1. 运行I2C扫描程序确认检测到0x69地址的设备。2. 用软布清洁传感器表面的保护窗。3. 在find_human函数中调低温度阈值如从28改为26。4. 让人在距离机器人3-5米范围内活动测试。测距传感器读数异常如始终为0或极大值1. VL53L1X传感器初始化失败。2. 测量物体表面吸收性强如黑绒布或反射性过强镜面。3. 传感器前方有透明物体如玻璃。1. 确保代码中执行了vl53.start_ranging()。2. 更换为普通白纸或墙面进行测试。3. 避免对着玻璃、镜面或深色吸光材质测量。机器人自动模式下乱转或卡顿1. 寻人算法过于敏感环境热源如暖气、电脑主机干扰。2. Adafruit IO消息节流导致指令丢失。3. 循环延迟不当传感器读取过快或过慢。1. 优化算法不仅找最高温还要求高温像素点连续成片比如至少4个相邻像素过滤小热源。2. 在自动模式下将动作指令间隔增加到2秒以上避免触发节流。3. 调整主循环中的time.sleep()值建议在0.2到0.5秒之间平衡响应速度和系统稳定性。饮料在运输中倾倒1. 机器人启停或转弯加速度过大。2. 饮料舱尺寸与杯子不匹配。3. 重心过高。1. 在代码中降低驱动速度如从100mm/s降至60mm/s。2. 在饮料舱内添加可调节的泡沫内衬或定制杯托。3. 将较重的充电宝放置在盒子底部降低整体重心。6.2 性能优化与功能扩展思路项目基本完成后还可以从以下几个方面进行优化和扩展让它变得更聪明、更可靠1. 电源系统升级 目前的方案依赖外挂充电宝需要定期充电。一个更优雅的解决方案是使用DC-DC降压模块Buck Converter直接从Roomba的主电池取电。Roomba电池通常是14.4V或18V的锂电池组我们可以选择一个支持宽电压输入如8-28V、输出5V/2A的降压模块将其正负极连接到Roomba电池舱的对应触点需谨慎操作注意绝缘然后输出给Pico W供电。这样机器人就实现了完全自供电续航与Roomba本身一致。2. 寻人算法增强 基础的“找最热点”算法在复杂环境下容易失效。可以升级为热源聚类使用简单的聚类算法如基于距离的连通域分析将相邻的高温像素点归为一个热源计算该热源的平均位置和温度选择最大、最热的热源作为目标。目标预测与滤波使用卡尔曼滤波等算法对识别到的人体位置进行预测和平滑滤波让机器人的转向动作更柔和减少在目标静止时的左右摇摆。多传感器融合除了热成像可以增加一个便宜的摄像头模块如OV7670在光线充足时辅助进行人脸或人体形状识别与热成像数据互补提高全天候识别率。3. 增加状态反馈与安全功能状态上报让Pico W定期向Adafruit IO发送机器人的状态信息如电池电压、传感器读数、当前模式等并在仪表盘上显示实现监控。声光提示利用Roomba内置的扬声器通过发送140[Song]命令让机器人在找到人、送达饮料、遇到错误时播放不同的音效。同时可以在盒子上加装一个RGB LED用不同颜色指示状态如蓝色-等待绿色-已连接红色-错误。紧急停止除了前向避障可以在机器人侧面也加装红外或超声波传感器实现全方位的防撞。或者在代码中监听Roomba自带的碰撞传感器信号通过串口读取传感器包一旦触发立即停止。这个项目最吸引我的地方在于它完美地展示了如何用有限的预算和常见的硬件将一个成熟的消费级产品“赋能”扩展出原本设计者未曾想象的功能。从最初的遥控移动到加入热成像实现自动寻人每一次迭代都带来新的成就感。过程中最大的教训就是耐心接线要反复检查代码要一点点调试结构要不断调整。当你最终看到它稳稳地载着饮料穿过客厅找到你时那种感觉是无与伦比的。它不再只是一个工具而是一个由你亲手赋予“生命”的伙伴。