当前位置: 首页 > news >正文

基于Arduino与TCS34725的糖果颜色分拣机:从硬件搭建到算法实现

1. 项目概述与设计思路

最近在整理工作室的物料时,翻出一堆五颜六色的糖果,突发奇想,能不能做个机器把它们按颜色自动分好类?这听起来像是工厂流水线上的高级设备,但用我们手头常见的开源硬件和材料,其实完全可以自己动手实现。这个基于Arduino的糖果分拣机项目,就是一个将颜色识别、机械控制和简单编程融为一体的绝佳实践。它不只是一个有趣的玩具,更是一个微缩版的工业自动化系统原型,能让你直观地理解传感器如何“看见”世界,控制器如何“思考”决策,以及执行器如何“动手”完成任务。

整个机器的核心逻辑非常清晰:一个料斗存放混合的糖果,一个带凹槽的转轮每次只允许一颗糖果通过,使其滑落到颜色传感器的检测区域。传感器读取糖果表面的RGB值后,Arduino控制器将这些数值与预先“学习”好的颜色样本库进行比对,判断出糖果的颜色类别。最后,控制器命令底部的舵机旋转特定角度,将连接在舵机上的滑槽出口对准对应颜色的收集盒,糖果便落入正确的“归宿”。整个过程从投料到分拣完成,完全自动化,看着糖果们井然有序地各归其位,成就感十足。

这个项目适合所有对硬件、编程和自动化感兴趣的朋友,无论你是刚接触Arduino的新手,还是想找个综合项目练手的老玩家。它所需的材料都很常见:一块Arduino Nano(或其他型号亦可),两个舵机(一个360度连续旋转用于推进,一个180度标准舵机用于控制滑槽方向),一个TCS34725颜色传感器模块,一些硬纸板、胶水、导线和电池。工具方面,剪刀、美工刀、尺子、电烙铁就基本够用了。通过亲手切割、组装、焊接和编程,你不仅能收获一台能干的“小助手”,更能深入掌握闭环控制系统的基本构建方法。

2. 核心硬件选型与原理剖析

2.1 控制核心:为什么是Arduino Nano?

在这个项目中,我选择了Arduino Nano作为大脑。原因很简单:够用、小巧、便宜。Nano板载了ATmega328P微控制器,拥有足够的数字和模拟I/O引脚来连接我们的传感器和舵机。其核心任务是循环执行以下逻辑:监听料斗底部的微动开关(用于检测转轮是否转到送糖位置),触发颜色传感器读数,运行颜色匹配算法,然后向两个舵机发出相应的控制指令。虽然UNO或Mega等板子也能胜任,但Nano的紧凑尺寸更适合嵌入到这个纸板结构的机身中,不会占用过多空间。它的另一个优势是可以通过USB直接供电和编程,调试非常方便。

注意:购买Arduino Nano时,需要注意其处理器版本。较新的Nano通常使用ATmega328P(新版Bootloader),而一些老库存或仿制版可能用的是ATmega328P(老版Bootloader)。在Arduino IDE中上传代码前,务必在“工具”->“处理器”菜单中正确选择,否则会导致上传失败。本项目代码兼容两者,但选择错误会报错。

2.2 “眼睛”的奥秘:TCS34725颜色传感器

机器如何“看见”颜色?靠的就是这颗TCS34725传感器。它可不是简单的光敏电阻,而是一个集成了RGB滤光片阵列和光电二极管的光数字转换器。简单来说,传感器内部有一个白光LED(用于照明)和一套滤镜系统,可以将入射光分离成红、绿、蓝三个通道。每个通道的光强度被转换为数字信号,通过I2C接口输出给Arduino。

其工作流程是:当一颗糖果停在传感器下方时,传感器自身的LED照亮糖果表面,反射光进入传感器。内部的红色、绿色、蓝色滤镜分别只允许对应波长的光通过,照射到各自的光电二极管上。光越强,产生的电流越大,经过模数转换后,我们就得到了三个0-65535之间的数值,分别代表红、绿、蓝光的强度。一颗红色糖果会反射大量的红光,吸收大部分绿光和蓝光,因此其R值会远高于G和B值。这就是我们区分颜色的根本依据。

