设计一款基于Arduino Uno Q的寻宝游戏
去年,我们在公司一次远程团队建设活动中玩过寻宝游戏。我戴着Beats耳机,在屋里四处奔跑寻找物品,而家人却一脸茫然地看着我,不明白发生了什么。那段时间我玩得很开心,还赢了比赛。我想把这种体验带入一个大家可以在家里一起玩的游戏。两个人无聊时可以连接电视进行竞赛,也可以让所有人参与,组成小组共同游玩。
“用Arduino UNO Q与App Lab大赛”给了我一个动手制作的理由,也让我有机会了解UNO Q究竟能否胜任这项任务。事实上,我非常好奇:它是否能独立运行游戏、识别物体、理解语音指令,并且还能一起生成谜语,而无需依赖强大的电脑或远程AI服务?
寻宝游戏Q每轮开始时,电视上都会出现一道谜题。你需要先猜出答案,然后迅速跑过去找到物品,并在对手之前将它展示给摄像头。红色在左侧,蓝色在右侧,第一个正确回答的玩家赢得这一轮。答得越快,得分越高;十轮结束后,总分最高的玩家获胜。语言模型负责生成谜题,因此每次重新开始游戏时提示内容都会不同。
软件
•Arduino UNO Q Linux 镜像
•带 Web 界面、物体检测和大语言模型模块的 Arduino App Lab
•Edge Impulse YOLOX-Nano 物体检测模型
•Qwen 3.5 0.8B Q4_0 语言模型
•Vosk 0.3.45,包含小型英文语音模型
•用于电视显示的 Chromium 浏览器
硬件
•Arduino UNO Q(已测试,4 GB 内存 / 32 GB 存储)
•带麦克风的 USB 网络摄像头:UVC,1920 × 1080 MJPEG,每秒 30 帧,16 kHz 单声道音频
•支持 PD 供电的 USB-C 路由器,带 HDMI 接口(含音频)及 USB 网络摄像头接口
•电源与线缆(已测试 Apple iPad 10W 充电器)
•支持电源、数据和视频传输的 Hub-to-board USB-C 连接
•HDMI 线缆及带扬声器的电视或 HDMI 屏幕
本地运行整个系统
保持游戏能在板子上运行是我主要的目标之一。我希望可以将游戏带到任何地方,连接摄像头和HDMI屏幕,无需依赖在线服务即可进行游戏。这也意味着摄像头图像和麦克风音频可以继续保留在UNO Q上,这对隐私保护来说非常重要。
Arduino App Lab 负责管理Python应用程序及其模型服务。游戏使用了三个模块:物体检测、大语言模型(LLM)和Web UI。Python负责处理每一轮游戏、计时器和分数,而Web UI模块则提供界面,由Chromium在板子上全屏运行。电视通过HDMI接收画面和声音。游戏在UNO Q的Linux侧运行,无需定制电路。
在物体识别方面,我使用了通过 Edge Impulse 提供的预训练 YOLOX-Nano 模型。该模型可在摄像头图像中识别物体,并为每个检测结果返回标签、置信度和边界框。游戏会将这些信息与当前答案进行比对,并根据其位置将物体分配给相应队伍。每队都有彩色轮廓显示检测器所识别的内容。
LLM 模块通过 llama.cpp 在本地运行 Qwen 3.5 0.8B 模型。对于每个目标物品,游戏会提供一些事实性的提示,并要求模型将其转化为一个简短的谜语,但不透露答案。我发现线索可能变得过于创意化,因此将温度降低至 0.2。游戏还会检查回答是否包含不完整文本或暴露答案,并对不适合的回答重新尝试。
生成谜语可能需要数秒时间,因此游戏会异步准备谜题。生成过程在加载期间开始,并持续进行,直到菜单打开为止。一旦一个谜语完成,工作者就会请求下一个,整个比赛过程中,摄像头、语音输入和游戏循环均继续运行。如果游戏未及时响应,界面会显示一个带有暂停计时器的加载画面。同时,游戏会在屏幕上显示最终比分,并开始准备下一场比赛。
语音指令使用了Vosk的小型英文模型,识别范围仅限于游戏支持的命令词汇。之所以选择这个模型,是因为内置的Arduino关键词模型只能识别“Hey Arduino”,无法支持该游戏所需的多种指令。虽然可以使用自定义的Edge Impulse模型来支持这些指令,我实际上也训练过该模型,但由于某些词语的识别准确率不够理想,因此在当前版本中选择了Vosk。该模型运行在Python应用程序中,其模型文件已包含在导入的ZIP包内。
令人印象深刻的是,在UNO Q上同时启用三个模型时,游戏反应非常灵敏。尽管如此,要让这些模型实现良好的游戏体验仍需进行一些调优。
调整游戏
与预期相反,第一个原型已经具备了可运行的游戏循环。后续的大部分工作是通过实际游玩,并发现其中不清晰或运行缓慢的地方。
摄像头分辨率和物体识别需要特别注意,部分语音指令也经过了多次尝试才得以完善。至少部分摄像头问题有简单的原因:我是在一个非常昏暗的房间里进行开发的。我尝试了不同的画面裁剪方式,并考虑将每位玩家的侧边分别处理。
运行两次检测流程会增加计算负担,因此当前版本在一次处理中同时处理两侧画面,并采用最新的可用帧,而不是建立旧图像队列。
光照、物体的角度以及显示的清晰度仍会影响识别效果。在某些视角下,书籍和遥控器的识别可靠性较低,因此可见的识别反馈显得尤为有用。
通过测试过程,界面也进行了调整。我扩大了摄像头视图,缩小了周围文字,并使分数和计时器保持紧凑。
复古的标志和配色赋予了游戏独特的风格,而声音则标志着每一轮的进展。事实上,倒计时在最后阶段变得更加明显,在最后五秒内每秒都会发出一声提示音。
在项目开发过程中,App Lab 也不断优化。在更新了应用程序和电路板后,我重新检查了安装设置,以便 App Lab 能够管理游戏、模型服务和启动过程。GPT-5.6 及后续版本的 GPT-6 在开发和视觉设计方面给予了我很大帮助,而后者并非我的强项。通过电视进行测试,帮助我确定哪些改动真正让游戏更易于使用。
在家搭建设备
硬件包括一个 Arduino UNO Q、带麦克风的 USB 网络摄像头、带电源的 USB-C 集线器,以及一台电视或 HDMI 屏幕。集线器需要 PD 电源输入、HDMI 输出和一个用于连接摄像头的 USB 数据端口。
将电源连接到集线器的 PD 端口,集线器连接到 UNO Q,摄像头连接至 USB,屏幕通过 HDMI 连接。调整摄像头位置,确保两支队伍都能在光线充足的情况下清晰可见。应用程序以 ZIP 归档形式打包,供 Arduino App Lab 导入,其中包含离线语音模型。导入后,通过 App Lab 下载所选的目标检测和语言模型,然后运行程序。
App Lab 的“开机自动运行”功能可在电路板启动时自动运行该应用。包含的电视设置脚本可配置自动桌面登录、全屏显示和HDMI音频。
仓库中的README文件包含了安装命令和连接图。通过修改python/objects.json中每个条目的启用字段,可以调整对象列表以适应您家中现有的设备。
设置完成后,玩家仅需使用摄像头和电视这两个接口即可。
本文编译自hackster.io





