机器人开发

魔法失效,科技来补:做一根能控制家电的赛博魔杖

一根装着全志 V851S 和 BMI088 的赛博魔杖,用神经网络认出挥动手势,再通过 Wi-Fi 和 MQTT 把结果交给本地 Home Assistant,去关顶灯、开台灯、一键观影。本文按视频里的制作顺序,聊硬件分区、多人数据采集、外形雕刻,以及为什么让魔杖只负责说出手势,把设备调度留给自动化。

视频演示


我不信有谁能拒绝一根笔直、又带点魔力的棍子。

可惜翻完麻瓜世界这本字典,结论挺扫兴。咒语念得再标准,灯也不会自己灭。

在我心里,像样的魔法就该是点火熄灯、操纵家电。躺在床上一抬手,顶灯就灭了,睡前再也不用下床。

魔法失效,那就科技来补。

于是有了这根赛博魔杖。外面是一根雕出纹路的魔杖,肚子里塞着一块细长的电路板,板上跑着 Linux,认得我挥出来的手势。挥对了,消息顺着 Wi-Fi 送到家里的 Home Assistant,灯、空调、投影就跟着动起来。

投稿视频 2:28 截图:做好的魔杖横在几块电路板前

视频里它干的活不少。躺在床上挥一下关顶灯,对着桌面挥一下开台灯,空调、摄像头、蒸煮锅、电饭煲,甚至电蚊香,都被它点过名。还有一个「一键观影」,一挥之后,投影直接把片单铺到了墙上。

果然,懒惰才是人类进步的阶梯。

这篇就按视频里的顺序,把这根棍子拆开聊聊。硬件怎么塞进去,手势怎么认出来,外壳怎么来的,还有为什么我没让魔杖自己去控制每一台设备。

先把一块 Linux 板子塞进棍子里

魔杖的主控是全志 V851S。翻开它的数据手册,第一页写着 IP Camera SoC,本职是给网络摄像头当大脑的。一颗给摄像头准备的芯片,最后住进了一根魔杖,大概是它入职时没想到的岗位。

选它的理由很实在。视频里写了,它跑在 900MHz,可以稳定运行 Linux,还支持 SSH 远程开发。对一根最后要封进外壳的棍子来说,这点挺重要,能通过网络进去改东西,就能少拆几次壳。

投稿视频 0:46 截图:几块装着全志 V851S 的细长魔杖电路板,丝印上画着一根带星星的小魔杖

板子做得又细又长,好塞进杖身。原理图按功能分了区,读起来像一张魔杖的器官表。

分区 器件 在魔杖里做什么
主控 全志 V851S,配无源晶振 跑 Linux 和手势识别
姿态传感 BMI088,SPI 连接 采集加速度和角速度
存储 W25N01GVZEIG 1Gbit SPI NAND,存放系统和程序
充电 LTC4054ES5-4.2 从 Type-C 取电,给单节锂电池充电
电源管理 EA3059 四路降压,给主控和外设分出不同电压
调试 CH343P USB 转串口,查看系统日志
烧录 FEL 按键 让 V851S 进入 USB 下载模式
交互 功能按键、拨动开关、LED 操作、电源通断和状态指示

无线走的是 Wi-Fi。魔杖和家里的服务器之间,靠的就是这一路网络。

BMI088 值得多说一句。它是博世的六轴惯性传感器,一个封装里放着加速度计和陀螺仪两个独立的传感器。原理图上能看到它们各有一根片选线,CSB_ACCEL 管加速度,CSB_GYRO 管陀螺仪,共用同一组 SPI 时钟和数据线。主控想读哪个,就把哪根片选拉低。

示意图:BMI088 的加速度计和陀螺仪共用 SPI 时钟与数据线,各用一根片选线 CSB_ACCEL、CSB_GYRO 接到 V851S

加速度记录手往哪个方向使劲,角速度记录手腕转得多快。一次挥动,在它眼里就是六条随时间起伏的曲线。

电源这块也没少花心思。V851S 需要好几路电压,EA3059 负责四路降压,原理图旁边还专门标了一句「RC 延时电路,满足上电时序」。几路电压谁先上、谁后上是有讲究的,顺序乱了,芯片可能根本起不来。这种细节不会出现在演示画面里,板子能不能亮,却全看它。

原理图里还有一个分区,被我起名叫「点灯大师」,里面就一颗 LED。嵌入式人的老传统,先点亮一颗灯,再谈别的。

投稿视频 0:38 截图:在工作台上焊接魔杖电路板

让棍子认得手势

硬件只是让魔杖能感觉到动作,要让它看得懂,还得教。

教的办法很朴素,大量采集六轴传感器数据,再拿去训练神经网络。