选择TCS34725而非更廉价的RGB传感器,是因为它集成了红外阻隔滤镜和光源,受环境光干扰小,且提供了稳定的数字接口,精度和一致性远优于模拟输出的传感器,这对于需要准确分拣的项目至关重要。

2.3 “手臂”与“传送带”:伺服电机的分工

系统用了两个舵机,它们扮演了不同的角色:

  1. 360度连续旋转舵机:安装在料斗下方,驱动带凹槽的转轮。它不同于常见的180度舵机,无法控制精确角度,但可以控制旋转速度和方向。在这里,我们让它以恒定速度单向旋转,其功能就像传送带,每次旋转将凹槽对准料斗出口,带出一颗糖果,然后旋转固定角度,将糖果运送到传感器下方。其控制信号(PWM脉冲宽度)决定了转速。
  2. 180度标准舵机:安装在分拣滑槽的底部,用于控制滑槽的出口方向。它可以根据接收到的脉冲信号精确地旋转到0-180度之间的任意位置。我们预先定义好五个角度,分别对应五个收集盒。当颜色识别完成后,Arduino就发送指令让这个舵机转到相应角度,滑槽出口便对准了目标收集盒。

实操心得:购买舵机时,务必分清“360度连续旋转”和“180度标准”舵机。它们外观相似,但内部结构和控制逻辑不同,不能混用或代用。连续旋转舵机通常由玩具遥控车改装而来,或者有明确标识。如果误用,可能导致机械结构无法正常工作。

2.4 结构的灵魂:硬纸板机械设计

用3mm硬纸板作为主体结构材料,是个低成本、易加工且充满创意的选择。设计图纸(模板)精确规划了每一个支撑板、料斗斜面、转轮、滑槽和收集盒的尺寸与卡口。这种设计使得整个机器无需螺丝,仅靠胶水和卡槽就能实现稳固组装。关键的设计亮点在于:

  • 料斗与转轮的配合:料斗底部的开口宽度只允许一颗糖果通过,转轮上的凹槽尺寸与糖果匹配,确保了每次只运送一颗,避免了堵塞。
  • 机械式位置检测:在转轮轴上设计了一个带有凸起和凹槽的圆盘,配合一个微动开关(限位开关)。当转轮旋转,凸起压下开关臂时,开关闭合(导通);当转到凹槽处时,开关弹起(断开)。这个“咔哒”声对应的电信号变化,就是Arduino判断“糖果已运送到位,可以开始检测”的精确时机。这种纯硬件的位置反馈,比用传感器或复杂算法计算步进更可靠、成本更低。
  • 模块化组装:整个机器被分解为料斗模块、转轮模块、基座模块、滑槽模块和收集盒模块。分步组装降低了难度,也便于后期调试和维护某个特定部分。

3. 详细组装步骤与机械调校

3.1 材料准备与模板处理

首先,你需要从项目网站下载并打印六张A4大小的零件模板。建议使用稍厚的纸张(如120克铜版纸)打印,这样粘贴到纸板上后,切割线更清晰。将打印好的模板用固体胶或喷胶均匀地粘贴到3mm厚的硬纸板上(例如荷兰板或模型卡纸),确保粘贴平整无气泡,然后放置重物压平,等待胶水完全干透。

接下来是最需要耐心的切割环节。使用锋利的美工刀和钢尺,沿着模板上的实线仔细切割出每一个零件。对于内部的镂空部分(模板上通常用阴影或虚线标出),先用刀尖戳穿,再慢慢沿边线切割。安全第一:切割时务必使用切割垫,刀片要锋利(钝刀更容易打滑伤人),推动方向要远离身体。对于曲线或细小部分,可以配合使用剪刀。精度是关键,因为这是一个机械装置,零件间的配合公差很小,切割粗糙会导致组装困难或机构运行不畅。

