基于Adafruit Crickit与CPX的智能弹珠轨道:嵌入式系统与3D打印实践
1. 项目概述一个会发光的自动化弹珠世界几年前我在一个创客展上第一次看到Tulio Laanen设计的那个螺旋上升式弹珠轨道就被它那种机械的、近乎催眠的美感深深吸引了。弹珠沿着预设的轨道周而复始地滚动发出清脆的声响整个过程充满了物理的确定性与偶然性。当时我就在想如果能给它加上“大脑”和“肌肉”让它不仅能自动运行还能根据环境做出反应、发出绚丽的光那该多酷。这个想法一直搁置着直到我遇到了Adafruit Crickit和Circuit Playground Express (CPX)这套组合。Crickit就像是一个强大的“外挂骨骼”为CPX这颗聪明的“大脑”提供了驱动电机、伺服舵机、大功率LED等执行器的能力而CPX本身集成了加速度计、光线传感器、温度传感器、麦克风等十多种传感器。这意味着我们不再需要为了一个简单的电机驱动而去研究复杂的电机驱动芯片和电路设计也不再需要为了读取传感器而焊接一堆分压电阻。所有的接口都标准化了用几根杜邦线就能连接起来剩下的精力可以全部投入到“让这个东西变得有趣”这件事本身上。于是这个基于Adafruit Crickit与3D打印的电动弹珠轨道项目就诞生了。它的核心目标很简单复活那个经典的螺旋轨道设计并赋予它新的生命。我们通过一个减速电机驱动轨道底部的蜗杆将弹珠从底部源源不断地提升到顶部利用CPX板载的传感器我们可以让轨道对声音、光线甚至温度做出反应而环绕在轨道周围的NeoPixel UV LED灯带则能在黑暗中勾勒出轨道蜿蜒的轮廓并可以编程实现流水、彩虹、随声音律动等各种光效。这不仅仅是一个玩具。它是一个完整的嵌入式系统与微控制器编程的实践案例。从读懂电路图、焊接基础线缆到使用MakeCode进行图形化或JavaScript编程再到3D打印件的后处理与精密组装整个过程涵盖了智能硬件开发的多个核心环节。无论你是想为孩子的STEAM教育寻找一个充满成就感的项目还是一个想快速验证创意的硬件爱好者亦或是一个寻找独特展品的互动装置艺术家这个项目都能提供一条清晰、有趣且极具观赏性的实践路径。2. 核心硬件选型与设计思路解析为什么是这一套特定的硬件组合这是项目成功的基础。每一件选品背后都有其明确的工程考量而不仅仅是“随便找几个能用”的部件。2.1 控制核心Circuit Playground Express 与 Crickit 的黄金搭档Circuit Playground Express (CPX)是这个项目的大脑。选择它而非更基础的Arduino Uno或Micro:bit主要基于三点极高的集成度一块板子上集成了10个可编程RGB NeoPixel灯、运动传感器加速度计陀螺仪、温度传感器、光线传感器、声音传感器、电容触摸引脚甚至还有一个红外接收发射器。这意味着我们想要实现“互动”功能时几乎不需要额外焊接任何传感器模块大大简化了电路和结构设计。双模编程友好它完美支持MakeCode图形化编程和CircuitPython代码编程。对于初学者和快速原型开发MakeCode的拖拽积木块方式直观无比当需要实现更复杂逻辑时可以无缝切换到CircuitPython享受Python语法带来的便捷。本项目以MakeCode为例但其逻辑可轻松移植。强大的社区与生态作为Adafruit的明星产品CPX有极其丰富的教程、库文件和项目案例任何遇到的问题几乎都能在社区找到答案。而Adafruit Crickit则是项目的肌肉和神经中枢。CPX本身驱动能力有限每个IO引脚只能输出约20mA电流根本无法直接驱动电机或长串LED。Crickit的作用就是解决这个问题电机驱动它提供了4路大电流每路1A峰值的直流电机或步进电机驱动端口我们项目中的TT减速电机正是连接于此。伺服驱动提供8路伺服舵机接口虽然本项目未使用但为后续扩展比如增加一个挡板机关留足了空间。NeoPixel专用端口提供带电平转换和电源保护的专用接口能稳定驱动多达数百颗NeoPixel LED避免因电源问题烧毁昂贵的灯带。安全电源管理Crickit有独立的电源输入接口允许我们使用更高的电压如本项目中的4.5V AA电池组为电机和LED供电同时通过板载稳压器为CPX提供稳定的3.3V电源实现了强弱电的分离与保护。这个组合的哲学是“各司其职”CPX负责思考传感器数据处理、逻辑判断和下达指令通过I2C总线与Crickit通信Crickit负责执行提供大电流驱动。这种架构清晰、安全且极具扩展性。2.2 动力与传动TT减速电机的考量电机我们选择了TT减速电机1:90齿轮比。这里有几个关键点为什么需要减速箱弹珠的提升需要较大的扭矩但速度不必太快。普通直流电机转速高、扭矩小根本带不动装满弹珠的螺旋轨道。减速箱通过齿轮组将高速低扭矩转换为低速高扭矩这正是我们需要的。1:90的减速比意味着电机轴转90圈输出轴才转1圈提供了充足的力量。“TT”规格这是一种非常普及的电机规格意味着其安装孔位、轴径都是标准的很容易找到配套的联轴器、轮子和像本项目中的3D打印支架兼容性极佳。金属齿轮项目选用的是全金属齿轮版本。相比塑料齿轮金属齿轮更耐用能承受更大的负载和更长时间的运行尤其是在可能发生的卡珠虽然设计上尽量避免等意外情况下可靠性更高。2.3 光影灵魂NeoPixel UV LED灯带光影效果是让项目从“机械”升华到“艺术”的关键。我们选择了NeoPixel UV LED灯带。NeoPixel的优势每个LED像素点都集成了驱动芯片只需要一根信号线就能控制整条灯带上任意一颗灯的颜色和亮度极大地简化了布线。CPX和Crickit都有现成的、经过优化的积木块或库函数来控制它编程非常简单。选择UV紫外线版本这是一个营造氛围的巧思。UV光本身肉眼可见为淡蓝色但它能激发许多材料如某些塑料、荧光涂料发出荧光。如果你使用透明或半透明的彩色PLA打印轨道或者在轨道上涂上荧光颜料在UV灯带的照射下会产生非常梦幻的发光效果比普通RGB灯带更有一层神秘感。2.4 结构之基3D打印设计精要原设计由Tulio Laanen完成其精妙之处在于整个复杂的螺旋轨道是单一打印件无需组装。这要求极高的模型设计水平和合理的支撑设置。我们设计的底座enclosure需要完美承载所有电子部件其设计考量包括精确的配合公差底座上的立柱standoffs需要与CPX的安装孔、Crickit的安装孔严丝合缝。在Fusion 360设计中通常会给螺丝孔留出比螺丝直径大0.2-0.3mm的间隙用于补偿3D打印可能发生的微小收缩。线缆管理空间底座内部并非实心而是设计了走线槽和空腔让电池线、电机线、USB线能规整排布避免杂乱无章甚至干扰运动部件。散热与可维护性电机和电子元件长时间工作会发热。底座侧面的开槽和顶部的开放设计有利于空气流通。同时设计考虑了模块化安装电机支架可以单独取下方便按下CPX的复位按钮进入编程模式。支撑结构策略如指南所述电机支架部分因为存在悬空结构打印时必须添加支撑。使用可剥离的支撑材料如Breakaway或设置支撑接口层Interface Layer是关键它能确保支撑在提供必要承托的同时后期易于拆除且不损伤模型表面。3. 电路连接详解与安全规范正确的电路连接是项目稳定运行和硬件安全的生命线。我们按照从电源到负载的逻辑顺序一步步梳理。3.1 电源系统安全与控制的起点整个系统的电源架构是双路的电机和LED由电池组直接经Crickit驱动CPX主板由Crickit内部稳压后供电。电池组与开关我们使用一个3节AA电池盒输出约4.5V。为了安全地开关总电源我们需要将一个SPDT滑动开关串联进电池的正极线路中。具体操作是剪断电池盒红色正极导线将断开的两端分别焊接在开关中间和一侧的引脚上。务必在焊接前先套好热缩管这是一个非常关键的安全习惯能有效防止短路。焊接完成后用热风枪或打火机小心加热收缩热缩管使焊点绝缘。连接至Crickit将改装后的电池组插头通常是2.1mm直流插头插入Crickit上标有“Power”的端口。注意正负极不要接反Crickit的端口有防呆设计一般不会插错。3.2 电机接线动力传输TT电机通常只引出两根线红正、黑负。我们需要为其焊接上公对公杜邦线以便接入Crickit的螺丝端子。焊接要点电机引脚较小焊接时使用尖头烙铁温度控制在350°C左右。先给电机引脚和杜邦线金属头分别上锡然后将两者贴合加热焊接。焊接时间不宜过长以免热量损坏电机内部线圈。焊好后同样用热缩管进行绝缘保护。接入Crickit找到Crickit上标有“Motor 1”或“Motor 2”的端子排。用小型螺丝刀拧松其中一个端子的螺丝将电机红线插入再拧紧螺丝。黑线接入同组另一个端子。接入哪个端子决定了电机初始转向如果后续发现转向反了在软件中调整或调换这两根线即可。3.3 NeoPixel灯带连接信号与供电NeoPixel灯带有三根线5V红、GND白或黑、Din绿或黄数据输入。供电连接将灯带的5V和GND线分别接入Crickit上“NeoPixel”端口旁的“5V”和“GND”螺丝端子。重要务必确保电源极性正确接反会瞬间烧毁整条灯带信号连接将灯带的Din线接入Crickit“NeoPixel”端口标有箭头→符号的端子。这个箭头方向代表信号流向必须正确。3.4 CPX与Crickit的对接大脑与躯干的神经连接这是最简单也最关键的一步。将已经安装好黄铜螺柱的CPX像“三明治”一样对齐扣在Crickit上。Crickit背面有6个通孔正好对应CPX上的6个螺柱。使用套件中提供的短螺丝从Crickit背面拧入CPX的螺柱即可将两者牢固固定。它们之间通过板对板连接器自动完成了I2C通信和供电的连接无需任何额外接线。安全提示在整个接线过程中务必确保电池开关处于“关闭”状态。完成所有连接并反复检查无误后再打开电源开关。首次通电时建议先不要安装弹珠观察电机和LED是否按预期工作无异响或异味。4. MakeCode图形化编程实战对于快速原型开发和初学者入门MakeCode的图形化编程环境是无与伦比的。我们将一步步构建一个既能让弹珠自动运行又能实现声音互动光效的程序。4.1 环境搭建与项目初始化首先用USB线将CPX连接至电脑。访问Adafruit MakeCode网站你会看到一个类似Scratch的编辑器。设置CPX如果这是你第一次使用这块CPX需要先将其设置为MakeCode模式。按住板子上的“Reset”按钮直到所有LED变成绿色此时电脑上会出现一个名为“CPLAYBOOT”的U盘。从MakeCode网站下载对应的UF2固件文件拖入这个U盘即可。完成后CPX会自动重启。添加Crickit扩展在MakeCode编辑器中点击“高级” - “扩展”。在搜索框中输入“crickit”找到并添加“Adafruit Crickit”扩展包。添加成功后左侧积木区会出现一个红色的“CRICKIT”类别里面包含了控制电机、伺服、NeoPixel的所有积木。新建项目我们可以从头开始也可以打开项目提供的示例代码链接作为基础进行修改。示例代码通常包含了最基础的电机控制和LED测试。4.2 核心逻辑构建自动运行与传感器触发我们的程序主要包含两个并行的逻辑线程一个是让电机持续运行的后台任务另一个是响应传感器事件的中断处理。4.2.1 电机控制逻辑在“当开机时”积木中我们需要初始化电机。从“CRICKIT”类别中拖出“set crickit servo 1 to 0°”积木将其下拉菜单改为“set crickit motor 1 to 100%”。这个积木用于设置电机1的速度和方向100%代表全速正转-100%代表全速反转0%代表停止。 为了让电机一开机就转我们可以直接把这个积木放在“当开机时”下面。但更好的做法是将其放在一个“无限循环”中虽然对于恒定速度来说效果一样但这为后续实现更复杂的速度变化例如模拟加速留下了结构空间。// MakeCode 图形化积木逻辑示意以文字描述 当开机时 设置 CRICKIT 电机 1 速度 为 80%这里我将速度设为80%而非100%。这是一个经验值全速运行可能扭矩过大导致蜗杆与弹珠摩擦过响甚至在某些打印件略有公差时产生振动。80%的速度既能保证稳定提升弹珠又更安静、更节能。4.2.2 声音触发光效这是让项目变得“聪明”和有趣的关键。我们将使用CPX板载的麦克风声音传感器。检测声音阈值在“输入”类别中找到“当响度 100 时”积木。这个积木是一个事件触发器当检测到的声音强度超过设定阈值100时就会执行它内部的代码。你可以通过实际拍手测试来调整这个阈值。设计光效当检测到拍手时我们让NeoPixel灯带做出反应。例如实现一个从中间向两侧扩散的红色“心跳”效果。首先从“CRICKIT”类别拖出“set crickit neopixel 颜色”积木我们需要先设置灯带长度。在“当开机时”里添加“set crickit neopixel 灯带长度 为 30”假设你的灯带有30颗灯。然后在“当响度 100 时”的事件内部编写光效逻辑。我们可以使用“循环”和“暂停”积木来创造动画。// 文字描述对应的积木逻辑 当响度 150 时 将 索引 设为 0 循环 15 次 设置 CRICKIT neopixel 在 位置 (15 索引) 颜色为 红色 设置 CRICKIT neopixel 在 位置 (15 - 索引) 颜色为 红色 将 索引 增加 1 暂停 50 毫秒 循环 15 次 设置 CRICKIT neopixel 在 位置 (30 - 索引) 颜色为 关闭 设置 CRICKIT neopixel 在 位置 (0 索引) 颜色为 关闭 将 索引 增加 1 暂停 50 毫秒这段代码的效果是拍手后灯带从中间第15颗灯开始同时向左右两边点亮红色点亮速度由“暂停50毫秒”控制。点亮全部后再从两端向中间熄灭。你可以发挥创意替换成彩虹循环、颜色渐变等任何效果。4.2.3 环境光自适应进阶我们还可以加入更多智能。例如让灯带在环境光较暗时自动开启在明亮时关闭以省电。使用“光线传感器”积木在“输入”类别。在“无限循环”中加入一个判断逻辑如果光线水平 50则设置NeoPixel为某种低亮度模式否则关闭NeoPixel。4.3 代码上传与调试编写完成后点击编辑器左下角的“下载”按钮会下载一个.uf2文件。此时确保你的CPX处于可编程模式按一次Reset键所有LED变红色后松开出现“CPLAYBOOT”盘符。将下载的.uf2文件拖入该盘符CPX会自动重启并运行新程序。调试心得电机不转首先检查Crickit上的电机端子螺丝是否拧紧电线是否被夹牢。然后在MakeCode中检查电机速度是否被设为0。最后用万用表测量电池电压是否充足。灯带不亮或部分不亮最常见的原因是5V和GND接反或者Din信号线接触不良。确保接线顺序正确且牢固。如果只有一部分灯不亮可能是其中一颗NeoPixel芯片损坏导致信号中断需要更换整条灯带或剪掉损坏部分。传感器不灵敏调整阈值。在MakeCode中你可以将“响度”或“光线水平”等传感器读数直接显示在CPX的LED点阵上这样就能直观地看到当前值从而设置一个合理的触发阈值。5. 3D打印与机械组装全流程电子部分调试成功后一个坚固、美观的机械结构是项目长期稳定运行的基础。3D打印的质量和组装的精度直接决定了最终效果。5.1 3D打印参数优化与后处理原项目提供了针对Ultimaker打印机和CURA切片软件的推荐参数但对于使用其他打印机如Creality, Prusa等的朋友需要理解参数背后的逻辑并进行调整。层高与壁厚推荐层高0.2mm0.4mm喷嘴或0.3mm0.8mm喷嘴。对于轨道这种需要光滑表面以保证弹珠流畅滚动的部件更低的层高意味着更小的台阶纹路。外壁厚度Wall Thickness建议至少设置为喷嘴直径的2-3倍如0.8mm或1.2mm以确保结构强度。填充密度底座和电机支架等承重结构件填充密度建议在25%-40%之间使用网格或蜂窝填充模式在保证强度的同时节省材料和时间。轨道本身作为展示件填充可以降到15%-20%。支撑策略这是成败关键。电机支架有悬空部分必须开启支撑。支撑类型选择“仅从构建板开始”避免在模型内部产生难以拆除的支撑。强烈建议使用“支撑接口”Support Interface功能在支撑与模型接触的顶部生成一层致密的、易于剥离的薄层。如果条件允许使用可溶性如PVA或易剥离如Breakaway的支撑材料是最好选择。打印方向轨道打印时应确保螺旋面与构建板平行。这样虽然需要大量支撑来支撑整个螺旋面但能保证轨道表面的打印质量层纹方向与弹珠运动方向垂直影响较小。如果尝试竖直打印以节省支撑则轨道侧面的层纹会严重影响弹珠滚动。后处理打印完成后小心拆除所有支撑。对于PLA材料可以使用小钳子、镊子和刮刀进行清理。之后用细砂纸如400目、800目轻轻打磨轨道表面特别是弹珠接触的区域去除毛刺和台阶纹。这一步能显著提升弹珠滚动的顺滑度和静音效果。5.2 分步组装指南与技巧组装顺序很重要合理的顺序能避免反复拆装。安装CPX螺柱使用套件提供的黄铜螺柱和螺母将其固定在CPX板背面的6个安装孔上。不要拧得过紧以免损坏PCB。组装电机模块先将TT电机用两颗M3x25mm长螺丝固定到3D打印的电机支架上。注意电机出线的方向应朝向支架开口一侧便于后续走线。然后将这个电机-支架组合体用四颗M3x6mm短螺丝固定到CPX板的正面。此时电机轴应垂直于CPX板向上。集成Crickit将已经装有电机和螺柱的CPX板对齐Crickit背面的孔位用六颗短螺丝从Crickit背面拧入CPX的螺柱。确保连接器完全插紧。整体装入底座将Crickit/CPX/电机这个“三明治”模块放入3D打印的底座内对齐底座的立柱和Crickit上的安装孔用M3x4mm或类似长度螺丝从底座底部向上固定。安装开关与面板将滑动开关从底座侧面的方孔由内向外推出可能需要轻微弯曲开关的金属固定片以适应开孔公差。将USB延长面板用螺丝固定在底座侧面并将其Micro USB母头插到CPX的USB口上。连接所有线缆将电池组线带开关插入Crickit的Power口。将电机线接入Crickit的Motor 2端子。将NeoPixel灯带沿底座内壁布置LED朝向轨道中心并将其5V、GND、Din线接入Crickit的NeoPixel端子。将USB延长线的另一端引出底座备用。安装轨道与齿轮这是最后一步。将巨大的螺旋轨道对准底座顶部的卡槽轻轻旋转并按压直到它“咔嗒”一声卡紧。最后将打印好的蜗杆齿轮中心的D形孔对准电机轴轻轻按下去。然后在齿轮顶部依次盖上“锁紧盖”和“旋转盖”。组装避坑指南螺丝滑丝3D打印的塑料螺纹比较脆弱。拧螺丝时一定要垂直旋入感觉有阻力后稍加力即可切勿过度用力。如果感觉拧入困难可以先用M3丝锥攻一下孔或者用电烙铁加热螺丝尖端后再拧入热熔法。电机轴与齿轮配合过紧如果齿轮很难套上电机轴千万不要用锤子硬敲。可以用小锉刀或砂纸稍微打磨一下电机轴的棱角或者用吹风机加热齿轮的D形孔使其轻微膨胀后再安装。轨道卡弹珠如果打印的轨道表面有突出的疙瘩或支撑残留弹珠很容易卡住。组装前务必用手电筒仔细检查轨道内部并用内径稍大的钻头或打磨头手动清理关键弯道。6. 系统调试、优化与扩展思路完成组装和编程后真正的乐趣才刚刚开始——调试、优化并思考如何让它变得更好。6.1 初始测试与常见问题排查装入3-5颗钢珠建议从少开始打开电池开关。你应该听到电机平稳的嗡嗡声看到弹珠被缓慢提升到轨道顶端然后开始它们漫长的循环之旅。NeoPixel灯带应发出预设的光效。问题速查表现象可能原因排查步骤完全无反应1. 电池开关未开或电池没电。2. 电池线或开关焊接点虚焊/断开。3. Crickit与CPX连接不良。1. 检查开关用万用表测电池电压。2. 重新检查并焊接电源通路各节点。3. 重新拔插CPX与Crickit的连接器。电机不转但灯亮1. 电机线未接牢或接错端子。2. MakeCode程序中电机速度设置为0。3. 电机本身损坏或负载卡死。1. 拧紧电机端子螺丝交换两根线测试。2. 检查MakeCode中“set motor speed”积木的值。3. 断开电机与齿轮的连接空载测试电机是否转动。电机转动但弹珠不提升1. 齿轮未与电机轴咬合打滑。2. 蜗杆与轨道内部的提升器未啮合。3. 弹珠过多或轨道有阻碍负载过大。1. 确保齿轮的D形孔与电机轴完全套紧。2. 手动旋转齿轮观察是否带动内部机构。3. 减少弹珠数量检查轨道是否光滑。NeoPixel灯带不亮或乱闪1. 5V/GND接反。2. Din信号线接触不良。3. 电源功率不足电池老化。4. 程序未设置灯带长度或长度设错。1.立即断电检查接线顺序。2. 重新固定Din线端子。3. 更换全新电池测试。4. 检查MakeCode中“set strip length”是否正确。声音/光线传感器不触发1. 传感器阈值设置不当。2. 程序逻辑错误如事件积木放错位置。3. 环境干扰过于嘈杂或明亮。1. 在程序中临时添加显示传感器读数的代码根据读数调整阈值。2. 确保事件积木如“当响度...时”在循环外它是独立的事件监听器。6.2 性能优化与个性化系统运行稳定后可以从以下几个方面进行优化和个性化降低噪音电机运行和弹珠滚动是主要噪音源。在电机支架和底座接触面添加一小片薄海绵或橡胶垫作为减震层。在轨道的关键支撑点背面粘贴毛毡或泡沫胶带也能有效吸收振动噪音。提升流畅度在弹珠的必经之路特别是弯道和接驳处使用特氟龙干膜润滑剂或婴儿爽身粉进行轻微润滑能显著减少摩擦和卡顿。切勿使用油性润滑剂会吸附灰尘且难以清理。光效升级MakeCode的NeoPixel库功能强大。你可以尝试编写更复杂的光效比如追逐效果让光点跟随弹珠一起运动需要精确计算弹珠位置较复杂。频谱可视化利用CPX的麦克风分析声音频率让灯带颜色随音乐节奏变化。温度映射用CPX的温度传感器读数映射到灯带的颜色如蓝色到红色渐变。增加交互性利用CPX的电容触摸引脚A1, A2, A3...在底座上贴上铜箔或导电织物作为触摸按键。触摸时可以改变电机速度、切换光效模式等。6.3 项目扩展思路这个项目的平台性很强Crickit和CPX的能力远未被完全利用。增加伺服舵机机关在轨道中途设计一个“岔路口”用一个微型伺服舵机控制挡板。编程实现当拍手时挡板切换让弹珠进入另一条分支轨道。电磁弹射起点在轨道起点用Crickit驱动一个电磁铁线圈。当弹珠滚回起点时电磁铁通电产生推力给弹珠一个初始加速让它爬升更有力。多轨道同步制作2-3个相同的轨道单元用一个CPX和Crickit统一控制需要电机驱动扩展板。编程让它们的灯光和电机速度同步或交替形成更壮观的阵列效果。数据记录与展示使用CircuitPython编程让CPX记录电机运行时间、弹珠循环次数、环境温湿度等数据并通过串口发送到电脑甚至显示在一块小型OLED屏幕上。这个项目最吸引我的地方在于它完美地体现了创客精神的闭环从数字建模Fusion 360设计到物理制造3D打印再到智能嵌入微控制器编程最后实现物理互动。看着自己编写的代码转化为电机真实的转动和灯光绚丽的变换那种跨越虚拟与现实的成就感是纯软件或纯硬件项目都无法比拟的。它既是一个令人着迷的桌面玩具也是一个扎实的嵌入式系统学习平台。希望你在复现和改造它的过程中也能享受到这种创造的乐趣。