ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

基于Arduino与语音识别的非接触式糖果发放系统DIY实践

基于Arduino与语音识别的非接触式糖果发放系统DIY实践 1. 项目缘起一个“安全”的万圣节难题又到一年万圣节街坊邻里张灯结彩孩子们早已按捺不住穿上奇装异服、拎上南瓜灯准备开启一年一度的“不给糖就捣蛋”之旅。但说实话作为一个有孩子的家长这几年每到这个节日心里总有点犯嘀咕。一方面看着孩子们眼巴巴的期待不忍心扫他们的兴另一方面人群聚集、近距离接触带来的健康顾虑又让人不得不谨慎。传统的“开门-递糖-关门”流程在当下这个对社交距离格外敏感的时代显得有点不合时宜。去年我就在自家门口目睹了这样一幕几个兴奋的小朋友挤在台阶前小手伸向同一个糖果碗家长在后面喊着“别靠太近”场面一度有些混乱。那一刻我就在想有没有一种办法既能保留万圣节“分享糖果”的快乐传统又能最大限度地减少接触甚至增加一些科技感和趣味性这个想法一直萦绕在我脑海里。直到最近我在车库整理旧物时翻出了一段闲置的PVC水管和一些Arduino开发板灵感突然来了。为什么不做一个“糖果滑梯”呢让糖果从高处滑落到孩子们手中的袋子里物理上就拉开了距离。但仅仅这样还不够酷如果能加上声音控制——比如孩子们喊一句“Trick or Treat!”糖果就自动滑下来——那岂不是既安全又有趣这个“社交距离声控糖果滑梯”的项目构想就这么诞生了。它本质上是一个融合了简单机械结构、基础电子控制和趣味交互的DIY项目目标不是造一个工业级设备而是用身边易得的材料解决一个真实的生活小痛点同时给节日增添一抹亮色。2. 核心设计思路机械、电子与交互的三重奏这个项目的核心目标非常明确实现非接触式、语音触发的糖果投递。拆解开来它需要解决三个层面的问题糖果如何被运送机械结构、系统如何感知指令并执行电子控制、整个体验如何流畅有趣交互设计。这三者必须紧密配合任何一个环节的短板都会让体验大打折扣。首先看机械部分。我们需要一个可靠的“滑道”。它的设计必须满足几个关键条件第一坡度要足够平缓确保糖果尤其是各种形状、大小的巧克力、软糖能够依靠重力顺利下滑但又不能太陡否则糖果会像炮弹一样冲出来吓到孩子或者掉在地上。第二滑道表面需要足够光滑减少摩擦和卡顿。第三出口需要有一个可控的“闸门”平时关闭接收到指令时才打开释放糖果。第四整个结构要稳固能承受孩子们兴奋的围观和可能的不小心碰撞。电子控制是项目的大脑。我们需要一个“耳朵”来听取“咒语”语音指令一个“大脑”来理解指令并做出决策以及一个“手”来执行打开闸门的动作。这里就涉及到传感器、控制器和执行器的选型。语音识别模块是首选它比单纯的声音传感器只能检测音量大小更智能能识别特定关键词。控制器需要能读取传感器信号并驱动执行器比如舵机动作。整个系统的供电也需要考虑是使用电池的便携方案还是接入室内电源的稳定方案。最后是交互设计这决定了项目的“温度”。我们希望的体验是孩子走到滑梯前对着某个地方比如一个可爱的南瓜头麦克风喊出“Trick or Treat!”然后稍等片刻伴随着一阵轻快的提示音闸门打开糖果顺着五彩的滑道“嗖”地滑到孩子撑开的袋子里。这个过程需要有明确的开始反馈比如LED灯亮起表示系统在聆听、执行反馈提示音和结束反馈糖果送出。整个等待时间最好控制在2-3秒内太短了没有期待感太长了孩子会失去耐心。基于以上分析我决定采用一个模块化、易于调试的方案。机械部分以PVC水管和木板为主体搭建电子核心采用常见的Arduino Uno开发板搭配一个性价比不错的离线语音识别模块执行机构使用标准舵机来控制一个3D打印的闸门。这样组合材料易得社区支持丰富即使中途遇到问题也容易排查和解决。3. 材料清单与工具准备从零开始的物料盘点动手之前把需要的“粮草”备齐是关键。这个项目的大部分材料都可以在五金店、电子市场或在线商城找到有些甚至可以从你的“垃圾堆”里翻出来再利用。下面是我最终使用的清单我会详细说明每样东西的用途和选择理由你可以根据手头资源灵活替换。机械结构材料PVC水管直径75mm或100mm及相应弯头、三通这是滑梯通道的主体。我选择了直径100mm的管子因为它的内部空间足够大可以同时让好几颗糖果并排滑下避免堵塞。直径太小容易卡住奇形怪状的糖果。长度根据你设计的滑梯高度和坡度来定我用了大约2米长的管子截成了三段。木板厚度约2cm用于制作整个装置的支撑框架和底座。胶合板或实木板都可以关键是够结实能稳定支撑PVC滑道和电子部件的重量。尺寸大约需要一块60cm x 40cm的作为底板以及几块用于制作支柱和加强筋的小木板。小型舵机如SG90或MG90S这是控制滑道出口闸门的“肌肉”。SG90舵机扭矩较小但便宜适合轻量级的闸门如果你设计的闸门较重或担心卡住MG90S是更好的选择。我用了MG90S求个稳妥。3D打印的闸门零件或手工制作的替代品我设计了一个简单的旋转式闸门用3D打印机打了出来。如果没有3D打印机完全可以用轻质木板或亚克力板配合合页手工制作一个。闸门的关键是要密封性好平时能挡住糖果转动时要顺畅。螺丝、螺母、角码、扎带用于固定各种部件。扎带在固定电线、临时捆绑结构时非常好用。砂纸、自喷漆可选用于打磨PVC管切口和美化整个装置。我用了橙色和黑色的喷漆让它更有万圣节气氛。电子控制部件Arduino Uno开发板项目的大脑。它负责接收语音模块的信号并控制舵机动作。选择Uno是因为它极其普及教程和库文件最多对新手最友好。离线语音识别模块如LD3320或SYN7318项目的“耳朵”。我选择了LD3320模块因为它支持离线识别无需网络响应速度快隐私性好而且可以通过简单的代码录入自定义的关键词如“Trick or Treat”、“糖果快来”。这是实现声控的核心。舵机同上与机械部分共用。蜂鸣器或有源音箱模块用于播放提示音。一个简单的无源蜂鸣器可以发出“嘀嘀”声但如果想播放一段有趣的音乐或音效比如女巫的笑声就需要一个像DFPlayer Mini这样的模块配合小喇叭并提前在TF卡里准备好音频文件。LED灯可选用于状态指示。比如系统待机时亮蓝色识别到语音时闪烁绿色送出糖果后亮橙色。面包板、杜邦线公对公、公对母用于连接和测试电路。在最终版本中你可以用焊接的方式让连接更牢固。电源可以选择方案A便携一个9V电池或一组5号电池盒给Arduino供电。注意舵机工作电流较大电池方案可能续航较短。方案B稳定一个5V/2A的手机充电头通过Micro USB线给Arduino供电。这是我最推荐的方式稳定可靠。方案C分立如果舵机多或功耗大可以考虑用单独的5V/2A电源适配器直接给舵机供电但需共地。所需工具手锯或PVC管切割器用于切割PVC水管和木板。电钻及不同尺寸的钻头用于在木板和PVC管上打孔安装螺丝和固定件。热熔胶枪或强力胶用于固定一些非承重部件如LED灯、语音模块的麦克风。螺丝刀套装。万用表可选但强烈推荐用于检查电路通断和电压排查故障时是神器。电脑及Arduino IDE软件用于编写和上传代码。注意在切割PVC管和木板时请务必佩戴护目镜并在通风良好的地方进行。使用热熔胶枪要小心高温。确保所有电子连接在通电前检查无误避免短路。4. 机械结构搭建打造一条流畅的糖果通道机械部分是整个项目最“实在”的体验基础。如果糖果在滑道里卡住或者滑出来时歪歪扭扭再酷的声控功能也会让体验大打折扣。我的搭建过程分为三步设计支撑框架、组装滑道、安装闸门机构。### 4.1 框架设计与切割首先在木板上规划整个布局。我的设计是滑梯有一个约1米高的起点投放口一个约45度的斜坡终点出口距离地面约50厘米方便孩子用袋子接住。底座木板要足够大和重防止整个装置头重脚轻被碰倒。制作底座和支柱将最大的那块木板作为底板。然后用其他木板切割出两根高度约1米的长条作为主支柱以及两根高度约50厘米的短支柱。用角码和螺丝将长支柱垂直固定在底板的后侧短支柱固定在前侧。确保四根支柱的顶端在同一个倾斜的平面上这个平面就是未来放置滑道的斜面。制作滑道支撑轨取两根长度约1.2米的木条将它们平行地固定在四根支柱的顶端形成两条“轨道”PVC管将架在这两条轨道上。固定时使用水平仪或肉眼观察确保两条轨道是平行的且具有你想要的坡度我用了45度。坡度可以通过调整前后支柱的高度差来实现。### 4.2 PVC滑道加工与安装这是决定糖果滑动体验的关键环节。切割与处理根据设计长度用手锯或PVC切割器将水管切成需要的段数。我的滑道由三段直管和一个弯头组成。非常重要的一步用砂纸仔细打磨所有切割断面特别是管子的内壁边缘去除所有毛刺。一个微小的毛刺都可能挂住糖纸导致堵塞。打磨后可以用湿布擦拭内部确保光滑。连接与固定使用PVC胶水如果需要永久固定或者直接利用管材的弹性插接将直管和弯头连接起来形成一条完整的从高到低的通道。弯头我用在最下方让糖果出口有一个自然的弧度指向斜前方而不是垂直向下砸到地上。然后将组装好的PVC滑道用扎带或制作专门的卡箍牢牢地固定在之前做好的两条木制轨道上。确保整个滑道稳固没有晃动。美化可选用自喷漆给PVC管和木框架上色。我建议先喷一层底漆再喷主题色。晾干后再进行下一步。### 4.3 舵机闸门机构安装闸门需要安装在滑道最下方的出口处。我设计的是一个旋转式闸门像一扇小门一样平时在舵机带动下处于水平位置挡住出口收到指令后旋转90度变为垂直打开通道。制作安装板用一小块木板或3D打印一个支架用来固定舵机。这个支架需要能够被牢固地安装在滑道出口的正上方或侧方。安装舵机与闸门将舵机用螺丝固定在安装板上。然后将3D打印的闸门零件就是一个带轴孔的小片用配套的螺丝紧紧固定在舵机的舵盘上。确保闸门在舵机处于0度位置时能严实地挡住滑道出口在舵机转到90度时闸门完全移开开口最大化。整体固定将装有舵机的安装板用螺丝或强力的胶水固定在滑道出口处的PVC管或木框架上。反复测试舵机转动时闸门是否顺畅开合有无刮擦。可以用手轻轻拨动闸门感受阻力如果阻力很大需要调整安装角度或打磨闸门边缘。至此一个稳固、光滑、带有可动闸门的糖果滑梯机械部分就完成了。你可以先手动测试一下从顶部投入几颗不同形状的糖果观察它们下滑是否流畅在闸门处是否会堆积以及打开闸门后糖果是否能顺利滚出。多试几次确保万无一失。5. 电路连接与核心代码解析机械骨架搭好了接下来要给它注入“灵魂”。电路连接是硬件基础代码则是控制逻辑。这部分需要耐心和细致遵循“先连接后供电先测试模块再集成系统”的原则。### 5.1 电子模块接线详解我们使用Arduino Uno作为主控。下面是各模块与Arduino的接线方法。在最终焊接前强烈建议先在面包板上搭建测试电路。LD3320语音识别模块VCC- Arduino5VGND- ArduinoGNDRXD- ArduinoDigital Pin 2(软件串口接收)TXD- ArduinoDigital Pin 3(软件串口发送)注意LD3320的通信是串口UART方式。为了避免占用Arduino唯一的硬件串口Pin 0,1常用于上传程序和调试我们使用SoftwareSerial库在数字引脚2和3上创建一个虚拟串口来与它通信。模块上的SPI接口本次项目用不到。MG90S舵机棕色线GND- ArduinoGND红色线VCC- Arduino5V注意如果同时驱动多个舵机或舵机出现抖动强烈建议使用外部5V电源单独给舵机供电并与Arduino共地橙色线信号- ArduinoDigital Pin 9(PWM引脚用于控制角度)有源蜂鸣器或DFPlayer Mini模块以DFPlayer为例VCC- Arduino5VGND- ArduinoGNDRX- ArduinoDigital Pin 11(通过另一个软件串口或电阻分压后连接)喇叭- 连接一个8欧姆的小喇叭。注意DFPlayer也需要串口通信。如果同时使用LD3320和DFPlayer你需要规划好两个软件串口或者使用硬件串口与其中一个通信但会占用调试口。一个更简单的替代方案是使用无源蜂鸣器直接用tone()函数播放简单音调。LED灯可选通过一个220欧姆的限流电阻正极接Arduino数字引脚如Pin 6负极接GND。将所有模块的GND地线连接到一起这是保证信号稳定的基础。电源方面如果只用Arduino的5V输出要留意其最大电流限制约500mA。舵机在动作瞬间电流可能达到几百毫安加上其他模块可能接近极限。因此使用外部5V/2A电源适配器通过Arduino的Vin口或电源接口供电是最稳妥的方案。### 5.2 Arduino代码逻辑与关键函数代码的核心逻辑是一个状态机待机监听 - 语音识别 - 执行动作 - 反馈 - 返回待机。下面我拆解关键部分#include SoftwareSerial.h #include Servo.h // 定义引脚 #define VOICE_RX 2 #define VOICE_TX 3 #define SERVO_PIN 9 #define LED_PIN 6 #define BUZZER_PIN 5 // 假设使用无源蜂鸣器 // 初始化对象 SoftwareSerial voiceSerial(VOICE_RX, VOICE_TX); // 语音模块软串口 Servo candyGateServo; // 舵机对象 // 全局变量 int servoClosedAngle 10; // 闸门关闭时的角度需根据实际安装调整 int servoOpenAngle 80; // 闸门打开时的角度 bool candyReady true; // 糖果是否就绪防止连续触发 void setup() { Serial.begin(9600); // 用于调试的硬件串口 voiceSerial.begin(9600); // 语音模块通信波特率LD3320通常是9600 candyGateServo.attach(SERVO_PIN); pinMode(LED_PIN, OUTPUT); pinMode(BUZZER_PIN, OUTPUT); // 初始化位置关闭闸门 candyGateServo.write(servoClosedAngle); digitalWrite(LED_PIN, LOW); // LED灭 delay(1000); // 向语音模块发送初始化指令根据LD3320手册 voiceSerial.print(W); // 假设“W”是唤醒或开始识别指令具体指令需查阅模块手册 Serial.println(系统就绪等待语音指令...); } void loop() { // 1. 监听语音串口是否有数据 if (voiceSerial.available() 0) { String voiceCommand voiceSerial.readStringUntil(\n); // 读取直到换行符 voiceCommand.trim(); // 去除首尾空格 Serial.print(收到指令: ); Serial.println(voiceCommand); // 2. 解析指令 if (voiceCommand.indexOf(TRICK OR TREAT) ! -1 || voiceCommand.indexOf(糖果) ! -1) { // 匹配关键词 if (candyReady) { dispenseCandy(); // 执行发放糖果函数 } else { Serial.println(糖果已发放请等待重置或补充...); playSound(2); // 播放错误提示音 } } } // 其他循环任务比如检测糖果是否补充可以用一个按钮模拟 } // 发放糖果的核心函数 void dispenseCandy() { candyReady false; // 防止重复触发 Serial.println(识别成功发放糖果...); // 反馈LED闪烁 digitalWrite(LED_PIN, HIGH); playSound(1); // 播放准备音效 delay(500); // 执行打开闸门 candyGateServo.write(servoOpenAngle); delay(1500); // 保持开门时间确保糖果滑出 // 执行关闭闸门 candyGateServo.write(servoClosedAngle); delay(500); // 反馈完成提示 playSound(3); // 播放完成音效 digitalWrite(LED_PIN, LOW); Serial.println(糖果发放完成); // candyReady true; // 可以在这里自动重置或者通过一个外部按钮/传感器来重置 }关键点解析软件串口SoftwareSerial库让我们能用普通的数字引脚模拟串口通信从而连接多个串口设备。指令匹配voiceCommand.indexOf(KEYWORD)用于判断接收到的字符串是否包含我们设定的关键词。LD3320模块通常需要先通过配套的上位机软件或特定串口指令将“TRICK OR TREAT”等词组录入到其芯片的识别列表里。防重复触发candyReady布尔变量是一个简单的状态锁。发放一次后设为false直到我们通过某种方式如手动按一个复位按钮或者通过红外传感器检测到糖果已补充将其重置为true。这避免了孩子连续喊话导致舵机乱转或空转。舵机控制servo.write(angle)是控制舵机转到特定角度的函数。servoClosedAngle和servoOpenAngle的具体值需要你根据实际安装情况反复测试调整确保闸门能完全关闭和打开。音效函数playSound(int type)是一个自定义函数内部可以用tone(BUZZER_PIN, frequency, duration)来产生不同频率和时长的声音代表“识别成功”、“发放中”、“错误”等状态。### 5.3 语音模块的配置与训练这是项目的难点之一。以LD3320为例它通常需要通过USB转TTL串口模块连接到电脑使用厂商提供的配置软件进行设置。连接配置工具将LD3320模块的SPI接口或指定配置口与USB转TTL模块连接打开配置软件。添加识别列表在软件中添加你想要识别的短语例如“TRICK OR TREAT”、“糖果”、“万圣节快乐”。注意模块对中文的识别可能需要特定的编码格式且识别率受麦克风质量和环境噪音影响。一个重要的技巧是添加一些常见的、音节清晰的英文指令作为备选如“Candy Please”、“Halloween”识别率往往更高。设置识别模式通常选择“循环识别”模式模块会持续监听。写入模块将设置好的识别列表和参数烧录到LD3320的芯片中。之后它就可以独立工作了Arduino只需要通过串口读取它识别到的结果编号或字符串。注意离线语音模块在嘈杂环境如户外下识别率会下降。可以考虑为麦克风加一个简单的海绵防风罩并将模块安装在相对封闭、远离滑道机械噪音的位置。测试时在不同距离、不同角度、不同音量下多喊几次找到最佳的安装点和识别阈值。6. 系统集成、调试与美化当机械和电子部分都独立测试通过后就可以进行总装了。这个阶段的目标是让各个部分协调工作并处理那些“理论上没问题实际却出状况”的细节。### 6.1 总装与布线固定电子部件找一个合适的位置比如滑梯底座下方的空腔或者背面用扎带或螺丝固定Arduino板、电源模块。确保线路不会被运动部件如舵机臂刮到。安装麦克风和指示灯将语音模块的麦克风延伸出来安装在一个显眼且有趣的位置。我把它放在了一个塑料南瓜头里并在眼睛处开了孔。LED指示灯也可以安装在南瓜头或其他装饰物上让孩子能看到状态变化。隐藏与整理线材用缠绕管或线槽将所有的杜邦线整理好沿着支撑柱或滑道背面走线并用扎带固定。凌乱的线材不仅不美观也容易被扯松导致故障。这是提升项目完成度的关键一步。### 6.2 系统联调与问题排查上电进行端到端测试。你可能会遇到以下典型问题及解决方案问题1喊破喉咙也没反应语音识别失败。排查首先检查语音模块的电源指示灯是否亮起串口通信是否正常可以在Arduino代码中加入Serial.println(voiceCommand)并打开串口监视器看是否有任何数据输出。如果没有数据检查接线RX/TX是否接反、波特率是否匹配。解决调整麦克风的灵敏度如果模块支持或者重新在更安静的环境下训练关键词。尝试用更清晰、语速更慢的发音。确保模块的固件支持你使用的语言。问题2舵机抖动、异响或无力无法转动闸门。排查这是最常见的电源问题。测量一下舵机动作时其VCC和GND之间的电压。如果电压低于4.8V说明供电不足。解决立即改为外部电源供电用一个独立的5V/2A以上的电源适配器正极接舵机VCC负极接舵机GND和Arduino的GND。Arduino只提供信号线。你会发现舵机立刻变得有力且安静。问题3糖果在闸门处卡住或者一次滑出太多。排查闸门开口形状、大小以及滑道末端的弧度设计不合理。解决调整闸门打开的角度使其开口最大化。在滑道出口内部两侧贴上光滑的胶带或涂上蜡减少摩擦。如果糖果总是堆在一起冲出可以在滑道高处内部加装一个简单的“减速带”或“分流器”比如用热熔胶粘一小段塑料片让糖果逐个排队下滑。问题4误触发。环境噪音或聊天声导致系统自动发放糖果。解决在代码中增加“唤醒词”逻辑。例如必须首先检测到一个特定的拍手声通过声音传感器模块或按下一个按钮系统才进入2-3秒的语音监听状态此时LED亮起超时则自动返回待机。这能极大降低误触发率。### 6.3 主题美化与氛围营造一个光秃秃的滑梯机器可不够万圣节美化是画龙点睛之笔。主题涂装除了基础的橙色黑色可以用荧光漆画上蜘蛛网、蝙蝠、鬼魂的图案。在黑暗处用UV灯照射会有惊喜效果。装饰物用泡沫、纸板制作一些墓碑、小幽灵布置在滑梯底座周围。在滑梯入口投放口上方挂一个可爱的女巫帽子或南瓜灯笼。灯光与音效升级将简单的LED灯换成可编程的RGB LED灯带如WS2812B用Arduino控制在识别语音时跑马灯发放糖果时闪烁橙色光芒。将无源蜂鸣器换成MP3模块播放自定义的诡异笑声、城堡开门声等音效。互动提示牌制作一个牌子写上“魔法糖果滑梯请大声念出咒语‘Trick or Treat’”并画上简单的示意图。经过调试和美化的糖果滑梯不再是一个冷冰冰的工程项目而是一个充满节日魔法气息的互动装置。它安全、有趣完美地解决了社交距离的顾虑成为了去年万圣节我们街区最受欢迎的“发糖站点”。看着孩子们惊喜的表情和开心的笑声之前所有的折腾都值了。这个项目的精髓不在于用了多高深的技术而在于用创意和动手能力为生活增添了一份安全的快乐。
返回列表