3.2 核心模块:料斗与送料机构的搭建

  1. 组装料斗:找到编号为1、2、3的零件。将两块侧板(编号1)与底板(编号2)粘合,形成一个三面围合的漏斗状结构。然后将两块导流板(编号3)粘在底板内侧的出口处,形成一个更窄的通道,确保糖果能有序滑向转轮。
  2. 制作送料转轮:这是核心运动部件。将两个带凹槽的圆盘(编号27)分别粘在中心驱动盘(编号28)的两侧,形成一个“三明治”结构。关键点:务必在胶水干透前,反复校准,确保三个圆盘上的凹槽完全对齐,否则会导致糖果卡住。
  3. 安装舵机联轴器:从360度舵机附带的配件包中,找到十字形的舵盘(舵机臂)。在转轮组件的中心位置(其中一侧),用美工刀小心地挖出一个与舵盘形状、厚度匹配的凹槽,然后将舵盘用胶水嵌入并固定。这相当于把舵机的输出轴与转轮直接连接起来。
  4. 制作转轴:在转轮组件的另一侧中心,垂直粘上一段约15mm长的棉签棒或竹签作为转轴。这根轴将插入料斗底部的轴承孔(一个预先钻好的小孔),起到支撑和定位的作用。粘合时必须保证转轴与转轮平面绝对垂直,否则旋转时会晃动甚至卡死。
  5. 整合料斗与转轮:将料斗组件与两个支撑腿(编号4)粘合。然后将组装好的转轮组件,从下方插入料斗。先将转轴插入料斗底部的孔中,再将舵盘与已固定在料斗支架上的360度舵机输出轴对齐并粘合。此时,手动旋转转轮,应该能顺畅转动,并且凹槽能依次经过料斗出口下方。

3.3 分拣滑槽与基座的构建

  1. 搭建分拣滑槽:这个部件负责引导糖果落入正确的收集盒。它本质上是一个可以左右摆动的漏斗。将三角形侧板(编号10等)与底板(编号11, 12)粘合,形成滑槽主体。最后,在滑槽底部的方形区域中心,粘上一个标准舵机的舵盘。这个舵盘将与基座上的180度舵机连接。
  2. 组装机器基座:基座是整个机器的骨架和电路板安装平台。按照模板顺序,依次粘合侧板(编号19)、前面板(编号16)、中间隔板(编号17, 18)和顶板(编号15)。特别注意前面板(编号16)上有一个用黑色方块标记的区域,那是预留安装180度舵机的位置。所有粘合都要确保角度方正,结构稳固。
  3. 安装180度舵机与连接滑槽:将180度舵机用胶水固定在基座前面板的标记位置上。然后将滑槽组件拿起,将其底部的舵盘与基座上舵机的输出轴对齐并粘合。此时,给舵机通电(通过后续电路),它应该能带动整个滑槽平滑地左右摆动。
  4. 整合上下部分:将已经组装好的“料斗-转轮”上半部分总成,与“基座-滑槽”下半部分总成对齐并粘合。确保转轮出口能对准基座上通向滑槽的入口。可以在接缝处内部额外粘贴一些加强筋。
  5. 安装颜色传感器支架与传感器:将一块带有方形开口的顶板(编号6)轻轻架在料斗两侧的支架上,这个开口正对转轮上糖果的停留位置。重要提示:这块板不能压得太紧,不能给转轮轴施加任何额外的压力或摩擦力,必须保证转轮能自由转动。然后将TCS34725颜色传感器模块用热熔胶固定在这块顶板的下方,确保其感光窗口精确对准那个方形开口。固定时,最好用一颗糖果放在检测位做参照,调整传感器高度,使其距离糖果表面约5-10mm,并确保传感器自带的LED能均匀照亮糖果。

3.4 电路连接与布线技巧

