构建一款能够自主在房间内移动的机器人汽车
我决定自己动手制作一个机器人,从Freenove ESP32四轮驱动汽车套件(货号:FNK0053)开始。我将其命名为Nova,取自Freenove以及拉丁语“nova”(意为“新”)。我想拥有一只全新的宠物。
本文将介绍第一步:让Nova能够自主在房间内四处走动,并在过程中显得生动活泼。
Nova目前的功能:
- 自行行走:它会停下,头朝前、左、右扫视,选择一个方向,然后以随机1到3秒的速度前进,接着再次停下并重新观察。
- 观察警觉:当行驶途中前方出现物体时,它会立即停止,眼睛会睁大。
- 探索环境:如果前方仍有障碍物,它会倒退一小段距离,左右检查,然后转向空旷的一侧。
- 解决卡顿问题如果它撞到看不见的物体,眼睛会显示一个“?”号,然后后退并转向。
- 闪烁时动作平稳,不会突然 jerk。
硬件与原装套件不同
1. 颈部安装眼睛和距离传感器
套件的说明书没有说明如何同时使用LED矩阵和超声波传感器,而原装线缆只能连接其中一种。我希望在云台头上同时使用两者:用LED矩阵作为“眼睛”,用超声波传感器来测量Nova所向的任何位置的距离。
LED矩阵保留了套件的原装线缆。
超声波传感器使用自制的4针线缆:长约150毫米,两端均采用AMP MODU兼容的接口,线路直接连接(两端VCC、Trig、Echo、GND的顺序相同)。该线缆插入汽车板上标有超声波传感器的接头。
在通电前,请检查传感器和电路板上的引脚标识。交换VCC和GND可能会损坏传感器。此配置在我自己的设备中有效,但并非官方文档中记载的配置方式。
2. 使用镍氢电池代替18650电池
套件要求使用两个18650锂电池。我使用了六个镍氢可充电AA电池:标称电压约7.2V,接近两个18650电池的7.4V。
通过一对XT30连接器和AWG16导线,电池盒可以轻松拆卸。母头连接到电池盒上,公头则焊接在电路板上的电池支架端子上。电路板的电源开关仍然正常工作。
仅使用镍氢可充电电池。六个碱性AA电池能提供更高的电压。
首次连接前,请用万用表检查极性。
AWG16导线较粗,我的15W铁丝电阻不够强,建议使用30W或更粗的导线。
我的电池盒导线较细(可能是AWG24或更细),目前尚未更换,但建议使用AWG18或更粗的导线。
软件的组织结构
所有功能均为非阻塞式(无delay()函数),并分为三层:
•hal/:唯一与硬件交互的部分(电机、舵机、传感器、LED)。
•core/:包含传感器读数、障碍物判断、安全层以及仲裁器。
•behaviors/:每个行为对应一个文件。每个行为报告其优先级,仲裁器只执行优先级最高的那个行为。这就是“注意”中断“漫游”的方式。
几条规则让整个过程看起来不像机器:先用眼睛观察,再看脖子,最后看身体。不要突然开始。而且绝不能只相信一次距离读数:头部必须保持静止,多个读数必须一致。
所有调优参数(速度、时间、距离)都存储在一个文件中,即 config.h。
我如何使用 Claude Code 构建项目
我管理一个软件团队,多年来自己很少亲自编写代码。对于这个项目,我制定了一条规则:让 Claude Code 写尽可能多的代码,而由我自己决定 Nova 应该做什么。
使这一方法成功的关键是文档,而非提示:
- 一份规则文件(CLAUDE.md),包含项目目标、硬件布局、设计原则和编码规范;
- 一份行为目录(docs/catalog.md):共26种行为,每种行为都有ID、难度等级和依赖关系。目前已构建了7种;
- 每个请求对应一种行为。首先为每个行为提供简短的规格说明(docs/specs/),然后编写代码;
- 一份交接说明(docs/handoff.md),每次会话开始前都会被阅读:当前状态、正在进行的工作以及下一步计划;
- 决策日志和测量日志,确保调优参数来自机器人实际测试结果,而非猜测。
- 只有在我说“上传”时,才会将内容上传到机器人。
所有这些文件都存放在仓库中。它们是日语写成的,但结构清晰易懂。
构建与上传
该项目使用 PlatformIO 构建。先克隆仓库,将其作为 PlatformIO 项目打开,然后执行以下操作:
README 中包含了详细信息,包括 Arduino IDE 的使用说明(未经测试)。
限制与后续计划
•墙壁以较浅的角度倾斜。当角度小于约 30° 时,超声波传感器无法接收到来自墙壁的回声,因此 Nova 还可以继续沿其表面滑行。之后“脱困”行为会自动处理这种情况。
•转向角度。该套件采用开环控制电机,因此 Nova 无法准确判断实际旋转角度。接下来,我将添加一个陀螺仪(LSM6DSV16X)来测量这一角度。
•更多功能。之后,我会逐步添加从目录中提取的宠物类行为:在选择路径前四处观察、察觉被捡起时的状态、出现嗜睡等行为。
本文编译自hackster.io





