基于Arduino与Teachable Machine的微型视觉分拣器制作指南
1. 项目概述:当Arduino遇见机器学习
几年前,我第一次接触机器学习时,感觉它像是一个遥不可及的“黑盒子”,充满了复杂的数学公式和庞大的服务器集群。直到我尝试将它与手边的Arduino、几个小零件结合起来,制作出这个能自己“看”和“分”的微型分拣器,我才真正体会到,机器学习的核心思想其实非常直观:让机器从经验中学习。这个项目完美地拆解了这个过程,把“训练模型”变成了一个你可以亲手喂它看、教它认的互动游戏。
这个微型分拣器的核心目标,是让一个简单的硬件装置,具备基于视觉的物体识别与分类能力。它由几个关键部分组成:一个用纸板制成的物理分拣滑道,一个控制滑道左右摆动的伺服电机(SG90),一块作为大脑的Arduino Leonardo开发板,以及你的电脑摄像头和浏览器。整个系统的逻辑链条非常清晰:摄像头持续拍摄滑道顶部的画面,通过浏览器中运行的p5.js程序将图像发送到Google的Teachable Machine平台进行实时推理,判断当前画面中是“物体A”、“物体B”还是“空置”。然后,这个判断结果会通过WebUSB技术发送给Arduino,Arduino据此驱动伺服电机,将滑道转向对应的收集盒方向,物体便依靠重力滑落,完成分拣。
它特别适合几类朋友尝试:首先是嵌入式开发或物联网的初学者,想了解如何让硬件“活”起来并响应高级指令;其次是对机器学习感兴趣,但被代码和数学吓退的爱好者,这个项目提供了零代码训练模型的体验;最后是教育工作者或创客,这是一个绝佳的、可视化的STEM教学案例,能生动展示从数据采集、模型训练到实际应用的完整AI流水线。整个项目成本极低,除了Arduino和伺服电机需要购买,其他材料如纸板、胶带都唾手可得,但带来的启发和成就感却一点也不“微型”。
2. 核心硬件选型与设计思路解析
2.1 为什么是Arduino Leonardo?
在这个项目中,主控板的选择至关重要,它直接决定了我们能否方便地与网页应用进行双向通信。市面上常见的Arduino Uno/Nano使用的是传统的USB转串口芯片(如CH340或ATmega16U2),它们通过虚拟串口与电脑通信,这种通信方式无法被网页浏览器直接、安全地访问。
Arduino Leonardo(以及基于相同方案的Micro、Due等)的核心优势在于,其主控芯片ATmega32u4内置了USB通信功能。 这意味着它可以直接被识别为一个USB人机接口设备(HID),而不仅仅是串口设备。这为WebUSB技术的应用奠定了基础。WebUSB是一个新兴的Web API,允许网页与真实的USB设备安全连接,无需安装任何额外的驱动程序或本地应用。因此,选择Leonardo,我们就能在Google Chrome浏览器中,通过几行JavaScript代码直接向它发送“向左转”或“向右转”的指令,实现了从网页到物理世界最直接的桥梁。
注意:务必确认你手中的是Arduino Leonardo正品或兼容板。一些标着“Leonardo”的廉价兼容板可能使用了不同的主控芯片(如CH552),它们无法支持本项目所需的WebUSB功能。一个简单的鉴别方法是,在Arduino IDE中选择板卡类型时,正品Leonardo会出现在“Arduino AVR Boards”分类下。
2.2 执行机构:SG90微型伺服电机的考量
分拣动作的执行者是一个9克重的SG90微型伺服电机。它的选择基于几个现实考量:
- 扭矩与速度:SG90的扭矩约为1.8 kgf·cm,足以轻松推动由纸板和少量小物体构成的滑道进行摆动。其动作速度也适中,不会因太快导致物体飞溅,也不会太慢影响分拣效率。
- 控制简单:伺服电机不同于普通直流电机,它通过接收PWM(脉冲宽度调制)信号来精确控制输出轴的角度。Arduino原生支持PWM输出,只需使用
Servo库,一两行代码就能将其驱动到0度或180度,对应我们需要的左、右两个分拣位置。 - 尺寸与供电:其微型尺寸非常适合这个“Tiny”项目。而且,它可以直接由Arduino板载的5V引脚供电(需注意总电流消耗),无需额外驱动电路,极大简化了硬件连接。
设计思路上,我们将伺服电机的摆臂与纸板滑道的底部中心点连接。当Arduino收到“向左”指令时,驱动电机转到特定角度,使滑道整体向左倾斜,物体滑入左侧收集盒;反之亦然。这个机械设计巧妙地用最简单的结构(一个旋转支点)实现了二分选功能。
2.3 视觉感知:利用现有网络摄像头
我们没有为项目单独配置摄像头模块,而是选择使用电脑自带的或外接的USB网络摄像头。这是一个“借力”的聪明做法,其优势明显:
- 成本为零:无需额外购买硬件。
- 开发便捷:现代浏览器通过
getUserMediaAPI可以轻松获取摄像头视频流,这正好被p5.js和Teachable Machine所利用。我们完全避开了在Arduino上处理图像数据这个对MCU来说极其繁重的任务。 - 分辨率与帧率足够:对于识别1-1.5厘米的物体,720p的摄像头分辨率绰绰有余。浏览器的JavaScript环境也能流畅处理实时视频流用于推理。
这个设计将复杂的视觉计算任务从资源有限的嵌入式端剥离,交给了性能强大的电脑和云端/本地模型,是边缘计算中典型的“云-端协同”或“浏览器-端协同”思路的微型体现。
3. 分拣器机械结构与组装详解
3.1 图纸解读与材料准备
原项目提供的PDF模板是整个装置的骨架。这份图纸本质上是一个经过精心设计的“纸机关”,它包含了底座、侧壁、顶部分拣头以及伺服电机安装位等部分。使用约200克重的卡纸打印是关键,太薄的纸张(如普通A4打印纸)缺乏支撑力,在伺服电机反复摆动和物体撞击下容易变形或撕裂;太厚的纸板则难以进行精细的折叠和粘贴。
除了电子部件,你还需要准备:
- 切割工具:锋利的裁纸刀或笔刀搭配钢尺,比剪刀更能切出笔直光滑的边缘,这对后续的严丝合缝组装很重要。
- 粘合材料:电工胶带是推荐选择,因为它有一定厚度和韧性,既能牢固粘合,又能耐受一定程度的反复弯折(如在活动关节处)。透明胶带或双面胶的强度和耐久性可能不足。
- 点睛之笔:一对“咕噜眼”(Googley Eyes)。这不仅是增添趣味,更重要的是,它帮助我们将这个机器“拟人化”,在心理上更直观地理解它“看”和“判断”的过程。
3.2 分步组装与关键调整
组装过程像在拼一个三维拼图,需要耐心和精确度。
第一步,切割与预折痕。沿着图纸的所有实线进行切割,沿着所有虚线用刀背或无墨的圆珠笔轻轻划出折痕。这一步划痕的深度要掌握好,以能让纸板轻松沿直线弯折,但又不会将其切断为准。预折痕做得好,后续的立体成型才能方正牢固。
第二步,立体成型与固定。按照图纸指示,将底座、侧壁等部分立起并粘合。这里有个实操心得:在涂抹胶水或粘贴胶带前,先不粘合,将所有部分卡在一起,检查整体的契合度。特别是容纳伺服电机的那个纸槽,要确保电机能严丝合缝地塞进去,不会太紧(影响电机运行)也不会太松(导致运行时晃动)。确认无误后,再从内部进行重点加固粘贴。
第三步,安装伺服电机与摆臂。这是机械部分的核心。将SG90伺服电机放入预留槽并固定。电机的输出轴上需要安装随附的塑料摆臂。一个至关重要的细节:在将摆臂用螺丝固定到电机轴上之前,先给Arduino上传一个简单的伺服电机居中程序(例如,让电机转到90度)。在电机通电处于90度位置时,再将摆臂以水平方向安装上去。这样可以确保我们在代码中定义的“左转”(如0度)和“右转”(如180度)能对应到物理上的最大摆动范围,避免硬件死点。
第四步,连接分拣头。将打印好的分拣头(那个带漏斗形状的顶部)与伺服电机的摆臂尖端连接。连接点必须是活动的,建议使用一小段硬质塑料片或加厚的卡纸作为连接杆,两端分别与摆臂和分拣头用细螺丝或铆钉连接,形成可活动的关节。这样,伺服电机旋转时,是通过这个连接杆去“推拉”分拣头的底部,从而带动整个分拣头像跷跷板一样左右倾斜。
注意:整个组装完成后,用手轻轻拨动分拣头,它应该能顺畅地左右摆动,没有卡滞感。并且,在不通电的情况下,分拣头应该能在任意位置保持平衡,这有助于减少伺服电机在初始位置的负载。
4. 固件烧录与WebUSB环境配置
4.1 Arduino开发环境与核心库准备
首先,确保你电脑上安装的是最新版的Arduino IDE。前往Arduino官网下载安装即可。接下来是关键的一步——导入WebUSB库。原教程中提供的GitHub链接可能发生变化,更通用的方法是:
- 在Arduino IDE中,点击「工具」->「管理库…」,打开库管理器。
- 在搜索框中输入“WebUSB”,你会发现一个由Arduino官方维护的库,名为“WebUSB”。点击安装。 这个官方库比原教程中从GitHub下载的zip文件更稳定,兼容性更好,省去了手动添加.zip库的步骤。
4.2 修改USBCore.h文件的原因与操作
这是针对Linux系统的一个特殊步骤,目的是为了让Arduino Leonardo将自己标识为支持WebUSB的设备。USBCore.h文件定义了Arduino的USB设备描述符,其中USB_VERSION默认是0x200(代表USB 2.0)。WebUSB规范要求设备声明特定的版本号(0x210)来表明自己支持WebUSB。
操作路径可能因系统而异:原教程的路径/usr/share/arduino适用于通过软件包管理器安装的Arduino IDE。如果你使用的是从官网下载解压的便携版,这个文件会在你的Arduino安装目录下,例如arduino-1.8.19/hardware/arduino/avr/cores/arduino/USBCore.h。
修改时务必小心:使用文本编辑器(如VS Code、Sublime Text)打开比用nano命令更直观。找到#define USB_VERSION 0x200这一行,将其改为#define USB_VERSION 0x210,保存即可。一个重要的提醒:这个修改是针对你电脑上Arduino开发环境中的核心文件,它会影响你在这台电脑上为所有Leonardo类板卡编译的程序。修改后,你需要重新启动Arduino IDE,修改才会生效。
4.3 上传控制固件
打开提供的sorter_sketch.ino文件。在上传之前,需要确认两件事:
- 板卡类型:在「工具」->「开发板」中,选择“Arduino Leonardo”。
- 端口:将Arduino Leonardo通过Micro USB线连接到电脑,然后在「工具」->「端口」中,选择新出现的那个端口(在Windows上通常是COM后跟一个数字,在Linux/Mac上是
/dev/ttyACM0或类似)。
点击上传按钮。如果一切顺利,你会看到IDE下方提示“上传成功”。这个固件的作用非常简单:它初始化了伺服电机,并等待通过WebUSB发送来的指令。指令可能是一个字符,比如'L'代表左转,'R'代表右转,'S'代表停止抖动。固件解析这个字符,然后调用servo.write()函数驱动电机转到对应角度。
5. 系统软件栈:p5.js与Teachable Machine的作用
5.1 p5.js:连接浏览器与硬件的桥梁
p5.js是一个让创意编程变得简单的JavaScript库。在本项目中,它扮演了中枢神经系统的角色。其工作流程如下:
- 视频捕获:通过
createCapture(VIDEO)函数,轻松获取电脑摄像头的实时视频流。 - Canvas绘制:将视频流显示在网页的一个
<canvas>画布上。同时,它会在视频流的特定区域(对应分拣器顶部的分拣槽)绘制一个矩形框,这个区域就是我们感兴趣的区域(ROI),Teachable Machine将只分析这个区域内的图像。 - WebUSB通信:这是最关键的一步。p5.js脚本使用
navigator.usbAPI来请求连接Arduino Leonardo。一旦用户授权连接,浏览器就能直接向Arduino发送数据,绕过了传统的串口通信。脚本中会包含类似device.transferOut(endpoint, data)的代码,将分类结果(如‘L’或‘R’)发送出去。 - 模型集成与推理:脚本会加载我们从Teachable Machine导出的模型URL。在每一帧动画中,它截取ROI区域的图像数据,将其转换为模型所需的输入格式(例如224x224像素的图片),然后喂给模型进行推理,得到“物体A”、“物体B”、“空”的概率分布。
- 决策与控制:根据模型输出的最高概率结果,p5.js决定向Arduino发送何种指令,从而控制分拣动作。同时,它还可以在网页上可视化显示分类结果和置信度,让整个过程一目了然。
5.2 Teachable Machine:零代码的视觉模型训练平台
Teachable Machine的伟大之处在于,它把机器学习的训练过程变成了一个点击式的交互操作。我们不需要理解卷积神经网络(CNN)的层结构,也不需要编写TensorFlow或PyTorch代码。
它的工作原理可以这样通俗理解:你提供了一个在线工具,这个工具说:“给我看一些属于‘类别A’的东西,再给我看一些属于‘类别B’的东西,再给我看一些什么都不属于(背景)的东西。” 你通过摄像头实时拍摄并按下录制按钮,就相当于在给它提供“教材”。平台在后台自动完成以下工作:
- 数据预处理:将你上传的图片统一缩放到固定尺寸,可能还会进行简单的归一化(如将像素值从0-255缩放到0-1之间)。
- 模型构建与训练:它使用一个预训练好的、轻量级的图像分类模型(很可能是MobileNet)作为基础。这个模型已经学会了识别通用物体的基本特征(如边缘、纹理、颜色)。然后,它通过一种叫“迁移学习”的技术,用你提供的少量新图片(每个类别30张左右)去微调这个模型的最后几层,让它“忘记”一点通用知识,转而“记住”你特定物体的特征。
- 模型导出:训练完成后,它生成一个包含模型权重和架构的文件,并托管在谷歌的服务器上,给你一个唯一的URL。这个URL就是p5.js脚本中需要加载的模型地址。
一个核心经验:Teachable Machine训练的是“特征差异”。如果你要分拣一颗红豆和一颗绿豆,在颜色上差异明显,训练起来就很容易。但如果你要分拣两个颜色、形状都非常接近的物体,就需要在拍摄训练图片时,从更多角度、不同光照下采集,帮助模型找到更细微的特征(如反光点、微小划痕等)。这就是为什么教程中强调,如果效果不好,要多尝试提供不同的样本。
6. 完整实操流程与核心环节实现
6.1 硬件连接与初始测试
硬件连接极其简单,只需要三根杜邦线(跳线):
- 伺服电机的棕色或黑色线(GND) 连接到 Arduino Leonardo 的 GND 引脚。
- 伺服电机的红色线(VCC,+5V) 连接到 Arduino Leonardo 的 5V 引脚。
- 伺服电机的橙色或黄色线(信号线) 连接到 Arduino Leonardo 的 数字引脚9(根据
sorter_sketch.ino代码中的定义,也可能是其他引脚,需核对代码)。
连接好后,先不要急于进行复杂操作,做一个简单的硬件功能测试。打开Arduino IDE的串口监视器(注意,此时使用的是传统的串口通信,与后续WebUSB不同),将波特率设置为9600。你可以手动输入L、R、S等字符并发送,观察伺服电机是否相应地左转、右转或停止在中间。这个测试能快速排除硬件连接错误或伺服电机本身故障。
6.2 访问p5.js控制界面并建立连接
在Chrome浏览器中打开项目提供的p5.js编辑器链接。页面加载后,你应该能看到一个简单的界面,很可能中央是视频预览区,旁边有“Connect Arduino”按钮。
- 点击“Connect Arduino”:此时浏览器会弹出一个USB设备选择窗口,列表中应该会出现“Arduino Leonardo”或类似的设备名称。选中它并点击“连接”。
- 授权连接:如果这是第一次连接,浏览器可能会要求你授权该网站访问USB设备,点击“允许”。
- 连接成功:如果一切顺利,你会立刻看到你的微型分拣器开始左右摇摆。这个摇摆动作是p5.js脚本发送的测试信号,目的是让物体在滑道上能够单颗下落,同时也表明WebUSB通信链路已经成功建立。
注意:如果点击连接后没有任何反应,或者弹出错误,请按以下步骤排查:
- 检查Arduino是否已烧录正确固件:重新上传一遍
sorter_sketch.ino。- 检查USB线:尝试换一根已知良好的Micro USB数据线,有些线只能充电不能传输数据。
- 检查浏览器:确保使用最新版的Google Chrome或基于Chromium的Edge浏览器,其他浏览器可能不支持WebUSB。
- 检查系统权限(Linux):回顾并确认已正确执行了
udev规则配置步骤。
6.3 调整摄像头与分拣头位置
连接成功后,将组装好的分拣器放置在笔记本电脑摄像头前方。调整位置,使得分拣器的顶部“分拣槽”完全处于摄像头视野中心,并且清晰对焦。一个常见的细节问题:如果分拣头(纸模型)底部过长,可能会垂下来挡住摄像头视野。这时就需要用剪刀对图纸底部进行适当修剪,确保摄像头能无遮挡地看到分拣槽的整个区域,特别是槽的底部,因为那里是物体即将被识别的位置。
6.4 训练你的第一个分类模型
现在进入最有趣的“教学”环节。
- 打开Teachable Machine图像项目:在新的浏览器标签页中打开Teachable Machine网站,选择“图像项目”。
- 设置类别:默认有两个类别,我们将第一个重命名为你的第一个物体名,例如“红豆”。点击“添加一个类别”,创建第二个并命名为“绿豆”。强烈建议再添加第三个类别,命名为“空”或“背景”,用于拍摄没有任何物体的分拣槽画面。这能显著提高模型区分“有物体”和“无物体”状态的能力,减少误触发。
- 采集训练样本:
- 确保p5.js页面中的分拣器仍在规律摇摆。
- 在Teachable Machine页面,选中“红豆”类别,点击“Webcam”按钮。将几颗红豆放入分拣槽。
- 关键技巧:不要只静止地拍摄。在按住“Hold to Record”按钮的几秒钟内,可以轻微晃动分拣器底座,或者让红豆在槽内因摆动而滚动。这样可以采集到物体在不同位置、不同角度的画面,模拟真实分拣时的动态情况,让模型更鲁棒。每个类别采集30-50张图片为宜。
- 同理,完成“绿豆”和“空”类别的样本采集。
- 训练模型:点击“Train Model”按钮。训练过程在本地浏览器中进行,速度很快,通常几十秒到一分钟即可完成。你可以看到损失值(Loss)和准确率(Accuracy)的变化曲线。
- 导出模型:训练完成后,切换到“Preview”面板测试一下。拿实物在摄像头前试试,看右侧的预测概率条是否反应正确。满意后,点击“Export Model”。在弹出窗口中,选择“Upload my model (shareable link)”选项,然后点击“Copy”按钮复制生成的云端模型链接。这个链接就是你的模型的“身份证”,p5.js脚本将通过它来加载并使用这个模型。
6.5 集成模型并开始自动分拣
回到p5.js的控制界面,你应该能找到一個输入框,旁边标注着“Paste Model URL”或类似文字。将刚才复制的链接粘贴进去,然后点击“Load Model”或“Update Model”。
加载成功后,整个系统就进入了就绪状态。现在,你可以抓一把混合的红豆和绿豆,慢慢地倒入分拣器的顶部漏斗。你会看到:
- 物体因分拣头摆动而单颗落入识别槽。
- 网页上的视频预览区,识别框内的画面旁会实时显示出“红豆:95%”、“绿豆:2%”、“空:3%”这样的预测结果。
- 一旦某个类别的置信度超过预设阈值(例如80%),p5.js会立即通过WebUSB向Arduino发送对应的指令。
- Arduino驱动伺服电机快速转动,使分拣头倾斜,物体滑入对应的收集盒中。
- 分拣头迅速归位,准备识别下一个物体。
至此,一个完整的、基于视觉的微型自动分拣系统就开始工作了。你可以观察它的分拣准确率,并根据情况回到Teachable Machine,补充一些分错的样本,重新训练模型,体验机器学习中“迭代优化”的过程。
7. 常见问题、排查技巧与进阶优化
7.1 硬件与连接问题排查表
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 伺服电机不转动 | 1. 电源未接通或接线错误 2. 信号线接触不良 3. 代码中引脚定义错误 |
1. 检查5V和GND是否接反,用万用表测量电机接口是否有5V电压。 2. 重新插拔信号线,或换用其他数字引脚(需同步修改代码)。 3. 核对 sorter_sketch.ino中Servo.attach()函数使用的引脚号。 |
| 电机发热严重或抖动无力 | 1. 机械结构卡死,负载过大 2. 电源供电不足 |
1. 断开电机与纸结构的连接,空载测试电机是否运转顺畅。检查纸结构摆动是否受阻。 2. Arduino的5V引脚输出电流有限(约500mA)。如果电机负载重,考虑使用外部5V电源(如手机充电器)通过面包板单独为电机供电,务必共地。 |
| WebUSB连接失败 | 1. 浏览器不支持或权限未开 2. 固件未修改USB版本号 3. 操作系统驱动/权限问题 |
1. 确认使用Chrome/Edge,并在设置中允许网站使用USB。 2. 确认已修改 USBCore.h并重新编译上传固件。3. (Linux)检查用户是否在 plugdev组,udev规则是否正确。 |
| 摄像头无法被p5.js访问 | 1. 浏览器摄像头权限被禁止 2. 其他程序占用了摄像头 |
1. 检查浏览器地址栏旁的摄像头图标,点击并允许该网站使用摄像头。 2. 关闭微信、QQ、视频会议等可能占用摄像头的软件。 |
7.2 软件与识别问题排查
问题:p5.js页面加载后,视频黑屏或无法显示。
排查:首先检查浏览器控制台(F12打开开发者工具,查看Console标签页)。如果有关于getUserMedia的错误,通常是权限问题。尝试在浏览器设置中清除该网站的摄像头权限后重新授权。也可能是HTTPS问题,确保你通过https://访问p5.js编辑器,本地http://环境在某些浏览器中可能无法调用摄像头。
问题:模型加载失败或识别结果一直为“空”。 排查:
- 检查模型链接:确认从Teachable Machine复制的链接已正确粘贴,没有头尾空格。
- 检查识别区域:在p5.js界面中,确认绿色的识别框是否准确覆盖了分拣槽区域。物体必须落入这个框内才会被送入模型。
- 检查训练样本:回到Teachable Machine,在“Preview”面板测试。如果在这里都无法正确识别,说明模型训练有问题。可能的原因包括:训练样本数量太少、样本多样性不足(如所有“红豆”都在同一位置)、或者两个待分拣物体本身视觉差异太小。需要补充更多样化的训练图片重新训练。
问题:识别速度慢,导致分拣不及时。 优化:
- 降低输入分辨率:在Teachable Machine训练时,可以选择更小的输入图像尺寸(如224x224而不是299x299)。在p5.js代码中,也可以尝试缩小从视频中截取ROI区域的大小。
- 简化模型:在Teachable Machine的“Advanced”设置中,可以降低训练周期(Epochs)或选择更小的模型架构(如果有选项),这会在轻微牺牲准确率的情况下提升推理速度。
- 优化代码逻辑:检查p5.js的
draw()函数(主循环)。确保只在必要时进行模型预测(例如,当检测到有物体进入时),而不是每一帧都预测。
7.3 项目进阶优化思路
当你成功实现基础功能后,可以从以下几个方面进行深化和扩展,这会让项目更具挑战性和学习价值:
-
多类别分拣:Teachable Machine支持超过3个类别。你可以设计一个有三个或四个出口的分拣器(需要更复杂的机械结构,如旋转平台),训练模型识别更多种类的物体,如不同颜色的积木、不同形状的纽扣等。
-
本地化部署:目前模型推理依赖于网络(云端链接)。你可以尝试使用TensorFlow.js将训练好的模型完全下载到本地,并集成到p5.js项目中。这样即使没有网络,分拣器也能正常工作。这涉及到从Teachable Machine导出“TensorFlow.js”格式的模型,并学习使用
tfjs库进行加载和推理。 -
加入反馈机制:让系统更智能。例如,在分拣出口安装一个光电传感器或触碰传感器。当Arduino驱动分拣动作后,等待传感器确认“物体已落下”的信号,再返回就绪状态。这能防止因物体卡住而导致的误判。
-
数据记录与分析:让p5.js将每一次分拣的结果(时间、物体类别、置信度)记录下来,甚至可以保存分拣错误的图片。这些数据对于分析模型在何种情况下会失效、进而指导你改进训练集非常有帮助。
这个微型分拣器项目,就像一扇窗,让我们窥见了智能硬件与机器学习结合的巨大潜力。它剥离了复杂的外壳,展示了从感知(摄像头)到决策(模型)再到执行(电机)的完整闭环。我在多次演示这个项目时发现,最让观众感到惊奇的,往往不是技术的复杂度,而是“教”机器这个过程是如此的自然和直观。它打破了AI的神秘感,让你亲手创造了“智能”。如果你在制作过程中遇到了机械上的小麻烦,或者模型第一次训练时准确率不高,请不要气馁,这正是实践的一部分——调试、迭代、优化,直到它按照你的指令可靠地工作,那一刻的满足感,正是创客精神的精髓所在。