电路的连接逻辑清晰,但布线整洁与否直接影响可靠性和美观度。

  1. 颜色传感器接线:TCS34725使用I2C通信,需要连接4根线。建议使用不同颜色的排线,长度约30-35cm。焊接顺序:传感器VCC -> Arduino 5V;GND -> Arduino GND;SDA -> Arduino A4;SCL -> Arduino A5。
  2. 微动开关接线:这是一个常开(NO)型开关。焊接两根线(约25cm和12cm)到开关的中脚和常开端。较长的线(中脚)连接至Arduino的数字引脚8(D8)。
  3. 舵机接线改造与供电:两个舵机的标准三线(红-正极,棕-负极,橙-信号)需要改造。关键步骤:剪掉两个舵机插头上的红线和棕线,只保留橙线(信号线)和插头。然后,为每个舵机焊接上新的、更长的红线和棕线(长约15-20cm)。这样做的目的是将动力电(给舵机供电)与控制信号电(来自Arduino)在物理接插件上分离,避免大电流通过Arduino板载稳压器,导致其过热或重启。
  4. 集中供电与接地:准备一个4节AA电池盒(输出6V)。使用两个接线端子(或面包板专用电源模块)来汇总电源。
    • 第一个端子(正极):连接电池盒的红线(正极)、360度舵机的红线、180度舵机的红线。
    • 第二个端子(负极/地):连接电池盒的黑线(负极)、两个舵机的棕线、微动开关的另一根线(来自常开端)、以及一根从Arduino的GND引脚引出的线(约14cm)。这一步至关重要,它确保了整个系统共地,所有逻辑参考电位一致。
  5. 信号线连接:将360度舵机的橙线(信号)接到Arduino的D5引脚,180度舵机的橙线接到D6引脚。
  6. 布线整理:用扎带或胶带将导线捆扎整齐,沿着纸板结构内部走线,避免缠绕到运动部件。将电池盒和Arduino Nano用胶带或尼龙扎带固定在基座内部。

完整的接线逻辑可以总结为下表,供组装时核对:

组件引脚/线色连接到 Arduino说明
颜色传感器VCC (红)5V供电
GND (黑)GND接地
SDA (蓝/绿)A4I2C数据线
SCL (紫/白)A5I2C时钟线
微动开关公共端 (COM)D8检测转轮位置
常开端 (NO)公共地端子与所有GND汇接
360°舵机信号线 (橙)D5控制转轮旋转
电源正极 (红)正极电源端子接电池盒正极
电源负极 (棕)公共地端子接电池盒负极
180°舵机信号线 (橙)D6控制滑槽方向
电源正极 (红)正极电源端子接电池盒正极
电源负极 (棕)公共地端子接电池盒负极
电池盒正极 (红)正极电源端子为两个舵机供电
负极 (黑)公共地端子系统总接地
Arduino GND-公共地端子确保逻辑地一致

4. 软件编程与核心算法实现

4.1 开发环境搭建与库安装

在电脑上安装Arduino IDE(建议使用较新版本)。用USB线连接Arduino Nano。在IDE中,选择板卡类型为“Arduino Nano”,处理器根据你的板子选择“ATmega328P”或“ATmega328P (Old Bootloader)”,端口选择对应的COM口。

本项目需要依赖一个重要的库:Adafruit TCS34725。这个库封装了与传感器通信的复杂指令,让我们用简单的函数就能读取RGB值。安装方法:在IDE中点击“工具”->“管理库…”,在搜索框中输入“TCS34725”,找到“Adafruit TCS34725”并安装。通常它会提示你同时安装依赖的“Adafruit BusIO”库,一并确认安装即可。

4.2 程序框架与主循环逻辑

程序的整体框架围绕一个状态机展开,核心逻辑在loop()函数中循环执行。以下是简化后的伪代码逻辑流:

#include <Wire.h> #include <Adafruit_TCS34725.h> #include <Servo.h> // 定义引脚、常量、全局变量、颜色样本数组等 void setup() { // 初始化串口通信(用于调试和校准) // 初始化颜色传感器 // 初始化两个舵机,并移动到初始位置 // 设置微动开关引脚为输入模式 // 如果处于校准模式,打印提示信息 } void loop() { if (系统处于校准模式) { 运行校准流程(); // 通过串口指令控制 } else { 运行自动分拣流程(); } } void 运行自动分拣流程() { 1. 等待微动开关触发(表示转轮已将糖果送到检测位); 2. 停止转轮舵机(短暂停顿,让糖果稳定); 3. 打开传感器LED,读取当前的RGB值; 4. 关闭传感器LED(省电); 5. 调用颜色匹配函数,将读取的RGB值与预存样本比较,判断颜色; 6. 根据判断结果,计算180度舵机需要转动的目标角度; 7. 驱动180度舵机转到目标角度; 8. 延迟一小段时间,确保糖果已滑落; 9. 驱动180度舵机回到中间(或下一个)待命位置; 10. 重新启动转轮舵机,运送下一颗糖果。 }

