基于Arduino与PWM控制的自动糖果发射器:从电机驱动到状态机编程 1. 项目概述从零打造一台会“发射”糖果的趣味机器如果你对Arduino编程和电机控制感兴趣但又觉得单纯的LED闪烁或舵机摆动有些乏味那么这个项目绝对能点燃你的创作热情。今天我们要做的是一个融合了机械结构、电子控制和一点“恶作剧”趣味的自动糖果发射器。它的核心目标很简单当你按下按钮机器会通过一个巧妙的机械装置将一颗糖果比如彩虹糖或MMs豆精准地“发射”出去而不是简单地掉落。这听起来像是个玩具但其中涉及的脉冲宽度调制PWM伺服控制、直流电机驱动、状态机编程以及简单的机械传动设计正是许多工业自动化设备的微型缩影。我选择这个项目作为教学案例是因为它完美地将嵌入式开发的核心技能包裹在一个极具趣味性的外壳里。你需要考虑如何用Arduino Uno的有限I/O口协调多个执行器一个伺服电机和两个齿轮电机如何设计一个稳定可靠的机械结构来引导和加速糖果以及如何编写逻辑清晰的代码来响应按钮触发并执行一系列连贯的动作。无论你是刚接触Arduino的新手想跨越面包板实验的阶段还是有一定经验的创客希望挑战一个更综合的项目这个糖果发射器都能提供从电路连接、结构搭建到代码调试的完整实践路径。整个项目我们会使用非常亲民的材料核心是SparkFun的入门套件或类似组件结构主体则用乐高积木、硬纸板和冰棒棍来搭建传动部件可能需要3D打印。成本可控过程充满动手乐趣最终成果不仅能作为学习成果展示更是一个能实实在在和朋友互动的趣味装置。下面我们就来一步步拆解看看如何把一堆零件变成一台听话的“糖果炮台”。2. 核心组件选型与功能解析在开始动手之前我们必须清楚地了解每一个核心部件的作用以及为什么选择它。正确的选型是项目成功的一半盲目堆砌元件只会导致后续调试困难重重。2.1 控制大脑Arduino Uno R3为什么是Arduino Uno对于此类中小型创客项目Arduino Uno几乎是默认选择。它基于ATmega328P微控制器拥有14个数字I/O引脚其中6个可用于PWM输出和6个模拟输入引脚性能足以应对我们项目中伺服电机控制、电机驱动和按钮检测的需求。其开源生态庞大有海量的库和教程支持极大地降低了开发门槛。相比于更基础的NanoUno的板载稳压器和标准接口使其在原型阶段更加稳定和易于连接相比于更强大的MegaUno的成本和尺寸又更具优势。注意务必确认你拿到的是“R3 SMD”版本或更新的型号。早期的一些版本在USB转串口芯片或稳压器上有所不同可能导致驱动或供电问题。R3是目前最通用和稳定的版本。2.2 执行机构伺服电机与齿轮电机这是本项目运动控制的核心两者分工明确。伺服电机Servo Motor我们用它来充当糖果的定量释放机构。伺服电机的特点是可以通过PWM信号精确控制输出轴的角度通常为0-180度。在本项目中我们会将它连接到一个带有凹槽的转盘上。初始位置凹槽对准上方的糖果漏斗接收一颗糖果当收到发射指令时伺服电机旋转一个特定角度例如60度使凹槽对准下方的发射通道糖果依靠重力落下。其高精度和自锁特性在无信号时能保持位置确保了每次只释放一颗糖果这是普通直流电机无法实现的。齿轮电机Gear Motor我们用它来充当糖果的加速发射机构。你可能会疑惑为什么需要两个这里涉及一个关键设计对转轮发射。两个齿轮电机分别驱动一个轮子比如用乐高轮胎或3D打印的轮子两个轮子平行放置中间有一条细缝。当糖果从伺服电机掉落到这条细缝时两个高速反向旋转的轮子会夹住糖果并将其高速弹出从而实现“发射”效果。齿轮电机集成了减速齿轮箱在提供较大扭矩的同时降低了转速使得控制更平稳也更容易通过PWM进行调速。2.3 动力与驱动电机驱动模块与电源电机驱动模块的必要性Arduino的I/O引脚只能提供最大40mA的电流而驱动一个哪怕是小型的直流电机瞬间电流也可能达到100-200mA以上。直接连接会烧毁Arduino芯片。因此我们必须使用电机驱动模块作为“功率放大器”。它接收Arduino发出的低功率控制信号方向、速度然后从独立电源取电输出大电流来驱动电机。关于驱动模块的选型原始资料中提到使用了与套件不同的驱动模块这是实践中非常常见的情况。套件可能配的是L298N双H桥驱动模块而你可能手头有TB6612FNG或DRV8833等更现代的模块。无论哪种其核心原理相通都有控制输入端IN1, IN2, PWM连接Arduino以及电机输出端OUT1, OUT2连接电机还有独立的电机电源输入端VM。关键点在于你必须找到你所用手头模块的官方数据手册或引脚定义图并严格按照其定义接线绝不能想当然地套用教程中的引脚编号。电源方案整个系统采用双电源供电是稳健的做法。逻辑电源通过Arduino的USB口或Vin引脚提供5V用于给Arduino自身、伺服电机通常接5V和电机驱动模块的逻辑部分供电。电机电源使用4节AA电池盒6V单独为电机驱动模块的电机电源端VM供电。这可以避免电机启动和堵转时产生的大电流波动“污染”Arduino的电源导致单片机复位或程序跑飞。电池的功率足以驱动两个小型齿轮电机短时工作。2.4 结构材料乐高、纸板与3D打印件的混合使用为什么选择这种“混搭”风这完全是出于快速原型验证的考虑。乐高积木无可比拟的快速搭建和灵活调整优势。用于制作轮子的支架、传动轴支撑等需要精密对位和强度适中的部分。硬纸板与冰棒棍成本极低易于切割和粘合是制作主体框架、外壳和固定板的理想材料。多层冰棒棍用胶水叠粘可以做出非常坚固的结构。3D打印件用于解决定制化机械连接问题。例如将伺服电机舵盘连接到乐高十字轴的特殊联轴器、将齿轮电机轴连接到乐高轮胎的适配器以及那个引导糖果的独特发射轨道。这些形状特殊的零件3D打印是最佳解决方案。这种组合允许你在设计迭代时快速修改结构而不必等待漫长的机加工过程。3. 电路系统搭建与接线详解电路是项目的神经系统混乱的接线是项目失败的首要原因。我们将按照电源流和信号流的顺序清晰、模块化地完成连接。3.1 电源分配与共地这是最重要且最易出错的一步。我们的目标是建立一个清晰、无干扰的电源树。准备电源将4节AA电池装入电池盒输出约6V。这是我们的电机主电源VM。连接电机驱动模块将电池盒的正极连接到驱动模块的VM电机电源正极引脚。将电池盒的负极-连接到驱动模块的GND电机电源地引脚。同时从这个GND引脚引出一根线连接到Arduino Uno的任何一个GND引脚。这一步至关重要它建立了整个系统的“共同参考点”即共地。没有共地控制信号将无法被正确识别。连接逻辑电源电机驱动模块上通常有一个VCC或逻辑电源引脚通常是3.3V或5V。请查阅你的驱动模块手册如果它支持5V逻辑则用一根导线从Arduino的5V引脚连接到驱动模块的VCC引脚为其内部逻辑电路供电。伺服电机的供电通常直接取自Arduino的5V和GND。注意检查你的伺服电机工作电压标准舵机是4.8V-6V接5V一般没问题。如果担心电流过大可以像电机一样为其提供独立电源但信号地仍需与Arduino共地。实操心得在面包板上我习惯用红色线统一表示所有正极5V, VM用黑色线统一表示所有GND。用黄色或绿色线表示信号线PWM 数字I/O。颜色化管理能让你在调试时一眼看清电路结构快速定位问题。3.2 控制信号连接完成供电后我们连接控制信号线。下表是一个通用的连接示意请务必根据你实际使用的驱动模块引脚定义进行调整Arduino Uno 引脚连接至功能说明数字引脚 D9伺服电机信号线通常为橙色或白色通过PWM控制伺服电机角度数字引脚 D8电机驱动模块AIN1(或IN1)控制电机A第一个齿轮电机方向数字引脚 D7电机驱动模块AIN2(或IN2)控制电机A方向数字引脚 D6电机驱动模块PWMA(或PWM A)通过PWM控制电机A速度数字引脚 D4电机驱动模块BIN1(或IN3)控制电机B第二个齿轮电机方向数字引脚 D3电机驱动模块BIN2(或IN4)控制电机B方向数字引脚 D5电机驱动模块PWMB(或PWM B)通过PWM控制电机B速度数字引脚 D2按钮一端按钮另一端接GND检测发射触发信号接线详解与逻辑伺服电机仅需一根信号线。D9是Arduino Uno硬件PWM引脚之一可以产生伺服库所需的精确脉冲。齿轮电机驱动以电机A为例AIN1和AIN2是一对方向控制引脚。给AIN1高电平、AIN2低电平电机正转反之则反转同时为高或低则刹车/停止。PWMA则接收一个0-255的PWM值控制速度。电机B同理。这种接线方式给了我们完全独立的双电机控制能力。按钮连接D2和GND并在Arduino代码中启用内部上拉电阻INPUT_PULLUP。这样按钮未按下时D2读到高电平1按下时D2通过导线接地读到低电平0以此作为触发信号。3.3 最终检查与上电前清单在接通电池或USB线之前请像飞行员起飞前一样逐项检查[ ]共地检查确保Arduino的GND、驱动模块的GND、电池盒的负极全部连接在一起。[ ]电源隔离检查电机的动力电源电池盒的6V只接到了驱动模块的VM和GND绝对没有误接到Arduino的5V或任何数字引脚上。[ ]信号线检查所有连接驱动模块控制引脚的导线都来自Arduino的数字引脚而非电源引脚。[ ]机械隔离确保所有电线远离即将安装的齿轮、转轴等运动部件防止被卷入扯断。[ ]初次上电先只连接Arduino的USB线此时电机驱动模块的VM不接电池。打开串口监视器上传一个简单的程序如让伺服电机来回转动观察逻辑部分是否工作正常。确认无误后再连接电池盒为电机供电。4. 机械结构设计与组装实战电路是灵魂结构是躯体。一个稳固、可靠的机械结构是保证动作精准重复的关键。我们的目标是搭建一个从上到下包含储料漏斗、定量释放机构、导向通道、对转轮发射器的垂直系统。4.1 主体框架搭建稳固是第一位使用多层硬纸板或密集的冰棒棍搭建一个坚实的“门”字形或箱体框架。这个框架需要承担所有部件的重量和电机运行时的轻微振动。材料处理将冰棒棍用慢干型环氧树脂胶或热熔胶交叉粘合成网状板。慢干环氧树脂强度更高但需要固定和等待时间热熔胶速度快适合快速定位和补充加强。不要使用普通白胶强度完全不够。分层加固单层冰棒棍结构非常脆弱。你需要将3-4层这样的网状板叠在一起每层之间用胶粘合形成一个厚实的复合板。用这种复合板来制作立柱和横梁。确定关键安装面在框架上规划出几个关键平面顶部平面用于安装糖果漏斗和伺服电机释放机构。中部平面用于固定导向通道。底部平面用于安装两个齿轮电机及其轮子支架。这个平面的高度需要精确计算使得从导向通道落下的糖果能正好落入两个轮子之间的“发射缝”中心。踩过的坑早期我用单层纸板做支架电机一转整个机器都在“跳舞”糖果发射方向随机。后来改用三层冰棒棍复合板并在所有连接处用三角形结构加固稳定性立刻提升了一个数量级。在创客项目中在结构强度上的投入永远都是值得的。4.2 定量释放机构伺服电机与转盘这是控制“每次一颗”的关键。你需要一个3D打印的圆盘边缘有一个刚好能容纳一颗糖果的凹槽。安装伺服电机将伺服电机用螺丝或扎带牢固地固定在框架顶部平面的下方使其输出轴竖直向上。连接转盘将3D打印的转盘中心有对应伺服电机舵盘的孔用配套的螺丝紧紧固定在伺服电机的舵盘上。确保转盘水平。安装漏斗在转盘正上方用硬纸板或塑料瓶制作一个漏斗底部开口应对准转盘边缘的凹槽旋转路径。漏斗的出口要略大于一颗糖果但远小于两颗糖果防止卡住或一次掉多颗。功能测试先不装糖果编写一段测试代码让伺服电机在两个位置间往复运动位置A凹槽对准漏斗口接糖位置B凹槽对准下方的导向通道。观察转盘转动是否顺畅有无卡滞。调整代码中的角度值直到动作准确。4.3 对转轮发射机构精度与对中的挑战这是项目中最需要耐心调试的部分。目标是让两个轮子平行、对中且间隙合适。制作轮子支架使用乐高梁和销搭建两个坚固的“门”形支架。每个支架用于固定一个齿轮电机。乐高的优势在于你可以通过增减单位凸点来微调两个支架之间的距离。安装电机与轮子使用3D打印的电机轴适配器将乐高轮胎或打印的轮子牢牢固定在齿轮电机的输出轴上。然后将电机用扎带或乐高零件固定在支架上。关键点两个轮子的轴心必须在同一水平线上且轮子平面必须绝对平行。任何微小的不平行都会导致糖果被挤向一侧无法直线射出。设置轮隙两个轮子之间的间隙应略小于一颗糖果的直径。理想状态是糖果依靠重力下落时能被两个轮子轻轻“咬住”然后在旋转摩擦力的作用下被加速抛出。你可以通过调整两个乐高支架的距离来改变轮隙。确定旋转方向两个电机需要反向旋转这样它们接触糖果的切线速度方向都朝前形成合力。假设从发射方向看左边的轮子逆时针转右边的轮子顺时针转。这需要在代码中设置两个电机的方向控制引脚为相反的逻辑。4.4 导向通道与总装导向通道的作用是引导从伺服转盘掉落的糖果准确落入两个轮子之间的缝隙。通道选择原始设计使用了一个3D打印的螺旋或斜面通道。如果打印效果不佳导致糖果卡住一个绝佳的替代方案是使用一截内径约1英寸25.4mm的透明乙烯基软管。软管具有柔性可以轻松弯曲并调整出口角度确保糖果垂直落入轮隙。安装与固定将软管上端用胶带或卡箍固定在伺服转盘位置B的下方下端出口悬停在两个发射轮的正上方约1-2厘米处。这个高度要给糖果一个小的加速下落距离但又不能太高导致弹跳偏离。外壳与美化最后用硬纸板为整个框架制作外壳遮盖内部的电路和机械结构让作品看起来更完整。记得为按钮、USB口和电源开关如果有开孔。5. 核心代码逻辑与编程实现硬件就绪后我们需要赋予机器“智能”。代码的核心是一个状态机它清晰地定义了机器从待机到发射完成各个阶段的行为。5.1 库引入与引脚定义首先引入伺服库并定义所有连接到Arduino的引脚。#include Servo.h // 使用Arduino内置的Servo库 // 引脚定义 const int servoPin 9; // 伺服电机信号线 const int buttonPin 2; // 触发按钮 // 电机A (左轮) 控制引脚 const int AIN1 8; const int AIN2 7; const int PWMA 6; // 电机B (右轮) 控制引脚 const int BIN1 4; const int BIN2 3; const int PWMB 5; // 伺服电机对象 Servo myServo; // 状态定义 enum MachineState { STATE_IDLE, // 空闲待机 STATE_DISPENSE, // 释放糖果 STATE_LAUNCH, // 发射糖果 STATE_RETURN // 复位 }; MachineState currentState STATE_IDLE; // 速度与角度参数 const int launchSpeed 200; // 电机PWM速度 (0-255) const int dispenseAngle 60; // 伺服电机释放糖果的角度 const int homeAngle 0; // 伺服电机初始角度 const unsigned long dispenseTime 500; // 释放动作后等待时间(ms) const unsigned long launchTime 1000; // 发射持续时间(ms) unsigned long stateStartTime; // 记录进入当前状态的时间 bool buttonPressed false;5.2 初始化设置 (setup())在setup()函数中初始化所有引脚和伺服电机并设置初始状态。void setup() { // 初始化串口用于调试 Serial.begin(9600); Serial.println(Gumball Launcher Initialized!); // 配置按钮引脚启用内部上拉电阻 pinMode(buttonPin, INPUT_PULLUP); // 配置电机控制引脚为输出 pinMode(AIN1, OUTPUT); pinMode(AIN2, OUTPUT); pinMode(PWMA, OUTPUT); pinMode(BIN1, OUTPUT); pinMode(BIN2, OUTPUT); pinMode(PWMB, OUTPUT); // 初始化电机为停止状态 stopMotors(); // 附着伺服电机并归位 myServo.attach(servoPin); myServo.write(homeAngle); delay(1000); // 等待伺服电机运动到初始位置 // 初始状态 currentState STATE_IDLE; }5.3 状态机主循环 (loop())loop()函数的核心是一个switch-case语句根据当前状态执行相应的动作。void loop() { // 检测按钮按下低电平触发因为使用了INPUT_PULLUP if (digitalRead(buttonPin) LOW !buttonPressed) { buttonPressed true; // 防抖延时 delay(50); // 再次确认按钮仍被按下 if (digitalRead(buttonPin) LOW currentState STATE_IDLE) { Serial.println(Button Pressed! Starting sequence.); currentState STATE_DISPENSE; stateStartTime millis(); // 记录状态开始时间 } } else if (digitalRead(buttonPin) HIGH) { buttonPressed false; // 按钮释放重置状态 } // 状态机执行 switch (currentState) { case STATE_IDLE: // 什么都不做等待按钮 break; case STATE_DISPENSE: // 1. 伺服电机转动释放一颗糖果 myServo.write(dispenseAngle); // 2. 等待糖果掉落通过通道的时间 if (millis() - stateStartTime dispenseTime) { currentState STATE_LAUNCH; stateStartTime millis(); // 重置计时器用于下一状态 Serial.println(Moving to LAUNCH state.); } break; case STATE_LAUNCH: // 1. 启动两个齿轮电机反向旋转以发射糖果 launchGumball(); // 2. 发射持续一段时间 if (millis() - stateStartTime launchTime) { stopMotors(); // 停止发射 currentState STATE_RETURN; stateStartTime millis(); Serial.println(Moving to RETURN state.); } break; case STATE_RETURN: // 1. 伺服电机返回初始位置为下一颗糖果做准备 myServo.write(homeAngle); // 2. 等待复位完成 if (millis() - stateStartTime dispenseTime) { currentState STATE_IDLE; // 回到空闲状态等待下一次触发 Serial.println(Sequence complete. Back to IDLE.); } break; } }5.4 关键功能函数为了使主循环清晰我们将电机控制封装成函数。// 停止两个电机 void stopMotors() { digitalWrite(AIN1, LOW); digitalWrite(AIN2, LOW); analogWrite(PWMA, 0); digitalWrite(BIN1, LOW); digitalWrite(BIN2, LOW); analogWrite(PWMB, 0); } // 启动发射电机假设左轮逆时针右轮顺时针 void launchGumball() { // 电机A (左轮) - 逆时针 digitalWrite(AIN1, HIGH); digitalWrite(AIN2, LOW); analogWrite(PWMA, launchSpeed); // 设置速度 // 电机B (右轮) - 顺时针 digitalWrite(BIN1, LOW); digitalWrite(BIN2, HIGH); analogWrite(PWMB, launchSpeed); // 设置速度 }代码逻辑精讲状态机使用enum定义状态让程序逻辑一目了然。从IDLE空闲到DISPENSE释放到LAUNCH发射再到RETURN复位最后回到IDLE形成一个完整的、可重复执行的循环。这比把所有动作都堆在loop()里用延时delay()控制要优雅和可靠得多因为它不会阻塞其他操作如按钮检测。非阻塞延时使用millis() - stateStartTime targetTime来判断状态是否超时而不是用delay()。这是Arduino编程中的一个重要技巧它保证了在等待一个动作完成时主循环依然可以运行随时响应外部输入。按钮防抖机械按钮在按下和弹起时会产生物理抖动导致单片机误判为多次按下。代码中通过delay(50)和状态标志buttonPressed来实现简单的软件防抖。参数化将速度、角度、时间等关键参数定义为常量const放在代码开头。这样调试时只需修改这些常量的值无需在代码中到处寻找数字非常方便。6. 系统调试、优化与故障排除即使按照教程一步步做第一次也很难完美成功。调试是创客项目的必修课。下面是我在多次制作中总结出的常见问题与解决方案。6.1 机械部分问题问题1糖果卡在伺服转盘或漏斗里。原因转盘凹槽尺寸与糖果不匹配或漏斗出口过大/过小。解决测量与调整精确测量糖果的直径。使用卡尺。然后调整3D打印模型让凹槽的宽度和深度比糖果大约0.5-1mm。打磨与润滑如果使用3D打印件打印面可能粗糙。用细砂纸轻轻打磨凹槽和内壁。在非食品接触区可以涂抹极少量凡士林减少摩擦。漏斗改良漏斗出口最好做成可调节的比如用两片硬纸板做成“V”形狭缝用螺丝调节开口大小直到每次只通过一颗糖。问题2糖果无法被轮子有效发射或发射方向歪斜。原因这是最常见的问题根源在于轮子的平行度、对中性和轮隙。解决平行度校准这是最关键的步骤。关闭电源手动将两个轮子转到互相最近的位置用一把直尺或卡尺的侧面同时紧贴两个轮子的外缘。从轮子上方、中间、下方多个位置观察尺子与轮子的间隙是否均匀。如果不均匀说明轮子不平行需要松动机架螺丝垫上薄纸片或微调乐高结构直到完全平行。对中性校准确保糖果下落的轨迹正好是两个轮子水平中心连线的中点。你可以让机器空转小心手指从导向管滴下一滴墨水或放下一颗很小的泡沫球观察其下落点。调整导向管出口的位置。轮隙调整轮隙应略小于糖果直径。太大会打滑无法加速太小会卡住甚至挤碎糖果。通过调整两个电机支架的距离来找到最佳间隙。一个经验是糖果应能被轮子轻松“叼走”而不是“硬挤过去”。问题3机器运行时振动过大结构松散。原因框架刚性不足或电机安装不牢。解决三角加固在所有90度连接处增加冰棒棍或乐高梁形成三角形支撑。三角形是最稳定的结构。增加配重在框架底部粘贴重物如几块金属片或石头降低重心增加稳定性。电机减震在电机和支架之间垫上薄海绵或橡胶垫吸收高频振动。6.2 电气与代码部分问题问题4按下按钮无反应或动作执行混乱。原因按钮接线错误、代码逻辑错误或电源问题。排查步骤串口调试在setup()中打开串口在每个状态转换时打印信息如Serial.println(Entering LAUNCH state)。通过观察串口监视器的输出可以精确知道程序执行到哪一步卡住了。按钮测试单独写一个测试程序只读取按钮引脚状态并打印。确认按下时是否为LOW松开时为HIGH。状态机时序检查dispenseTime和launchTime这两个延时参数。如果dispenseTime太短糖果可能还没掉到轮子那里电机就启动了。可以适当增加这个时间比如从500ms增加到800ms。电源电压用万用表测量为电机供电的电池电压。在电机启动瞬间电压可能会骤降。如果低于驱动模块的最低工作电压可能导致逻辑错误。尝试使用全新的碱性电池或可充电的镍氢电池。问题5电机不转或只朝一个方向转。原因驱动模块接线错误、逻辑电平不匹配或PWM引脚配置错误。排查步骤单独测试电机写一个简单程序只控制一个电机正反转。确认AIN1/AIN2或BIN1/BIN2的电平组合是否正确01为正转10为反转。检查PWM用analogWrite(pin, 128)输出一个中间值用万用表测量该引脚电压是否约为2.5V5V系统下确认PWM功能正常。查阅数据手册再次确认你使用的电机驱动模块的引脚定义和逻辑电平。有些模块的VCC逻辑电源必须接5V如果接3.3V可能无法正确识别Arduino的信号。问题6伺服电机抖动或到达不了指定位置。原因供电不足、机械负载过大或信号干扰。解决独立供电尝试将伺服电机的电源线红色和地线棕色从Arduino上取下单独连接到一个5V/2A的手机充电器模块上但信号线橙色和地线仍需与Arduino共地。这能排除因Arduino板载稳压器电流不足导致的问题。检查机械阻力手动转动伺服舵盘感觉是否有卡顿。确保转盘安装平直没有摩擦到其他部件。代码加延迟在myServo.write()命令后加一个短暂的delay(15)给舵机一点时间运动到位。6.3 性能优化建议当基本功能实现后你可以尝试以下优化让项目更上一层楼增加发射模式修改代码实现“单发模式”和“连发模式”。例如长按按钮2秒进入连发模式连续发射3颗糖后再停止。加入速度调节增加一个电位器通过模拟输入读取其值映射到launchSpeed变量上实现手动调节发射力度。添加声光效果在发射时用一颗RGB LED闪烁红光同时让蜂鸣器发出“咻”的一声增加趣味性。设计自动装填这是高级挑战。设计一个更大的储料仓和一个由慢速电机驱动的螺旋推进器当检测到漏斗糖果不足时自动从大仓中补充。使用红外传感器在发射口安装红外对管用于检测是否成功发射了一颗糖果并在屏幕上显示计数。这个项目从构思到实现最大的收获不是最终那个能发射糖果的机器而是在解决一个又一个具体问题的过程中对机电系统集成、嵌入式编程和调试方法建立的深刻理解。每一个卡住的糖果、每一次歪斜的发射、每一行调试通过的代码都是比书本知识更宝贵的经验。希望你在复现这个项目时也能享受这种从无到有、让想法变成现实的乐趣。