1. 项目概述从“抽奖”到“随机控制”的硬件实践抽奖转盘听起来是个充满趣味的小玩意儿但把它作为Arduino和Mixly学习的第13课其意义远不止于“好玩”。这堂课的核心其实是把“随机数生成”这个抽象的编程概念通过舵机这个具体的执行机构实实在在地“演”了出来。对于很多刚接触硬件编程的朋友来说代码里的random()函数可能只是一个会变动的数字但当你看到舵机带动指针真的在转盘上随机停住时那种“代码驱动物理世界”的震撼感是完全不同的。这堂课巧妙地将软件算法随机数与硬件执行舵机控制结合是理解嵌入式系统“感知-决策-执行”闭环的绝佳入门案例。它适合所有已经掌握了Mixly基础图形化编程点亮过LED读取过按键现在想挑战更动态、更复杂交互的初学者。通过这个项目你将不再只是控制灯的亮灭而是学会如何让一个机械结构“听令行事”并且是带有不确定性地行事。这为你后续制作智能小车、机械臂甚至更复杂的自动化项目打下了至关重要的基础。我当年就是从类似的项目开始才真正体会到编程不只是屏幕上的字符更是连接数字世界与物理世界的桥梁。2. 核心硬件与原理深度解析2.1 舵机精准的角度执行器舵机是这个项目的“手臂”它的选择直接决定了转盘的流畅度和最终效果。我们最常用的是SG90这类微型舵机它价格低廉驱动简单非常适合教学和原型开发。舵机的工作原理可以简单理解为“按需转动”。它内部有一个小型直流电机、一套减速齿轮和一个位置反馈电位器或编码器。当我们通过信号线发送一个脉冲宽度调制PWM信号时舵机内部的控制电路会将这个脉冲宽度通常是0.5ms到2.5ms解读为一个目标角度通常是0°到180°。然后电路驱动电机转动同时通过电位器实时监测当前角度。一旦当前角度与目标角度一致电机就停止转动。这个过程是闭环的所以舵机能够“锁住”在指定角度具有一定的扭矩来抵抗外力。在Mixly中我们不需要直接去计算复杂的PWM脉宽图形化模块已经帮我们封装好了。你只需要指定一个角度值比如90度Mixly就会生成对应的Arduino代码通过Servo库来控制指定引脚输出正确的PWM波形。这就是图形化编程的优势——让我们更专注于逻辑而非底层时序。注意SG90舵机有三根线棕色GND接地、红色VCC电源通常5V、橙色信号线。务必正确连接接反电源可能会烧毁舵机。同时Arduino Uno板的5V引脚输出电流有限约500mA单个SG90工作电流约100-200mA驱动一个没问题但如果未来想驱动多个舵机务必考虑外接电源否则可能导致板子重启或舵机抖动无力。2.2 随机数的“不随机”与初始化“随机”是抽奖的灵魂但在单片机世界里真正的随机很难。Arduino的random()函数生成的是“伪随机数”。它基于一个称为“种子”的初始值通过一个确定的数学公式计算出一系列看起来随机的数字。如果每次上电的“种子”都一样那么生成的随机数序列也将完全一样。这就引出了randomSeed()函数的重要性。它的作用就是给随机数发生器一个全新的、难以预测的“种子”。最常用的方法是读取一个未连接的模拟引脚如A0的电压值。由于引脚悬空其读取的电压值会受到环境中各种电磁噪声的微小影响这个值在每次上电时都略有不同从而可以作为相当不错的随机种子。在Mixly中这个操作被封装在“初始化随机数种子”模块里通常内部就是执行randomSeed(analogRead(A0))。这是一个至关重要的步骤却容易被忽略。如果你不做初始化每次重启Arduino你的“抽奖”结果可能会重复上一次的序列那就毫无随机性可言了。我建议把这个模块放在setup()函数的最开始养成习惯。2.3 系统工作流程设计在动手连接线路和拖拽模块之前我们需要在脑子里把整个系统的工作流程理顺。这能帮你写出逻辑清晰的代码而不是一堆模块的堆砌。上电初始化Arduino板启动执行setup()。这里我们要做两件事一是初始化舵机将其连接到指定引脚并归位例如0度二是初始化随机数种子确保后续的随机性。等待启动信号系统进入loop()循环持续检测一个启动条件。这个条件可以是一个按键被按下或者一个超声波传感器检测到有人靠近甚至是一个来自电脑串口指令。在基础版本中我们通常用一个按键。触发与旋转当启动条件满足时程序首先利用random()函数生成一个目标角度。例如如果你的转盘被等分为6份每份60度那么你可以生成一个0到5的随机数再乘以60得到0 60 120... 300这几个目标角度之一。执行与反馈程序将这个计算出的目标角度值通过Servo库的指令发送给舵机。舵机开始旋转平滑地运动到指定角度。结果保持与重置舵机到达目标位置并保持。此时可以点亮一个LED或者通过串口打印出中奖信息。等待一段时间比如3秒后舵机自动归位回到0度或者等待下一次按键按下进行新一轮抽奖。这个流程的核心逻辑是“事件驱动”由一个外部事件按键触发一系列内部计算和执行动作。理解了这个你的程序结构就会非常清晰。3. 硬件连接与Mixly编程实战3.1 物料清单与电路连接我们先来清点一下需要哪些东西并确保它们正确连接。这是项目成功的物理基础。物料清单Arduino Uno开发板 x1SG90舵机 x1面包板 x1按键模块 x1或普通按键10kΩ上拉电阻LED及220Ω限流电阻 x1可选用于指示状态杜邦线公对公、公对母若干自制转盘可以用纸板、激光切割亚克力等x1电路连接示意图文字描述舵机连接舵机棕色线 - Arduino GND引脚舵机红色线 - Arduino 5V引脚舵机橙色信号线 - Arduino 数字引脚 9PWM引脚可选其他如5, 6, 10, 11按键连接使用上拉电阻接法按键一脚 - Arduino 数字引脚 2按键同一脚 - 通过一个10kΩ电阻连接到 Arduino 5V此为“上拉”按键另一脚 - Arduino GND解释这种接法下引脚2平时被电阻“拉高”到5V读取为HIGH当按键按下时引脚直接接地变为LOW。这样能有效避免引脚悬空导致的信号抖动。LED连接可选LED长脚正极- 通过220Ω电阻 - Arduino 数字引脚 13LED短脚负极- Arduino GND连接好后建议先用一个简单的程序测试舵机和按键是否工作正常比如按下按键让舵机转动90度。分模块测试是硬件调试的黄金法则。3.2 Mixly图形化程序构建现在进入Mixly编程环节。我们将按照之前设计的工作流程拖拽相应的模块。步骤一初始化设置在“设置”函数区域拖入以下模块初始化舵机在“执行器”分类中找到“舵机”模块设置引脚为9与你连接的信号线引脚一致。初始化随机种子在“数学”分类中找到“随机数种子初始化”模块。通常它会自动使用一个模拟引脚如A0。确保A0引脚没有连接任何东西处于悬空状态。舵机归零再拖入一个“舵机”模块设置角度为0将其连接到初始化舵机模块下方。这样上电后指针会指向一个基准位置如“开始”区域。设置按键引脚模式从“引脚”分类拖出“设置数字引脚模式”模块设置引脚2为“输入上拉”。Mixly的这个模块内部已经帮我们实现了上拉电阻的软件使能这样我们物理电路甚至可以不用那个10kΩ电阻直接将按键接在引脚2和GND之间即可更加简化。这是一个Mixly的便利之处但理解其背后的原理很重要步骤二主循环逻辑在“循环”函数区域构建主逻辑检测按键使用“如果”模块。条件部分从“引脚”分类拖入“读取数字引脚”模块选择引脚2并判断其值是否为“低电平”因为按下时接地为LOW。生成随机角度当按键被按下条件为真首先我们生成一个随机数。假设转盘有6个等分区域。从“数学”分类拖入“随机数”模块设置范围从0到5。将这个随机数存入一个变量比如叫lotteryNumber。计算目标角度我们的舵机需要转动到具体角度。每个区域对应60度360/6起始区域0号对应0度。所以目标角度 lotteryNumber * 60。使用“数学”运算模块实现这个乘法结果存入另一个变量如targetAngle。控制舵机转动从“执行器”分类拖入“舵机”模块设置引脚为9角度值用变量targetAngle填入。这样舵机就会旋转到随机选定的区域。添加效果与延时为了让抽奖过程更有仪式感可以在舵机转动前先让舵机快速小幅度来回抖动一下模拟“蓄力”或者让一个LED闪烁。转动到位后使用“延时”模块暂停3000毫秒3秒让参与者看清结果。复位3秒后再次使用舵机模块将其角度设置为0让指针归位准备下一次抽奖。一个关键的优化技巧防按键抖动机械按键在按下和弹起的瞬间会产生快速的、不稳定的电平跳变称为“抖动”。这可能导致一次按下被程序误判为多次按下。解决方法是在检测到按键按下后先延时20-50毫秒避开抖动期再次检测引脚状态如果仍然是按下状态才确认为有效按键。在Mixly中你可以通过组合“延时”和“如果”模块来实现这个“软件消抖”逻辑。3.3 从图形到代码理解生成的Arduino代码Mixly的优势是直观但了解它背后生成的C代码Arduino语言能让你水平上一个台阶。点击Mixly的“代码”视图你可以看到类似下面的代码#include Servo.h // 引入舵机库 Servo servo_9; // 声明一个舵机对象关联到引脚9 int buttonPin 2; int targetAngle; void setup(){ servo_9.attach(9); // 初始化舵机绑定到9号引脚 pinMode(buttonPin, INPUT_PULLUP); // 设置按键引脚为上拉输入模式 randomSeed(analogRead(A0)); // 初始化随机数种子 servo_9.write(0); // 舵机归零 } void loop(){ if(digitalRead(buttonPin) LOW){ // 检测按键是否按下 delay(20); // 软件消抖延时 if(digitalRead(buttonPin) LOW){ // 再次确认 int lotteryNumber random(0, 6); // 生成0-5的随机数 targetAngle lotteryNumber * 60; // 计算角度 // 可以在这里添加一些特效比如快速抖动 for(int i0; i3; i){ servo_9.write(targetAngle5); delay(100); servo_9.write(targetAngle-5); delay(100); } servo_9.write(targetAngle); // 转动到目标角度 delay(3000); // 保持结果3秒 servo_9.write(0); // 归位 } } }阅读这段代码你会发现图形化模块和代码是一一对应的。理解Servo库的用法、pinMode中INPUT_PULLUP参数的含义、random()函数的范围注意random(0,6)生成的是0到5不包括6这些都是你从图形化编程向代码编程过渡的关键。4. 功能扩展与创意优化基础功能实现后我们可以让这个抽奖转盘变得更智能、更炫酷。这里分享几个我实践过且效果不错的扩展方向。4.1 增加视觉与听觉反馈单纯的转动有些单调加入反馈能让体验感倍增。多色LED指示使用一个RGB LED。在舵机转动时让LED快速切换颜色跑马灯效果当舵机停止时根据不同的中奖区域显示不同的固定颜色比如一等奖红色二等奖绿色等。这需要你将RGB LED的三个引脚连接到PWM引脚并使用analogWrite()或相应的Mixly色彩模块。蜂鸣器音效添加一个无源蜂鸣器。在按下按键时发出“嘀”一声提示在转动过程中播放一段上升音调停止时播放一个终结音。Mixly的“执行器”分类中有“蜂鸣器”模块可以方便地控制频率和时长。数码管或点阵屏显示使用一位7段数码管或一块8x8 LED点阵屏来显示抽中的号码或简单的动画如箭头、骰子。这需要学习相应的驱动库如SevSeg、LedControl难度有所提升但视觉效果最好。4.2 实现非均匀概率抽奖真实的抽奖往往不是均等的。比如一等奖概率1%二等奖10%谢谢参与89%。如何实现 思路是区间映射法。我们生成一个更大范围的随机数比如0-9999然后根据概率划分区间。一等奖0 ~ 99 共100个数占比1%二等奖100 ~ 1099 共1000个数占比10%谢谢参与1100 ~ 9999 共8900个数占比89%在Mixly中你需要先生成一个0-9999的随机数然后通过一系列“如果...否则如果...”逻辑来判断它落在哪个区间最后再映射到对应的转盘角度上。这个逻辑训练了对条件判断和数学运算的综合运用。4.3 引入“开始减速”与“指针晃动”动画为了让转动更逼真我们可以模拟真实转盘的物理效果启动快然后慢慢减速最后指针可能还会轻微晃动几下才停稳。 这需要用到缓动动画算法。简单实现思路如下计算一个从当前角度到目标角度的“剩余角度”。在循环中每次移动的角度量 剩余角度 * 一个减速系数如0.2。这样移动量会越来越小。每次移动后更新当前角度和剩余角度并短暂延时。到达目标附近后可以再加入几个左右小幅度摆动的循环模拟惯性晃动。虽然用Mixly的图形模块实现复杂动画比较繁琐但你可以尝试用“变量”和“循环”模块来近似模拟。这能极大地锻炼你的逻辑思维能力。更复杂的动画则建议直接编写代码控制起来更灵活。4.4 联网与远程控制结合ESP8266或ESP32这类带Wi-Fi功能的开发板你的抽奖转盘可以变得非常“现代”。网页控制让开发板接入局域网创建一个简单的Web服务器。你可以在手机或电脑的浏览器上输入IP地址打开一个带有“开始抽奖”按钮的网页。点击按钮网页指令通过网络发送给开发板触发转动。这需要学习基本的网络编程和HTML知识。语音控制结合像LD3320这样的离线语音识别模块或者通过联网调用在线语音识别API如百度AI你可以实现“小度小度开始抽奖”这样的语音控制。这属于进阶玩法涉及到串口通信和协议解析。5. 常见问题排查与调试心得做项目不可能一帆风顺以下是几个我踩过的坑和对应的解决办法希望能帮你节省时间。5.1 舵机问题合集问题舵机不转或只吱吱响但不转动。排查1电源问题。这是最常见的原因。Arduino板的USB口或5V引脚输出能力有限。SG90在堵转被卡住时电流可能瞬间很大。务必确保电源充足。可以尝试用手机充电器通过Arduino的电源接口供电或者使用外接的5V/2A电源模块单独给舵机供电注意共地。排查2信号问题。检查信号线是否接触不良是否接在了支持PWM的数字引脚上Uno的3, 5, 6, 9, 10, 11。排查3代码问题。检查Mixly中舵机模块的引脚号设置是否正确。检查角度值是否在合理范围内SG90一般是0-180有些是0-90。问题舵机转动不顺畅有抖动或回差。排查1机械负载。检查转盘是否太重或者安装不水平导致摩擦阻力过大。减轻转盘重量或改善轴承结构。排查2电源干扰。电机启停会对电源造成波动可能干扰到Arduino板本身。在舵机的电源正负极之间并联一个100μF以上的电解电容可以很好地吸收这种波动让运行更平稳。排查3程序问题。如果你在循环中频繁地、以极小的时间间隔发送不同的角度指令舵机可能来不及响应而抖动。确保每次角度改变后有足够的稳定时间。5.2 随机性不佳问题每次重启后的第一个随机数好像有规律或者多次抽奖结果感觉“不随机”。解决百分之百确认你正确执行了randomSeed(analogRead(一个悬空的模拟引脚))并且这个操作只在setup()中执行一次。如果把这个语句放在loop()里每次循环都重新初始化种子反而可能导致随机数序列在短时间内重复。5.3 Mixly编程逻辑错误问题按下按键没反应或者按一次连续转好几次。排查1按键消抖。这是按一次触发多次的元凶。务必按照前面所述添加软件消抖逻辑。排查2循环逻辑。检查你的“如果”判断条件是否正确。是“当按键按下时”执行一次抽奖还是“只要按键按着”就循环抽奖通常我们需要的是“上升沿”或“下降沿”触发即状态变化的那一刻。Mixly中可以通过变量记录上一次的按键状态与当前状态比较来实现“按下瞬间”触发。排查3变量作用域。如果你在“如果”模块内部创建了局部变量来计算角度确保这个变量在后续控制舵机时能被访问到。最好将targetAngle这类关键变量声明为全局变量在“变量”分类中创建。5.4 硬件连接排查心法当整个系统不工作时不要慌采用分治法最小系统测试拔掉所有外设只留Arduino上传一个最简单的Blink程序让板载LED闪烁确认板子和编程环境是好的。逐个添加外设先单独测试舵机。写一个让舵机在0度和180度之间来回摆动的程序看它是否正常工作。再单独测试按键。写一个读取按键状态并通过串口打印的程序确保按下和松开时串口监视器显示正确。最后将两者组合。这样一旦出现问题你就能立刻知道是新加的哪个部分引起的。调试硬件项目耐心和有条理的排查方法比任何技巧都重要。多准备一些杜邦线和万用表测量一下关键点的电压往往能发现隐藏的接触不良或短路问题。这个抽奖转盘项目麻雀虽小五脏俱全它串联起了数字输入、随机算法、PWM输出、事件驱动编程等多个核心概念。当你看到自己制作的转盘在随机指令下欢快转动时那份成就感就是学习硬件编程最大的动力。