4.3 颜色识别的核心:校准与匹配算法

这是项目的软件核心,也是最体现工程思维的部分。颜色传感器读出的RGB值是绝对的物理量,但受环境光、传感器个体差异、糖果表面反光特性、安装距离等多种因素影响,直接使用固定阈值判断极不可靠。因此,我们必须为每一台亲手制作的机器进行“校准”——即建立它自己的颜色数据库。

校准流程详解:

  1. 在代码中,将一个名为calibrating的常量设为1,然后上传代码。此时机器进入校准模式。
  2. 在Arduino IDE中打开串口监视器,设置波特率为115200。
  3. 在料斗中放入多颗同一种颜色的糖果(例如,全部放绿色)。
  4. 在串口监视器的发送框内,输入任意一个字符(如‘g’)并发送。这个指令会触发机器转动转轮,送一颗绿色糖果到传感器下,然后停止。
  5. 观察传感器位置,确保糖果正好停在传感器正下方。如果没有,需要调整代码中一个叫wheelOverRun的常量。这个值代表微动开关触发后,转轮还需要额外转动的“惯性”角度(以舵机运行时间毫秒数表示)。如果糖果冲过头了,就减小这个值;如果没到位,就增大它。调整后需重新上传代码测试,直到糖果每次都能准确停在检测位。
  6. 糖果到位后,串口监视器会打印出一行数据,例如R: 12560, G: 9830, B: 4021。这就是这颗绿色糖果在当前光照和传感器下的RGB读数。记录下这组数据。
  7. 重复步骤4-6,总共获取5颗绿色糖果的读数。
  8. 计算这5组数据的R、G、B各自的平均值。例如,绿色糖果的平均值可能是R_avg_green, G_avg_green, B_avg_green
  9. 清空料斗,换上下一种颜色(如红色)的糖果,重复步骤3-8,直到获得所有5种颜色(红、橙、黄、绿、紫)以及“空载”(没有糖果)状态下的RGB平均值。

颜色匹配算法:获得所有颜色的样本平均值后,将calibrating常量改为0,并把这些平均值填入代码中一个预定义的二维数组里。匹配算法通常采用欧几里得距离法。 当一颗未知糖果被检测时,传感器读出其RGB值(R_curr, G_curr, B_curr)。程序会计算这个值到样本库中每一个颜色平均值(R_sample, G_sample, B_sample)的“距离”:距离 = sqrt( (R_curr - R_sample)^2 + (G_curr - G_sample)^2 + (B_curr - B_sample)^2 )距离最小的那个样本颜色,就被判定为当前糖果的颜色。这种算法在三维色彩空间中找到最近的点,比简单的阈值比较要鲁棒得多。

实操心得:校准过程一定要耐心,最好在光线稳定的室内进行。每颗糖果的朝向、在凹槽中的位置都可能轻微影响读数,所以取多颗平均值能有效减少误差。记录数据时,建议使用Excel或记事本,清晰标注,避免混淆。校准完成后,这个样本数组就是你这台机器的“独家秘方”,换到另一台机器上就不准了。

4.4 舵机的精确控制

对于360度连续旋转舵机,控制其转速是通过给Servo.write()函数传递一个90附近的值来实现的。值等于90时停止,大于90向一个方向旋转(值越大越快),小于90向反方向旋转。我们需要找到一个合适的值(例如85或95),让转轮以稳定、合适的速度转动。

对于180度舵机,控制其角度就直观得多。假设我们定义了五个收集盒的位置,对应的角度分别是30度、60度、90度、120度、150度(根据实际组装情况调整)。当识别出颜色后,只需调用sortingServo.write(targetAngle),舵机就会平滑地转动到指定角度。

5. 调试、优化与问题排查实录

即使严格按照步骤组装和编程,第一台机器也难免遇到问题。以下是我在制作和调试过程中遇到的一些典型情况及其解决方法,希望能帮你少走弯路。

