从Arduino到机械艺术:构建稳定可靠的滚珠时钟全栈指南 1. 项目概述一个会“思考”的机械时间艺术如果你和我一样对精密的机械传动和电子控制的结合着迷那么“滚珠时钟”这个项目绝对能让你在工作室里待上好几个愉快的周末。这不仅仅是一个显示时间的装置更是一个看得见的物理计算过程30颗18毫米的钢珠在重力、电机和精巧的斜坡引导下忠实地演绎着时间的流逝。每一分钟一颗钢珠被释放沿着预设的轨道滚动最终在代表小时和分钟的刻度上堆积形成直观的视觉读数。整点时分积攒的钢珠还会倾泻而下敲响铃铛完成一次充满仪式感的报时。这个项目的魅力在于它的“全栈”性。它不像很多Arduino项目那样只是点亮几个LED或者读取传感器数据就结束了。你需要真正动手从零开始搭建一个复杂的机电一体化系统。电路上你要协调Arduino Uno、直流电机、三个微型伺服电机、实时时钟RTC和限位开关并解决随之而来的电源噪声和信号干扰问题。机械上你需要设计并制作一套精密的轨道系统确保钢珠能顺畅、可靠地运行任何一点微小的角度偏差或摩擦都可能导致整个系统卡死。我最初是被这种将抽象时间转化为实体运动的概念所吸引。市面上也有类似的套件但自己从画图、切割、组装到调试走一遍那种成就感和对系统每个细节的掌控感是完全不同的。接下来我会把我从电路设计、机械结构到代码调试的完整过程以及其中踩过的坑和总结的经验毫无保留地分享出来。无论你是想复刻一个还是从中汲取灵感用于自己的项目相信这些细节都能帮到你。2. 核心系统设计与工作原理拆解在动手画第一根线之前我们必须彻底理解这个时钟是如何“思考”和“行动”的。它的核心是一个由Arduino协调的、基于事件触发的状态机。整个系统可以看作三个协同工作的子系统动力与分钟触发系统、时间累积与显示系统、以及整点报时系统。2.1 动力与分钟触发系统的“心跳”这是整个时钟的节拍器。一个30 RPM的直流电机通过减速机构驱动一个我称之为“摩天轮”的提升装置。这个轮子周而复始地转动将位于底部收集盘中的钢珠一颗颗舀起提升到轨道系统的最高点。关键的精妙之处在于“运行/停止”控制。在提升轮顶部的出口处有一个由微型伺服电机控制的挡杆我称之为“分钟挡杆”。正常情况下挡杆会拦住被提升上来的钢珠。这颗被拦住的钢珠会同时压住一个微动开关限位开关这个开关的信号告诉Arduino“有一颗钢珠就位电机可以停了”。于是通过电机驱动模块电机停止转动。Arduino内部的程序配合高精度的DS3231 RTC模块严格地每秒检查一次时间。当新的一分钟到来时即秒数归零它会命令“分钟挡杆”伺服电机动作一次抬起挡杆约1秒钟。被释放的钢珠滚入计时轨道同时也不再压住微动开关。开关弹起Arduino检测到这个上升沿信号立即重新启动直流电机提升轮开始转动准备抓取下一颗钢珠。如此循环每分钟释放一颗为整个系统提供最基础的时间脉冲。注意这里选择30 RPM的直流电机而非步进电机是经过权衡的。直流电机配合减速箱成本低、扭矩足、运行平稳非常适合这种需要连续匀速转动的场景。而步进电机虽然控制精确但在此处无需精确定位反而可能因微步进产生振动和噪音。电机的启停控制交给了专用的TB6612FNG双H桥驱动模块它比常见的L298N效率更高、发热更小。2.2 时间累积与显示钢珠的“数学游戏”被释放的钢珠并非直接显示时间而是进入一个巧妙的“计算”轨道网络。轨道系统分为三层对应时、十分、分每层轨道有内外两条滑道。钢珠首先会进入外层滑道。当该层的外滑道被5颗钢珠填满后对于分钟层是5颗十分层是5颗*2原理相同第6颗钢珠到来时由于外滑道已满它只能滚入内滑道。滚入内滑道的动作会触发一个精巧的机械装置——一个带配重的跷跷板平衡杆。钢珠压下跷跷板的一端另一端翘起像打开闸门一样将外滑道积累的所有5颗钢珠瞬间释放让其滚落回底部的收集盘。同时这第6颗钢珠留在了内滑道代表一个“进位”。这个过程完美模拟了六进制分钟和十进制小时的累加与进位。观察轨道上内外滑道的钢珠数量就能直接读出时间。例如如果“小时”层内滑道有1颗外滑道有2颗就代表1*6 2 8点这里原作者设计为类似六进制实际可根据轨道长度自定义进制常见设计是5颗进位代表5分钟或50分钟。2.3 整点报时系统蓄力与释放的仪式感报时系统独立于显示轨道是另一个并行的“蓄能”过程。在每半小时XX:30一个由伺服电机控制的“分路器”会短暂打开约2秒。此时从提升轮上来的钢珠会被引导至一个专用的计数轨道轨道入口处有一个微动开关我称之为“钢珠计数器”。Arduino根据当前RTC的时间计算出到下一个整点还需要敲响几下铃铛例如10:30时下一个整点是11点就需要预存11颗钢珠。程序控制分路器打开让钢珠一颗颗通过计数开关Arduino进行计数。当计数达到目标数量后分路器关闭钢珠恢复流向显示轨道。这些被计数的钢珠会暂存在一个专门的“报时储存斜坡”上。当时钟到达整点XX:00另一个“报时挡杆”伺服电机会动作打开储存斜坡的闸门。储存的钢珠在重力作用下依次滚落经过一个精心设计的“鼓槌”装置拨动它去敲击下方的铃铛。一颗钢珠一声脆响。敲击完成后钢珠也回归到底部收集盘完成一次循环。3. 电路系统深度解析与稳定性设计电路是项目的大脑和神经其稳定与否直接决定了时钟是件艺术品还是一堆烦人的废铁。我的核心设计原则是模块化供电、信号隔离、电源净化。3.1 主控与电源架构设计我选择Arduino Uno作为主控源于其极高的普及度和丰富的社区资源。整个系统的供电来自一个9V/12V的直流电源适配器。这里有一个关键决策不使用Arduino的板载稳压器为外围设备供电。电机和伺服电机在启停时会产生很大的电流波动和电压尖峰。如果让它们与Arduino共用板载的5V输出这些噪声极易导致单片机复位或程序跑飞。我的方案是引入一个LM2596S DC-DC降压模块。将外部输入的9V/12V降至稳定的5V这个5V专门用于给三个9g微型伺服电机供电。同时Arduino Uno的VIN引脚也接入降压模块前的9V/12V输入利用其板载稳压器为自己生成一个独立的5V。这样电机负载的扰动被隔离在了Arduino的供电系统之外。实操心得LM2596S模块一定要用数字万用表仔细校准输出电压精确调到5.00V。空载和带载接上所有伺服电机时电压可能会略有变化确保带载时电压不低于4.8V。伺服电机在堵转时电流激增一个质量过关的降压模块是系统稳定的基石。3.2 电机与执行器驱动细节直流电机驱动采用TB6612FNG模块驱动30 RPM减速电机。相比经典的L298N它的效率更高发热小而且内置了关断电路。接线时电机的两根线接在AO1和AO2输出端。控制端PWMA接Arduino的PWM引脚如D5用于调速本项目可全速运行但PWM功能为后续调速留有余地。AIN1和AIN2接数字引脚如D6, D7控制转向。STBY引脚接高电平使能。电机电源直接取自外部电源适配器9V/12V与逻辑电源完全分离。伺服电机控制三个9g微型伺服分钟挡杆、分路器、报时挡杆的信号线橙色/黄色分别接至Arduino的三个数字PWM引脚如D9, D10, D11。红线电源全部接至LM2596S输出的5V总线黑线地接至公共地。务必确保Arduino的地GND与LM2596S及外部电源的地是连通的这是所有信号正常工作的基础。传感器与输入限位开关SS-5GL两个微动开关一个用于“运行/停止”分钟触发一个用于“钢珠计数”。它们都是常开NO型。接线时一端接Arduino的某个数字引脚如D2, D3另一端接GND。在Arduino程序中将对应引脚设置为INPUT_PULLUP模式。当开关被压下导通时引脚读到低电平LOW释放时内部上拉电阻使其为高电平HIGH。这种接法省去了外接上拉电阻。DS3231 RTC模块通过I2C接口SDA-A4, SCL-A5连接。它自带电池断电后时间依然持续。这是整个系统的时间基准精度远高于Arduino的内部时钟。按钮三个微动按钮用于设置时间时、分和复位接法同限位开关采用内部上拉按下为低电平。OLED显示屏替换方案原设计用的1602 LCD屏幕在I2C通信中非常不稳定极易受干扰显示乱码。我后期将其换成了SSD1306驱动的0.96寸OLED屏128x64同样使用I2C接口。OLED是自发光器件无需背光且驱动芯片抗干扰能力强得多显示稳定且更省电。3.3 至关重要的稳定性增强电容与电阻网络这是让项目从“能动”到“可靠”的关键一步也是很多初学者容易忽略的地方。机电系统中有三大噪声源直流电机电刷火花、伺服电机启停的电流突变、长导线引入的空间干扰。我的滤波方案如下你可以在原理图基础上按此加装电源总线去耦在LM2596S的5V输出端并联一个4700μF的电解电容注意正负极。它就像一个水库能吸收伺服电机同时动作时产生的瞬间大电流需求防止电压被瞬间拉低导致Arduino复位。在Arduino Uno的5V和GND引脚之间并联一个1000μF的电解电容。为单片机核心提供本地化的、洁净的电源。信号线滤波在每个限位开关和按钮的信号引脚与GND之间并联一个20nF0.022μF的陶瓷电容。这可以滤除机械触点抖动产生的毛刺信号防止Arduino误判为多次触发。在电机的两个电源输入端之间并联一个20nF的陶瓷电容用于吸收电刷产生的火花高频噪声。电机驱动信号隔离这是最有效的一招。在TB6612FNG的PWMA、AIN1、AIN2这三个控制信号输出端各串联一个100欧姆的电阻再连接到Arduino的对应引脚。在Arduino这一侧每个信号引脚与GND之间再并联一个20nF的陶瓷电容。这个“电阻-电容”组合构成了一个低通滤波器能极大地衰减从电机驱动端反向窜入Arduino的高频噪声保护脆弱的单片机I/O口。电阻值不宜过大否则会影响信号上升速度100欧姆是个经验值。经过这番改造后系统连续运行数周也不会出现死机或显示异常。电子设计很多时候稳定性比功能更重要。4. 机械结构制作与核心部件详解机械部分是项目的骨骼和肌肉精度和可靠性要求极高。我全部采用3mm厚的MDF板中密度纤维板进行激光切割然后通过叠加粘合的方式获得不同厚度。4.1 核心动力机构“摩天轮”提升系统提升系统由两个大齿轮直径约15cm和中间带兜勺的小轮组成。所有齿轮和轮子均由3mm MDF切割后三层粘合为9mm厚度以保证强度。轴与轴承核心转轴是一根外径12mm的铜管常见水管材料。它在两端通过21/12/5型号的深沟球轴承内径12mm外径21mm厚度5mm支撑。轴承被嵌入MDF制作的轴承座中。铜管的好处是内径标准强度足够且易于加工钻孔固定。动力传递直流电机通过一组减速齿轮驱动其中一个主齿轮。我使用了30 RPM的电机经过一级减速后最终提升轮的转速被设计为大约每6-8秒提升一颗钢珠这样给钢珠在顶部释放和滚动留出了充足时间。防漏球设计最初版本中钢珠在进入提升轮的兜勺时有时会从侧面滑出。我在下层大齿轮上围绕每个兜勺入口额外增加了四个激光切割的弧形“围栏”零件见Postizo rueda admision.dxf粘合后形成导流槽完美解决了问题。装配要点齿轮和轮子与铜管的固定不能只靠紧配合。我在铜管与零件接触的位置钻了通孔拧入M3沉头螺丝进行径向锁紧确保不会打滑。两端的轴承也需要用MDF制作端盖并用细钢丝穿过铜管和端盖上的小孔来防止轴向窜动。4.2 轨道系统钢珠的“高速公路”轨道系统是工程难点需要兼顾流畅性、准确性和可调试性。轨道倾角所有主要轨道的倾斜角度经过反复测试最终定为4度。这个角度能确保钢珠在自身重力下获得稳定且不过快的速度。速度太快容易飞出轨太慢则可能卡住。我用Fusion 360设计时直接设置了4度的斜面切割出来就是准确的。轨道宽度钢珠直径18mm轨道内宽我设计为19mm。这1mm的间隙是关键既能保证钢珠不会卡死又能防止其左右晃动幅度过大导致跑偏。制作时用5层3mm板共15mm和2层2mm板共4mm粘合形成19mm的内宽严丝合缝。“S”形导流弯道这是确保钢珠正确进入内外双轨道的核心。弯道被设计成逐渐收紧的“S”形迫使钢珠以近乎垂直的角度“射入”轨道最外侧。只有外侧轨道被填满后后来的钢珠才会因外侧无路可走而“挤”进内侧轨道从而触发跷跷板完成进位清零动作。这个弯道的曲率需要多次打样测试。跷跷板平衡杆机构这是实现自动进位的关键机械逻辑。它是一根中间有转轴的长杆位于轨道下方。一端位于内侧轨道的入口下方另一端延伸出去粘有一根作为配重的12mm铜管。当钢珠滚入内侧轨道时会压下跷跷板的前端后端配重抬起后端连接着一个挡板该挡板会抬起并打开外侧轨道的出口让积攒的钢珠全部滚落。配重铜管的长度需要调试以确保触发力道恰到好处。4.3 报时与回流机构分路器由一个小型伺服电机驱动一个拨片构成。在XX:30时伺服电机转动将拨片插入轨道将后续钢珠引导至计数轨道。计数完成后拨片收回。拨片与轨道的间隙要极小防止钢珠漏过。计数轨道与储存斜坡计数轨道上有一个微动开关每滚过一颗钢珠就触发一次Arduino进行累加。储存斜坡的倾斜度要更缓一些约2-3度防止堆叠的钢珠因自重过大而提前“冲开”报时挡杆。“鼓槌”敲击机构这是一个巧妙的能量转换设计。储存的钢珠释放后滚入一个带有偏心配重的转鼓。钢珠冲击转鼓的一侧使其旋转。转鼓上安装了一个敲击臂旋转时带动敲击臂摆动敲响铃铛。转鼓的配重需要精细调整确保敲击有力且能自动回位。我在转鼓内部空腔粘了一个小钢珠作为配重外部又贴了配重铅片通过多次试验找到平衡点。底部收集盘与防拥堵设计这是后期改进的重点。最初的设计中从不同轨道回来的钢珠在底部汇集容易堆挤在一起形成“拱桥”堵塞提升轮的入口导致系统停机。我重新设计了收集盘将其改造成一个“Y”型汇流通道。两个来源的钢珠以很小的锐角约30度汇入主通道并确保它们运动方向一致形成单列纵队进入提升区。同时在汇流点后方设置了一个小隔板打散可能形成的堆积。这个改动彻底解决了卡球问题。5. 软件逻辑与Arduino代码剖析代码是项目的灵魂它定义了所有硬件如何协同工作。我的编程能力有限但借助现代工具如ChatGPT辅助生成代码框架和清晰的逻辑梳理完全可以实现复杂控制。5.1 程序主框架与状态管理程序采用非阻塞的millis()定时器来控制所有时序避免使用delay()导致整个程序卡住。核心逻辑围绕几个关键状态变量展开// 核心状态变量示例 bool motorRunning false; // 电机运行状态 unsigned long lastMinuteEvent 0; // 上次分钟触发时间 int ballsToChime 0; // 需要敲击的钢珠数 int ballsCounted 0; // 已计数的钢珠数 enum ClockState { NORMAL, COUNTING_BALLS, CHIMING } currentState; // 系统状态主循环loop()不断做以下几件事读取RTC从DS3231获取当前时分秒。更新显示在OLED上显示当前时间、系统状态等信息。检查分钟触发如果当前秒为0且与上次触发不在同一分钟则执行releaseBallForMinute()函数控制“分钟挡杆”伺服动作。检查“运行/停止”开关检测对应引脚电平。如果是HIGH开关未被压下且电机未运行则启动电机如果是LOW开关被压下即有钢珠就位则停止电机。同时这里有一个安全计时器如果电机连续运行超过120秒意味着没有钢珠来压住开关则强制停止电机并报警防止电机空转损坏。状态机处理NORMAL状态在每分钟的第30秒即second 30切换到COUNTING_BALLS状态启动分路器伺服开始准备报时钢珠。COUNTING_BALLS状态监听“钢珠计数器”开关。每触发一次ballsCounted加一。当ballsCounted达到ballsToChime根据下一整点计算得出时关闭分路器状态切回NORMAL。CHIMING状态在整点second 0 minute 0切换到该状态打开“报时挡杆”伺服释放储存的钢珠。用一个定时器控制12秒后关闭挡杆状态切回NORMAL并重置ballsCounted。5.2 关键功能函数与参数调试伺服控制函数为每个伺服编写独立的控制函数如moveMinuteLocker()。函数内使用myservo.write(angle)控制角度。关键点在动作前后加入短暂的delay(20)给伺服留出反应时间但整个函数执行时间要短不能阻塞主循环。伺服的目标角度需要根据实际机械安装位置进行校准没有标准值。报时钢珠数计算calculateBallsToChime()函数。逻辑是如果当前时间在XX:30则下一个整点是(XX1):00需要敲击(currentHour 1) % 12颗钢珠12小时制0点计为12下。这里可以根据你的铃铛声音喜好修改逻辑。按钮去抖与长按检测用于时间设置和复位按钮。使用millis()记录按下时间当检测到引脚持续低电平超过50ms时认为有效按下超过3000ms3秒时触发复位操作。去抖逻辑能有效防止误触发。OLED显示使用Adafruit_SSD1306和Adafruit_GFX库。显示内容应简洁清晰包括当前时间、电机状态运行/停止、报时计数状态等。避免频繁刷新整个屏幕只更新变化的部分以提升性能。代码调试心得不要试图一次性写完所有代码。应该分模块测试。先单独测试RTC读写和OLED显示。再单独测试每个伺服电机的转动角度。然后测试电机启停与限位开关的联动。最后再把所有逻辑整合起来。串口打印Serial.println()是你的好朋友在各个阶段输出关键变量值能快速定位问题。例如在计数状态打印ballsCounted的值就能清楚知道钢珠是否被正确检测到。6. 组装、调试与故障排除实录组装顺序至关重要建议遵循“从内到外从下到上”的原则。6.1 分阶段组装流程第一阶段底座与核心框架。先完成15mm厚胶合板底座的切割和开孔安装好内部的LM2596模块、Arduino Uno扩展板建议先用扩展板连接所有线再插到Uno上便于维修和伺服电机。然后安装四根8mm直径的立柱确保它们绝对垂直且间距准确这是整个轨道系统的“地基”。第二阶段动力总成。组装“摩天轮”提升系统包括齿轮、轴承、铜轴和电机。将其安装到底座上。暂时不装上传动皮带或齿轮先单独通电测试电机正反转和转速是否正常。第三阶段轨道骨架。从最底部的收集盘开始逐层向上安装支撑件和轨道。先安装后侧的斜坡和回流“竖环”再安装前侧的显示轨道。每一层安装后都手动放入钢珠测试滚动是否顺畅特别是弯道和衔接处。此时不要粘死任何零件用蓝丁胶或小夹子临时固定。第四阶段集成与布线。安装所有伺服电机分钟挡杆、分路器、报时挡杆并连接钢丝拉线或连杆到对应的机械部件。安装所有微动开关并调整其触发位置这是精细活需要耐心。开始布线将电机、伺服、开关的线缆整齐地捆扎并引到底座内。建议使用不同颜色的杜邦线并在两端做好标签。第五阶段通电联调。这是最激动人心也最头疼的阶段。先不上钢珠给系统通电。测试每个伺服能否正确归位和动作。手动触发“运行/停止”开关看电机能否正确启停。在Arduino代码中模拟分钟触发观察分钟挡杆动作是否正常。逐步加入钢珠从一颗开始测试观察其从收集、提升、释放、滚动到回流的完整路径。重点关注容易卡住的点提升轮入口、轨道衔接处、跷跷板触发点、分路器开口、报时储存斜坡出口。6.2 常见问题与解决方案速查表以下是我在制作和调试过程中遇到的主要问题及解决方法希望能帮你少走弯路。问题现象可能原因排查与解决方案电机不转或转动无力1. 电源功率不足。2. TB6612FNG驱动模块未使能或接线错误。3. 电机本身损坏或齿轮卡死。1. 检查电源适配器额定电流是否大于1A建议2A。用万用表测量电机输入端电压是否正常。2. 检查STBY引脚是否接高电平5V。检查PWMA是否给高电平或PWM信号AIN1/AIN2转向信号是否正确。3. 断开电机与机械结构的连接空载测试电机是否转动。伺服电机抖动或不动作1. 电源电压不足或电流不够。2. 信号线接触不良。3. 机械负载过重卡死。1. 确保LM2596输出为稳定的5V且其输入电源足够。伺服动作时测量5V总线电压不应低于4.8V。2. 检查信号线连接。尝试用Arduino示例代码Sweep单独测试该伺服。3. 断开伺服与机械结构的连接看空载时是否正常。如果正常则优化机械结构减少阻力。钢珠在轨道某处卡住1. 轨道倾斜角度不合适。2. 轨道内有毛刺或胶水残留。3. 轨道间隙过窄或过宽。4. 钢珠自身有磁性或油污导致粘连。1. 微调支撑柱的高度或垫片改变局部倾角。用水平仪辅助。2. 用细砂纸600目以上仔细打磨轨道内壁确保光滑。3. 检查轨道宽度确保在19mm左右。过窄会卡过宽会左右晃导致脱轨。4. 使用无磁性的不锈钢轴承钢珠。清洁钢珠表面。分钟触发不规律或漏触发1. “运行/停止”微动开关位置不准或触发力度不够。2. 开关信号抖动程序误判。3. 分钟挡杆伺服动作角度或速度不当钢珠未完全释放。1. 精细调整开关位置确保钢珠能稳稳压住。可在开关触发臂上粘一小块轻木片增加杠杆长度。2. 在代码中为开关信号增加软件去抖逻辑或如前述在硬件上并联20nF电容。3. 调整伺服动作角度确保挡杆抬起高度足够让钢珠顺利滚过。适当加快伺服速度但不宜过快以免冲击。报时计数不准1. 计数轨道上的微动开关灵敏度或位置问题。2. 钢珠在计数轨道上滚动速度过快连续触发。3. 分路器打开时间太短或太长。1. 同“运行/停止”开关调整位置和杠杆。确保每颗钢珠能且仅能触发一次。2. 增加计数轨道的长度或减小倾角降低钢珠速度。或在代码中增加“计数后短暂延时”的逻辑防止一次滚过触发多次。3. 调整分路器伺服的打开时间程序中可调确保有足够时间让所需钢珠通过但又不会让多余钢珠进入。系统运行一段时间后死机或显示乱码1. 电源噪声干扰导致Arduino复位或程序跑飞。2. LCD屏I2C通信受干扰原设计问题。3. 程序中有内存泄漏或逻辑错误。1.这是最常见的问题严格按照第3.3节所述加装所有滤波电容和隔离电阻。2.强烈建议将LCD更换为OLED屏一劳永逸。如果坚持用LCD尝试降低I2C通信速度并在VCC和GND间并联更大的电容如100μF电解100nF陶瓷。3. 检查代码中全局变量是否过多避免在循环中动态创建对象。使用看门狗Watchdog功能增强稳定性。整点报时钢珠不释放或释放不完整1. 报时挡杆伺服力度不够或卡住。2. 储存斜坡倾角太小钢珠因摩擦力无法滚下。3. 储存斜坡出口与“鼓槌”机构对位不准。1. 检查伺服扭矩是否足够9g微型伺服扭矩较小必要时可换更大扭矩的。优化机械连接减少摩擦。2. 稍微增大储存斜坡的倾角例如从2度调到3度。确保斜坡内壁光滑。3. 仔细调整报时挡杆和下方导流槽的位置确保钢珠能准确落入鼓槌机构。6.3 最后的点睛之笔外观与保护当所有功能调试无误后就可以进行最后的美化。我用砂纸打磨了所有MDF零件的边缘然后涂上胡桃木色的木器染色剂。待干透后喷上两层哑光清漆既能保护木质又能获得细腻的质感。为了防尘和降低钢珠滚动的噪音我为其制作了一个亚克力展示罩。用20*20mm的木条制作框架在中间开槽将3mm厚的透明亚克力板嵌入其中。罩子底部与时钟底座通过角码连接可以轻松取下进行维护。完成后的滚珠时钟不仅是一个精准的计时器更是一个充满机械美学的动态雕塑。看着钢珠周而复始地运行听着整点时清脆的铃铛声你会觉得所有投入的时间和精力都是值得的。这个项目教会我的远不止Arduino编程或激光切割更是一种系统性的工程思维如何让电子与机械对话如何通过迭代调试解决层出不穷的问题最终将一个复杂的想法变成手中稳定运行的现实。