这一步偷不了懒。同一个手势,每个人挥出来的速度、幅度和手腕角度都不一样,数据要是只来自一个人,模型很可能只认得这一个人的手。视频里能看到好几个人举着魔杖在屋里比划,还有人跑到楼外的空地上接着挥。

投稿视频 1:12 截图:几个人举着魔杖在屋里采集手势数据

采回来的每一次挥动,都是一段带时间顺序的六轴数据。神经网络要做的,就是从这一段曲线里分辨出它属于哪一个手势。训练好的模型放回魔杖,挥完一下,板子自己给出结果。

示意图:多人采集的六轴数据在主机上训练神经网络,模型放回魔杖后,每次挥动由 V851S 在本地识别出手势

视频里这一段,我配了一句「接下来就是考验人类和主机大脑的时刻了」。人类负责一遍遍地挥,主机负责一遍遍地算,谁先累还真不好说。

系统这边用的是全志的 Tina Linux。视频里那段飞快滚动的编译日志来自它的 SDK,目录叫 tina-v853-docker,一个个软件包都放在 openwrt/package 底下编译。

外形是一点点雕出来的

电路板管的是魔法的内核,魔杖总得长得像根魔杖。

外形是用数位板在三维软件里一点点雕出来的。杖身修长,握柄那段做出了树皮一样的粗糙纹路,远看像是从对角巷的魔杖店里挑回来的,近看才知道里面装着一块 Linux 板子。

投稿视频 1:18 截图:用数位板在三维软件里雕刻魔杖外形

魔杖只说一句话,剩下的交给 Home Assistant

做到这里,有个问题绕不过去。家里的设备往往来自不同品牌,各有各的协议和 App。要是让魔杖挨个去学它们的方言,这根棍子很快就会变成一个塞不下的翻译官。

所以魔杖只做一件事,认出手势,然后把结果说出去。

说话用的是 MQTT。这是一种发布、订阅模式的轻量消息协议,中间有一个消息代理负责转发。魔杖把手势结果发布出去,谁关心,谁就去订阅。

听的那一方,是跑在本地服务器上的 Home Assistant。它本来就能接入各家的智能设备,也有现成的 MQTT 集成。收到魔杖的消息以后,触发哪条自动化、开哪盏灯、关哪台设备,全由它决定。

示意图:魔杖认出手势后经 Wi-Fi 用 MQTT 发布,消息代理转发给本地服务器上的 Home Assistant,再由自动化调度灯、空调和投影

环节 谁负责 做什么
感知 魔杖上的 BMI088 记录一次挥动的六轴数据
识别 魔杖上的 V851S 判断这一下是哪个手势
传话 Wi-Fi 和 MQTT 把手势结果送到本地服务器
决策 Home Assistant 按自动化规则调度设备
执行 灯、空调、投影等 真正动起来

投稿视频 1:40 截图:抬手对着天花板上的灯挥一下魔杖

这样分工有个很大的好处。魔杖不用知道「一键观影」具体要开几台设备,想换玩法,只要在 Home Assistant 里改自动化,棍子本身不用重新烧录。视频里那句「所有自动化流程,你可以随意编排」,底气就在这里。

视频里我把话说得比较满,理论上,它可以控制所有联网的设备。这句话还得补两个前提。设备要先接进 Home Assistant,魔杖也要连得上网、找得到这台服务器。两头都接上了,一挥之后发生什么,就交给自动化去编排。

有段时间我特别沉迷《黑神话:悟空》,没日没夜地玩。西方的魔杖,借进东方的神话里挥两下,好像也说得过去。

它也不一定非得是一根棍子。视频快结尾时露了一眼手套的样子,把手势识别装进手套里,用手势去控制别的设备。当然,这是后话了。

搁置了一年的魔法

这个项目从 2024 年年初冒出想法,中间放弃又捡起了好几次,因为各种各样的事,搁置了一年,冬装夏装都换过了一轮。

好在最后,它还是完整地做完了。脑洞先落地,细节慢慢打磨,这根魔杖算是把这句话老老实实走了一遍。

回到开头那根棍子。

它还是笔直的,也确实带了点魔力。只不过魔力不来自咒语,来自一块细长的电路板、一大堆挥出来的数据,和家里那台安安静静待命的服务器。

麻瓜没有魔法,但麻瓜会画板子。

参考资料

Home Assistant 官方 MQTT 集成文档

博世 BMI088 惯性传感器产品页

鸿尘客 Honchic · 把脑洞焊到电路板上

接着看

再读几篇项目与技术手记。

返回机器人开发

读到这里,也聊聊你的想法。

项目复刻、技术交流,或者一起折腾点什么。