5.1 机械部分常见问题

  1. 问题:转轮卡住,不转动或转动费力。

    • 排查:首先手动轻轻拨动转轮,感受阻力。检查转轴是否与纸板孔壁发生摩擦。检查舵机舵盘与转轮的粘合处是否对齐,有无胶水溢出导致粘连。检查整个转轮组件在旋转时,是否与周围的料斗壁或传感器支架发生刮擦。
    • 解决:重新调整转轴,确保其垂直且居中。用美工刀小心修整任何可能产生干涉的纸板边缘。确保舵机固定牢固,没有松动。如果阻力来自舵机本身,尝试给舵机单独供电(6V),检查其空载时是否转动顺畅。
  2. 问题:糖果无法顺利从料斗进入转轮凹槽,或者一次掉进去多颗。

    • 排查:检查料斗出口的宽度是否只比一颗糖果略宽。检查转轮凹槽的深度和形状是否与糖果匹配。
    • 解决:可以轻微调整料斗导流板(编号3)的角度,使其形成一个更平滑的导向。如果糖果堆积,可以适当拍打或倾斜机器,或者考虑在料斗内部增加一个轻柔的振动机构(如用一个小型振动电机)。
  3. 问题:微动开关检测不灵敏或始终触发/不触发。

    • 排查:手动旋转转轮,观察开关的滚轮是否能被转轮上的凸起可靠地压下和弹起。用万用表通断档,在开关动作时测量其两端电阻变化。
    • 解决:调整微动开关的安装位置和角度,确保凸起能完全压下滚轮,而凹槽又能让滚轮完全弹起。开关的固定一定要牢固,避免在长期使用后移位。

5.2 电气与传感器部分常见问题

  1. 问题:颜色传感器读数不稳定,或始终为0。

    • 排查:首先检查I2C接线(VCC, GND, SDA, SCL)是否正确、牢固。在setup()函数中初始化传感器后,可以通过串口打印传感器是否成功初始化的信息。用手在传感器前晃动,观察读数是否有变化。
    • 解决:确保传感器供电正常(5V)。检查传感器上的LED是否亮起(在读数时会亮)。尝试在代码中增加读取之间的延迟,或调整传感器的积分时间(tcs.setIntegrationTime())来适应环境光。最根本的,是确保传感器正对检测区域,且安装稳固,没有遮挡。
  2. 问题:舵机不转动,或只抖动不动作。

    • 排查:这是最常遇到的问题。首先,确认供电!用万用表测量给舵机供电的电池盒电压,确保不低于5V(4节新AA电池应在6V左右)。检查正负极接线端子是否接牢。然后,检查信号线是否接到了正确的数字引脚,且代码中Servo对象关联的引脚号是否正确。
    • 解决:舵机耗电大,务必使用独立的电池组供电,切勿试图从Arduino的5V引脚取电驱动舵机,这必然导致Arduino重启或舵机无力。如果使用电池盒,确保电池电量充足。对于180度舵机,检查代码中给的角度值是否在0-180之间。
  3. 问题:系统运行时Arduino意外复位。

    • 排查:几乎肯定是电源问题。当两个舵机同时启动或堵转时,会产生很大的瞬时电流,导致电池电压瞬间跌落,低于Arduino Nano的工作电压下限,从而复位。
    • 解决:在电池盒两端并联一个大容量电容(如1000uF 16V),可以起到缓冲作用,吸收电流尖峰。使用全新的碱性电池或可充电镍氢电池。优化代码,避免两个舵机同时动作(例如,在转动滑槽舵机时,停止送料舵机)。

