
这是什么
一个用于 AI 辅助编码的可穿戴控制器,建在 M5Stack StopWatch 之上:一块 466 像素的圆形触摸屏、两个实体按键、扬声器、振动马达和一颗 ESP32-S3,用改装过的表带套件绑在手腕上。它把六个正在运行的 agent 按空间关系而不是列表来呈现,把批准与驳回变成两个带不同音效的实体按键,并把按住说话放在手本来就在的地方。真正有意思的在底下:这台设备实现了 OpenAI 自家 Codex Micro 的厂商自定义蓝牙 HID 协议,所以已经存在的主机软件会把它认成那台设备。
谁做的日本开发者、VR 布道师,曾在 Oculus VR 任职,离职后去做 VR 操作系统 Mikulus。他的 GitHub 简介只有四个词——「Human Engineer. Not AI.」(人类工程师。不是 AI。)——对一个刚花掉一个周末给 AI agent 做对话硬件的人来说,这句话本身就是一种表态。
制作过程
7 个阶段- 01
他先买了官方那一台
项目从一次购买和一个问题开始。作者写道,在买了一台 OpenAI Codex Micro——一台为 AI 辅助编码做的实体设备,OpenAI 官网有文档——之后,他被「为这件事做专用硬件」的想法打动了,于是想弄清同一种交互能否做得更小、更便于一瞥、更有表现力。M5Stack StopWatch 已经有这件事所需的大部分东西:圆形触摸屏、实体按键、扬声器、振动马达、蓝牙和电池,而体积小到能戴在手上。所以这不是为了克隆而克隆。这是一个人在问「这个交互到底是由什么构成的」,然后用他能买到并动手改装的东西给出了回答。
- 02
两层界面,以及一块故意做成圆形的屏幕
界面是同一块圆形显示上的两层,同时按下两个实体按键切换。第一层把六个实时的 agent 指示器排在边缘,各自用颜色、亮度和动效表示状态;点其中一个、或用按键逐个移动,选择环会以弹簧动画移动——它会略微过冲再落定,参赛文档说正是这一点让导航不用盯着看也能读懂。第二层把这些换成动作——fast、no-good、OK、plan、assistant——并从两个实体按键向屏上对应控件画出彩色导轨,让映射看得见而不必去记:左边橙色键驳回,右边蓝色键批准。作者明确说这块屏不是装饰。声音、动效和触感与显示描述的是同一个状态,而两个决策键有着刻意区分开来的方波音效,一个上行一个下行,所以不看屏幕也能听出结果。plan 模式是一个有独立状态、可见的开关,屏幕中央则始终留给按住说话。
- 03
真正难的那部分
界面底下是一套蓝牙 HID 实现,而这才是这个项目不只是一块触摸屏外壳的原因。设备呈现的是一份复合 HID 报描述:键盘、consumer 控制、相对指针——对任何主机来说都是一台普通输入设备——外加第四个厂商自定义报告,双向承载一条 JSON-RPC 通道。第四条通道不是作者自己发明的:头文件里写明了厂商 ID、产品 ID、报告编号和精确的分帧格式,并自称是「参考固件所用的那个版本」。分帧很紧凑:第一个字节是通道号,第二个是随后那块数据的长度,63 字节的报告被重组进一个两千字节的缓冲区再解析。请求字段同时带长短两种别名,于是方法名可以是
method或m,标识可以是id或i。光读这个头文件就足以理解这个项目真正的主张:不是他做了一个好看的手腕界面,而是任何已经写好去跟这台设备说话的东西,都能跟他的说话。 - 04
主机顺着这条线推下来的东西
JSON-RPC 的方法列表最能看出设计意图,因为说话的主要是主机。有三个方法向下走。一个带厂商命名空间、承载线程状态,手表把它渲染成那六个 agent 指示器——也就是说每个 agent 的状态是在电脑上决定的、在手腕上显示的,而不是手表自己去猜。第二个同样带厂商命名空间,承载一份 RGB 配置,手表把它应用到固件里叫做「环境状态」的东西上——这是一条兼容路径,接受参考硬件需要的东西,哪怕这台设备根本没有可寻址灯珠可驱动。第三个是主机报告当前聚焦的是哪个应用,手表显示它,长名字会截断到十八个字符加省略号。反向只有两个方法,一个问设备状态、一个问固件版本,而状态回复里带着电量、是否在充电、固件版本和当前显示的是哪一层界面。手表被告诉发生了什么,自己问的极少。
- 05
用一把剪钳改装表带套件
手腕支架不是 3D 打印,也不是量产件。M5Stack 卖的是给长方形 M5Stick 系列用的手表配件套件,它的塑料底座按原样装不下圆形的 StopWatch,所以 README 把削改过程写成了步骤:把底座从表带上取下,用剪钳一点一点剪掉凸起的固定钩,修掉毛刺直到表面平整,把底座和手表背面都擦净晾干,把双面胶裁到正好落在底座轮廓内、同时避开按键和开孔,居中贴到手表背面,压紧,装回表带,并在戴之前做一次拉力测试。四张照片覆盖了这些步骤。这是件小事,而且是诚实的那种小事:配件存在、形状不对,把它弄成对的形状的方法就是四步加一句「戴护目镜」。
- 06
一天之内做完两遍
三十三次提交全部落在 2026 年 8 月 8 日,从凌晨一点五十一分到早上六点十五分——整个东西是在大约四个半小时里写完并发布的。单一作者,没有共同作者尾注,从来没有开过 issue 或 pull request。一个 release,当天打的 tag,描述为第一个可参赛版本,附一份预编译固件。二十三个文件,重量主要在八张设备与改装过程的照片上,源码只有两个文件——其中主程序一个文件就有六万八千字节。它用 PlatformIO 构建,跑在乐鑫 Arduino 平台、十六 MB 分区表上,M5Stack 的统一库钉死在某个具体提交,底下是 NimBLE 和 ArduinoJson,另有一个 GitHub Actions 工作流在每次推送时编译固件。
- 07
文档也是参赛作品的一部分
这个仓库是为比赛写的——M5Stack 全球创新大赛,另外还为 Hackster 准备了一份参赛套件——所以文档相应地完整。README 有英文、日文和中文三个版本。此外有发布说明、宣传视频脚本,以及一份参赛文档,里面有电梯陈述、项目故事、硬件清单、手腕改装步骤,还有一节讲这个设计有何不同。最后那一节是作者最清楚地表明立场的地方:这不是一块带装饰屏的宏键盘,整台控制器都参与交互,目标是一个微型 AI 驾驶舱,它的界面、声音、动效和触感传达的是同一个状态。README 的参考文献里还挂着官方 Codex Micro 文档的链接——对于一个与你欣赏的产品做了兼容实现的人来说,这是很体面的处理方式。