基于HuskyLens与micro:bit的AI视觉交互项目:自制神奇宝贝图鉴器
1. 项目缘起:当“二哈”遇见“神奇宝贝”
前阵子收拾屋子,翻出了孩子玩腻的micro:bit开发板,还有几个闲置的舵机和传感器。看着这些“电子垃圾”,我就在想,能不能用它们搞点既有趣又有技术含量的东西,重新点燃孩子(以及我自己)对硬件的兴趣。正好,之前体验过HuskyLens(也就是大家常说的“二哈识图”)这款AI视觉传感器,它开箱即用的物体识别功能给我留下了深刻印象。一个念头突然冒出来:能不能用“二哈”来识别现实中的物体,然后让micro:bit驱动一个“图鉴”装置,像《神奇宝贝》里的图鉴一样,识别到特定物体就自动展示对应的信息?
这个想法让我很兴奋。它不像单纯的教程项目那样只是点亮个LED或者让小车跑起来,而是融合了当下热门的边缘AI视觉、嵌入式硬件交互,甚至还有点无线数据传输的影子,最终呈现为一个有明确主题和趣味性的完整作品。整个过程涉及硬件选型、软件编程、结构设计、功能联调,是一个典型的创客项目,非常适合用来学习从想法到实物的完整流程。今天,我就把这个“自制神奇宝贝图鉴器”的实现过程、踩过的坑以及一些优化思路,毫无保留地分享出来。
2. 核心硬件选型与功能拆解
这个项目的核心目标是:让机器“看见”物体,并做出智能响应。围绕这个目标,我们需要拆解出几个关键模块,并为之选择合适的硬件。
2.1 视觉感知模块:为什么是HuskyLens?
视觉部分是项目的起点。市面上能给微控制器用的视觉模块不少,比如OpenMV、K210开发板等。但我最终选择了DFRobot的HuskyLens,主要基于以下几点考虑:
极低的学习与使用门槛:“二哈”最大的特点是内置了训练好的AI算法。对于物体分类、人脸识别、标签追踪等常见功能,你不需要自己收集数据、训练模型、部署模型。只需要通过机身上的按钮和屏幕,对着目标物体按一下“学习键”,它就能记住这个物体。下次再看到类似的物体,它就能直接输出识别结果(ID、坐标、大小等)。这让我们可以完全专注于应用逻辑的开发,而不是陷在复杂的AI模型训练中。
丰富的通信接口:HuskyLens支持I2C、UART两种通信方式,可以非常方便地与Arduino、micro:bit、树莓派等主流主控板连接。其通信协议也相对简单,通过读取固定的数据帧就能获取识别结果。
集成度高,供电简单:模块集成了摄像头、处理器、屏幕,只需要一根4Pin线(VCC, GND, SDA, SCL或TX, RX)就能工作,非常适合嵌入式项目。
注意:HuskyLens的物体识别是基于特征点的,而非深度学习中的大量数据训练。这意味着它对于形状、颜色特征明显的物体(比如一个红色的苹果、一个特定的玩具)识别效果很好,但对于同一类物体中差异较大的个体(比如不同品种的狗),可能需要分别学习。在我们的“神奇宝贝”图鉴场景中,这反而成了优点——我们可以把每个不同的手办或卡片定义为一个独立的“神奇宝贝”,分别学习,实现精准的一对一识别。
2.2 主控与执行模块:micro:bit + 舵机 + 显示屏
主控板我选择了BBC micro:bit。原因很简单:它普及度高,图形化编程环境(如Mind+)对新手友好,同时其MicroPython能力也能满足进阶需求。更重要的是,它内置了蓝牙和无线电模块,为后续的无线传输信号模拟提供了硬件基础。
项目的“图鉴”表现形式,我设计了一个可翻页的实体卡片簿。具体执行机构如下:
- 翻页机构:使用一个180度舵机。舵机臂连接一个“拨杆”,通过程序控制舵机旋转特定角度,模拟手指翻动卡片簿页面的动作。
- 信息展示:最初考虑用micro:bit自身的5x5 LED点阵,但显示信息太有限。因此,我增加了一块OLED显示屏(I2C接口,128x64分辨率),用于显示识别出的“神奇宝贝”的名称、属性、简介等文本信息。
- 交互反馈:micro:bit的板载LED点阵和蜂鸣器也没浪费,用来作为识别成功的视觉和声音提示(比如显示一个对勾图案,播放一段简短音效)。
2.3 “无线传输”概念的融入
“相关热搜词”和“最新网络热词”里都提到了“无线传输”。在这个项目中,我并没有实现真正的远程数据传输(比如Wi-Fi或4G),而是巧妙地利用了micro:bit内置的无线电(Radio)功能,模拟了“图鉴数据无线同步”的体验。
我的设计是:准备两块micro:bit。一块(Micro:bit A)作为“图鉴终端”,与HuskyLens、舵机、OLED连接,负责核心的识别与翻页动作。另一块(Micro:bit B)作为“数据发射端”,单独放置。当在HuskyLens上学习一个新的“神奇宝贝”时,我们需要给这个物体分配一个唯一的ID。这个ID不仅存储在“二哈”内部,也通过Micro:bit B的无线电发送出去。Micro:bit A接收到这个ID后,将其与对应的“神奇宝贝”详细信息(名称、属性等)绑定,并存储起来。
这样,从用户视角看,学习新生物的过程,就像是把它的“数据”从发射端无线传输到了图鉴终端,科技感十足。这实际上是一种近距离的、设备间通信的信号模拟系统,成本低廉且易于实现。
3. 系统搭建与电路连接
硬件清单确定后,下一步就是将它们正确地连接起来。清晰的接线是项目稳定的基础。
3.1 接线图与原理说明
由于设备较多,我制作了一个接线表格,比文字描述更直观:
| 设备 | 引脚/接口 | 连接到 Micro:bit (主控A) | 功能说明 |
|---|---|---|---|
| HuskyLens | I2C 接口 (4Pin) | SDA -> P20 | I2C 数据线 |
| SCL -> P19 | I2C 时钟线 | ||
| VCC -> 3.3V | 特别注意:必须接3.3V | ||
| GND -> GND | 共地 | ||
| OLED显示屏 | I2C 接口 (4Pin) | SDA -> P20 | 与HuskyLens共享I2C总线 |
| SCL -> P19 | 与HuskyLens共享I2C总线 | ||
| VCC -> 3.3V | 供电 | ||
| GND -> GND | 共地 | ||
| 舵机 | 信号线 (橙色) | 信号线 -> P0 | PWM信号控制引脚 |
| 电源线 (红色) | VCC -> 外部电源正极 | 重要:勿直接接micro:bit | |
| 地线 (棕色) | GND -> 外部电源负极 & micro:bit GND | 电源共地 | |
| Micro:bit B (发射端) | 无线电 | 无需接线,独立供电 | 仅用于发送ID信号 |
关键接线细节与避坑指南:
- HuskyLens供电电压:这是最容易出错的地方。HuskyLens的工作电压是3.3V,而micro:bit的3.3V引脚输出电流有限(约300mA)。虽然“二哈”在识别时功耗不高,但为了系统稳定,建议使用一个3.3V稳压模块,从外部电源(如4节AA电池盒或USB充电宝)取电,同时给HuskyLens和舵机供电。直接将HuskyLens接micro:bit的3.3V,可能导致micro:bit重启或“二哈”工作不稳定。
- 共享I2C总线:HuskyLens和OLED显示屏都使用I2C协议,因此它们的SDA和SCL可以分别并联到micro:bit的对应引脚(P20和P19)。每个I2C设备都有一个地址,HuskyLens的默认地址是
0x32,OLED的地址通常是0x3C,程序里通过地址来区分和它们通信,不会冲突。 - 舵机供电隔离:舵机在转动瞬间电流很大,绝对不能直接从micro:bit取电,否则极易烧坏主控板。必须使用独立的外部电源(如上述的电池盒)为舵机供电。同时,务必把外部电源的GND和micro:bit的GND连接在一起,确保它们有共同的参考地,PWM信号才能被正确识别。
- 引脚分配策略:micro:bit的某些引脚有特殊功能。我选择P0控制舵机,是因为它是一个普通的GPIO,也支持PWM。P19、P20是硬件I2C引脚,连接“二哈”和OLED最稳定。P1、P2等引脚可以预留,用于后续扩展按钮或传感器。
4. 软件逻辑与Mind+编程实现
硬件连接好后,就到了赋予项目灵魂的软件部分。我使用Mind+(基于Scratch 3.0,支持图形化和Python)进行编程,因为它对micro:bit和HuskyLens的支持非常好,封装了复杂的底层通信。
4.1 主程序逻辑流程图
整个图鉴器的工作流程可以用以下逻辑来描述:
- 初始化:设置无线电组、初始化OLED屏幕、连接HuskyLens。
- 循环检测:持续从HuskyLens读取识别结果。
- 判断与响应:如果识别到物体(ID > 0):
- 检查这个ID是否是新出现的(与上一次识别的ID不同)。
- 如果是新ID,则根据ID索引,从预存的“神奇宝贝”数据库中找到对应的名称、属性、简介。
- 在OLED屏幕上显示详细信息。
- 控制舵机旋转到该ID对应的页面角度(例如,ID=1转到30度,ID=2转到60度)。
- 让micro:bit点阵显示笑脸,播放提示音。
- 记录当前ID,防止重复触发。
- 无线学习功能:这是一个独立并行的事件。当按下micro:bit A的A按钮时,进入“学习模式”,等待接收来自Micro:bit B的无线电信号(即新物体的ID),并将其添加到数据库的末尾。
4.2 Mind+图形化编程关键积木解析
虽然图形化编程看起来简单,但里面有些细节决定了项目的成败。
1. HuskyLens数据读取:在Mind+的“扩展”中添加“HuskyLens AI摄像头”后,关键积木是请求HuskyLens返回 [物体识别] 的学习结果。这个积木执行后,需要用一个“重复执行直到”循环来等待数据准备好,判断条件是HuskyLens [物体识别] 是否学习到ID?。这里有个坑:HuskyLens的数据更新有一定频率,如果主循环太快,可能会读到旧数据或空数据。我的经验是,在读取积木后加一个等待0.1秒,让数据缓冲区稳定,能显著提高识别稳定性。
2. 舵机角度控制:使用设置舵机连接引脚 [P0] 角度为 [ ]积木。翻页动作需要拟人化,不能瞬间“跳”到目标角度。我的做法是使用一个“渐进循环”:从当前角度开始,每次增加(或减少)2度,并等待20毫秒,直到达到目标角度。这样舵机会平滑转动,更像是在翻书。
3. OLED屏幕显示:OLED显示需要处理多行文本和清屏。Mind+的OLED积木有显示字符串 [ ] 行 [ ] 列 [ ]。需要注意的是,屏幕分辨率是128x64,每行大约可以显示16个中文字符或32个英文字符。在显示新信息前,务必先使用清除显示积木,否则新旧文字会重叠。对于较长的简介,可以设计滚动显示效果。
4. 无线电通信:这是模拟“无线传输”的核心。在Mind+的“扩展”中添加“无线电”。
- 发射端(Micro:bit B)程序:非常简单。当按下它的A按钮时,就
无线发送数字 [新物品ID]。这个ID可以硬编码,或者通过其他方式(比如旋钮电位器)来设定。 - 接收端(Micro:bit A)程序:需要设置
当无线接收到数据的事件。接收到数字后,将其存入一个变量,比如新ID。然后,在“学习模式”下,将这个新ID与用户通过HuskyLens按键学习的物体绑定。同时,在OLED上显示“新生物数据已接收!”的提示。
5. “神奇宝贝”数据库的实现:在micro:bit这种资源有限的设备上,无法使用复杂的数据库。我采用最直接的数组(列表)方式来模拟。例如,创建三个列表:
宝可梦ID列表: [1, 2, 3]宝可梦名称列表: ["皮卡丘", "妙蛙种子", "小火龙"]宝可梦简介列表: ["电属性,脸颊有电气袋", "草/毒属性,背上有种子", "火属性,尾巴火焰代表生命"]
当识别到ID为x时,程序就去遍历宝可梦ID列表,找到匹配的索引号,然后用这个索引号去名称列表和简介列表里取出对应的信息显示。当通过无线方式添加新ID时,就向这三个列表末尾分别追加新的数据。
5. 机械结构设计与组装调试
电子部分通了,但要让“图鉴”真正动起来,一个可靠的机械结构必不可少。我的设计目标是:简单、可靠、易于复现。
5.1 翻页机构的设计
我使用了激光切割的3mm椴木板来制作结构件。核心是一个可以固定卡片簿的底座,以及一个由舵机驱动的“翻页拨杆”。
- 底座设计:底座需要有一个垂直的背板,用于粘贴或夹住卡片簿。底部平台用于固定micro:bit、面包板和电池盒。背板上要开孔,让舵机的转轴可以伸出来。
- 拨杆设计:用一小段铁丝或者3D打印一个L形的拨杆,一端牢牢固定在舵机的舵盘上,另一端轻轻搭在卡片簿的页面上。舵盘旋转时,拨杆会划过页面边缘,将一叠页面拨过去,实现翻页。
- 角度校准:这是调试中最花时间的部分。你需要手动测试:舵机转动多少度,刚好能翻过一页?这个角度取决于你的卡片簿厚度、拨杆长度和安装位置。我的方法是,先写一个测试程序,让舵机在0-180度之间慢慢来回转动,观察拨杆的运动轨迹,找到它刚好能接触到页面和刚好翻过一页的两个临界点角度,记录下来,作为程序中翻一页的动作角度。
5.2 整体布局与走线
合理的布局能让项目看起来更整洁,也减少干扰。
- 重心稳定:电池盒(最重的部分)放在底座平台的下方或后方,降低重心,防止头重脚轻。
- 线路管理:使用尼龙扎带或热熔胶枪固定飞线。将HuskyLens用可调节的支架(比如迷你三脚架)立在卡片簿正前方合适距离,确保视野能覆盖整个识别区域。
- OLED屏幕摆放:将OLED屏幕用双面胶固定在卡片簿背板的上方或侧方,作为信息显示屏,方便观看。
5.3 系统联调与问题排查
把所有部分组装好后,上电测试,很可能会遇到各种问题。下面是我遇到的一些典型问题及解决方法:
| 现象 | 可能原因 | 排查与解决步骤 |
|---|---|---|
| HuskyLens开机无反应或频繁重启 | 供电不足或电压不对 | 1. 检查是否接在3.3V上。 2. 用万用表测量供电引脚电压,是否稳定在3.3V左右。 3. 尝试使用独立的3.3V稳压模块供电,确保电流充足。 |
| 舵机不转动或抖动 | 1. 供电不足 2. 信号线接触不良 3. 程序角度值超限 | 1. 确保舵机使用独立电源(如4节AA电池,提供6V电压)。 2. 检查信号线是否接在指定的P0引脚,且接触良好。 3. 检查程序里设置的舵机角度是否在0-180度合理范围内。 |
| OLED屏幕不显示或乱码 | 1. I2C地址错误 2. 初始化失败 3. 屏幕本身故障 | 1. 确认OLED的I2C地址(常用0x3C或0x3D),在Mind+初始化积木中填写正确。 2. 检查SDA、SCL接线是否反了或虚焊。 3. 尝试单独给OLED和micro:bit编程,写一个简单的显示测试程序。 |
| 物体识别不稳定,时有时无 | 1. 环境光线过暗或过亮 2. 学习样本不充分 3. 物体特征不明显 | 1. 保证识别环境光线均匀、适中,避免强光直射或逆光。 2. 对同一个物体,从多个角度(正面、侧面、稍微倾斜)各学习一次,增加特征样本。 3. 尝试更换识别物体,选择颜色、形状对比度高的物体。 |
| 无线电接收不到信号 | 1. 无线电组号不一致 2. 距离过远或有遮挡 3. 程序逻辑错误 | 1. 检查发射端和接收端的micro:bit,在“设置无线电组”积木中是否使用了相同的组号(0-255)。 2. 确保两台设备在几米范围内,无大型金属物体遮挡。 3. 在接收端程序中,用 显示数字积木将接收到的信号直接显示在点阵上,先验证通信是否正常。 |
6. 功能优化与扩展思路
一个基础版本完成后,我们可以从交互体验、功能深度和外观呈现上做很多优化,让这个“图鉴器”更像那么回事。
6.1 交互体验优化
- 多级菜单与按钮控制:目前版本是自动识别即翻页。可以增加一个模式切换按钮(用micro:bit的B按钮)。按一下B按钮,OLED进入菜单模式,显示“1.识别模式 2.浏览模式 3.学习模式”,通过A按钮进行选择和确认。在“浏览模式”下,可以用A/B按钮手动前后翻页,查看所有已收录的宝可梦信息。
- 语音反馈:加入一个DFPlayer Mini模块和一个小喇叭,为每个宝可梦录制一段简短的特性介绍音频(如“皮卡丘,电属性宝可梦”)。当识别成功时,不仅翻页显示文字,还播放对应的语音,体验立刻提升一个档次。
- 识别置信度显示:HuskyLens其实可以返回识别框的大小和坐标。我们可以利用这些数据简单计算一个“置信度”(比如识别框面积是否稳定、位置是否在画面中央)。在OLED上同时显示识别到的名称和置信度百分比,让用户知道这次识别有多“确定”。
6.2 数据与功能扩展
- SD卡存储数据库:当收录的“神奇宝贝”数量很多时,micro:bit的内存可能不够用。可以添加一个MicroSD卡模块,将宝可梦的详细信息(名称、属性、身高、体重、技能等)以文本文件的形式存储在SD卡中。程序运行时,根据识别到的ID去SD卡里读取对应的文件内容并显示。这样理论上可以存储成千上万条记录。
- 联网更新图鉴:这是更进阶的玩法。将主控换成ESP32或树莓派Pico W这类带Wi-Fi功能的板子。识别到物体后,通过Wi-Fi向一个自己搭建的简单服务器(或Evene Webhook)发送ID,服务器返回该ID对应的详细信息(JSON格式),设备再解析并显示。这样就可以实现真正的“云端图鉴”,随时更新和添加新内容。
- 融合更多传感器:比如加入一个温湿度传感器,当识别到“急冻鸟”时,让舵机带动一个小风扇吹出冷风(配合加湿器);识别到“喷火龙”时,点亮红色的LED灯带模拟火焰效果。让交互从视觉扩展到环境感知,更加沉浸。
6.3 外观与主题深化
- 定制化外壳:用3D建模软件(如Fusion 360, Tinkercad)为整个装置设计一个科幻风格的“图鉴”外壳,将电路板、屏幕、摄像头都内嵌其中,只露出必要的镜头和显示区域。
- 卡片簿改造:不用现成的相册,而是自己打印和制作“神奇宝贝”卡片。每一页的右下角可以贴上一个简单的AprilTag或ArUco二维码。HuskyLens也支持标签识别,这样识别稳定性和准确性会更高。翻到某一页,摄像头识别页面角落的标签,从而触发对应的信息展示。
这个“二哈物体分类-自制神奇宝贝图鉴器”项目,从想法到实现,贯穿了硬件集成、软件编程、机械设计和问题调试的全过程。它最吸引人的地方在于,用一个具体的、有趣的主题,将几个看似不相关的技术点(AI视觉、嵌入式控制、无线通信、人机交互)串联了起来,形成了一个有始有终的完整作品。无论是用于STEM教育,还是作为创客玩家的一个趣味项目,它都能带来十足的成就感。更重要的是,在这个过程中积累的硬件连接经验、调试方法和功能扩展思路,完全可以迁移到其他任何物联网或智能交互项目中。