5.3 软件与逻辑问题

  1. 问题:颜色识别错误率高,经常分错。

    • 排查:回顾校准过程。检查校准时光线条件与现在运行时光线是否一致(避免阳光直射或强阴影)。检查糖果是否每次都精确停在传感器正下方(调整wheelOverRun值)。在自动分拣模式下,打开串口监视器,观察每次识别时打印出的RGB原始值和匹配结果,看它是否与你预期接近。
    • 解决:重新进行精细校准。确保取平均值时使用了足够多的样本(5-10颗)。可以尝试在算法中引入“空载”状态的判断,如果RGB值与“空载”样本太接近,则判定为无糖果,跳过此次分拣,避免误触发。也可以尝试更复杂的色彩空间,如将RGB转换为HSV,然后主要比较色相(Hue)值,这对光照强度变化更不敏感。
  2. 问题:分拣节奏混乱,糖果在滑槽中堆积。

    • 排查:检查各个动作之间的延时是否合理。例如,颜色读取后,是否给了舵机足够的时间转到指定角度?是否等待了足够时间让糖果滑落,再将滑槽移回?
    • 解决:在代码中增加适当的delay()。更好的方法是使用非阻塞的定时,例如millis()函数来管理状态和时间,这样整个系统响应会更流畅。确保滑槽内部光滑,可以用透明胶带在内壁贴一层,减少摩擦。

完成所有调试后,你就可以享受自动化分拣的乐趣了。抓一把混合的糖果倒进料斗,机器便会不知疲倦地开始工作,伴随着舵机的嗡嗡声和糖果落入盒中的清脆声响,不同颜色的糖果被迅速归位。这个项目从设计、切割、组装、焊接、编程到调试,涵盖了创客项目的完整流程。它不仅仅是一台分拣机,更是一个关于闭环控制、传感器融合和机电一体化的生动课堂。

http://www.jsqmd.com/news/922929/

相关文章:

  • 青海路由心国际旅行社发布对外咨询与微信联系渠道:兰兰领队15297212390 - 行业深度观察
  • 保姆级教程:在Ubuntu 20.04上从零搭建OSTrack目标跟踪环境(含libGL.so.1等常见报错解决)
  • Navicat重置终极指南:3种高效方法实现Navicat无限试用
  • 株洲闲置名表变现哪家可信?4家门店探店实测 正规渠道选这些不踩坑 - 生活测评小能手
  • Arduino蓝牙遥控小车制作:从电机驱动到手机控制全解析
  • 终极宽屏优化:让经典植物大战僵尸完美适配现代显示器
  • 树莓派笔记本改造:SMBus电池管理与Max1873/MP26123充电方案详解
  • Ctool深度解析:一站式开发者工具集的架构设计与加密解密实战指南
  • 硬核盘点!2026AI写作辅助平台大盘点(覆盖 99% 毕业生论文需求)
  • 别再手动分区了!用targetcli在CentOS 7上快速配置iSCSI共享存储(附完整命令清单)
  • 终极窗口控制神器:Simple Runtime Window Editor让你轻松突破游戏分辨率限制
  • Mac鼠标平滑滚动终极指南:如何用Mos实现触控板般的丝滑体验
  • Layerdivider终极指南:5分钟学会将图片自动分层为专业PSD文件
  • Illustrator画板同步缩放脚本:artboardsResizeWithObjects终极使用指南
  • 如何免费激活Cursor Pro:3步实现AI编程工具无限使用方案
  • AC偏置技术揭秘:从磁滞回线到磁带录音机的工程实践
  • 用libGDX和Java 11从零开始,5分钟搞定你的第一个跨平台小游戏(附完整源码)
  • Boss-Key终极指南:一键隐藏Windows窗口的完整隐私保护解决方案
  • 保姆级教程:在Windows 10/11上手动配置MySQL 5.7.44(附my.ini文件详解)
  • 艾尔登法环帧率解锁终极指南:3步轻松突破60FPS限制
  • 基于Arduino与光敏电阻的智能提醒灯DIY教程:从原理到实践
  • UE5独立游戏开发避坑:为什么你的多语言UI切换总失败?从独立进程测试到打包配置的完整流程
  • Qwen3.7-Max:当Agent成为新范式,我们站在了AI应用的拐点
  • 2026 广州黄埔区搬运公司收费标准 无隐形消费实测 - 从来都是英雄出少年
  • 专业级抖音批量下载工具实战指南:7大特性深度解析与高效配置技巧
  • 程序员、自由职业者真的没活路了吗?
  • 终极Windows和Office激活方案:KMS智能激活工具完整指南
  • Steam游戏自动破解终极指南:三步告别DRM限制困扰
  • 深度解析ide-eval-resetter:JetBrains IDE试用期重置技术实现
  • 【用呼吸重构创造价值关系——QiLink生态】