
1. 项目概述一个可穿戴的“手臂炮台”如果你对创客项目感兴趣尤其是那些结合了机械、电子和编程还能戴在身上的玩意儿那么这个“可穿戴式弹射器”绝对能让你眼前一亮。它本质上是一个戴在小臂上的微型“炮台”核心功能是利用橡皮筋的弹力将一枚轻质叶片弹射出去并且通过两个前轮电机在发射瞬间给叶片一个额外的推力让它飞得更远。整个系统的“大脑”是Adafruit的Circuit Playground Express开发板它负责感知你的手臂动作比如向下倾斜并控制所有执行部件而驱动电机和伺服舵机的“肌肉”则交给了它的黄金搭档——CRICKIT扩展板。项目融合了激光切割、3D打印、基础电路焊接和Arduino编程是一个综合性极强的DIY入门项目非常适合想从纯软件编程跨入物理计算和互动装置领域的朋友或者希望做一个炫酷的、可穿戴的“玩具”来参加创客展览的爱好者。我最初看到这个项目构想时觉得它巧妙地将简单的物理原理弹性势能与嵌入式控制结合了起来。它不像一些复杂的机器人项目那样令人望而生畏其机械结构直观电子部分有成熟的开发板兜底编程逻辑也清晰。但真正动手做下来你会发现从“图纸”到“成品”中间有很多细节决定了最终的可靠性和使用体验。比如如何确保橡皮筋每次都能被稳定地挂住和释放如何让叶片在轨道里顺畅滑动而不卡住电机的推力如何与橡皮筋的弹力配合这些都是在教程步骤之外需要自己反复调试和琢磨的地方。接下来我会结合自己的制作经验把这个项目从头到尾拆解一遍不仅告诉你每一步怎么做更会重点分享那些容易踩坑的环节和我的解决方案。2. 核心组件选型与设计思路解析2.1 为什么是Circuit Playground CRICKIT对于这样一个需要传感器输入、多路电机控制和灯光反馈的项目核心控制器的选型至关重要。我选择Adafruit的Circuit Playground Express后面简称CPX和CRICKIT组合是基于以下几个非常实际的考虑首先开发效率与低门槛。CPX本身集成了加速度计、光线传感器、温度传感器、麦克风、10个可编程RGB NeoPixel LED还有多个触摸感应引脚。这意味着我们需要的“倾斜触发”功能直接用板载的加速度计就能实现无需额外焊接传感器大大简化了硬件连接。而CRICKIT扩展板则完美解决了电机驱动的难题。它提供了4路舵机/电机驱动端口可驱动舵机或小型直流电机、2路大电流电机驱动端口适合我们的CD/DVD电机、1路大电流NeoPixel驱动、以及多个模拟/数字输入输出口。把CPX插到CRICKIT上所有驱动问题迎刃而解我们不需要再去研究复杂的电机驱动电路如H桥避免了电源干扰、电流不足导致电机不转或烧板子的风险。其次供电与便携性。这个项目是可穿戴的供电必须方便。CPX和CRICKIT都可以通过其上的JST PH电池接口直接连接一个3.7V的锂聚合物电池。但在这个项目中原作者使用了3节AAA电池盒约4.5V这其实是个很稳妥的选择。AAA电池容易获取电压也适合驱动微型舵机和CD电机。CRICKIT板载了高效的稳压电路能将这个电压安全地分配给CPX和各个外设。整个供电方案简单、安全、易于更换。最后编程生态与社区支持。Adafruit为这套体系提供了极其完善的软件支持。无论是使用基于Blocks的MakeCode图形化编程非常适合初学者快速实现逻辑还是使用Arduino IDE进行更底层的C代码编写都有丰富的库和示例代码。当你在调试中遇到问题时庞大的用户社区和详细的教程能提供很大帮助。相比之下如果使用更基础的开发板如Arduino Uno你需要自己连接加速度计模块、寻找并连接电机驱动模块、处理电源管理整个系统的复杂度和出错概率会呈指数级上升。注意市面上有一些国产的兼容CPX或CRICKIT的板子价格可能更便宜。但在项目初期尤其是学习阶段我强烈建议使用正版Adafruit产品。它们的质量、文档和软件库支持是最可靠的能帮你排除很多硬件兼容性导致的玄学问题。2.2 机械结构设计从功能反推形态这个弹射器的机械设计非常聪明它完全从功能出发结构清晰。我们可以把它拆解为几个核心模块发射模块由后部的微型舵机、橡皮筋和释放机构组成。舵机旋转一个特定角度解除对橡皮筋的锁定橡皮筋收缩的弹力推动叶片前进。这是整个装置的“扳机”。加速模块由两个前部的CD/DVD电机或微型舵机及其连接的轮子组成。当叶片被橡皮筋推出经过这两个高速旋转的轮子时会获得额外的向前摩擦力从而增加出射速度。这模仿了某些弹射装置中的“辅助推进”概念。导向模块由激光切割的亚克力轨道组成。它确保叶片在发射过程中沿直线运动不会偏转或翻滚这是保证发射精度和重复性的关键。承载与穿戴模块包括激光切割的中密度纤维板MDF底座、针织腕带以及魔术贴Hook Loop。底座将所有部件整合在一起腕带提供舒适和可调节的佩戴体验魔术贴实现了模块化——电池、CRICKIT、底座都可以快速粘贴和拆卸便于充电、调试和收纳。材料选择的考量底座MDF中密度纤维板激光切割MDF非常普遍它成本低易于切割有足够的强度支撑电机和舵机且重量较轻。缺点是怕水边缘可能掉粉。如果追求更耐用和精致可以使用亚克力或椴木板。轨道亚克力亚克力透明易于观察叶片运行状态表面光滑摩擦系数低有利于叶片滑动激光切割精度高能做出非常笔直的轨道。叶片哑光纸板/Mat Board选择轻质材料是关键。哑光纸板重量轻易于激光切割成型成本极低。叶片太重会飞不远太软又容易变形。哑光纸板是一个很好的平衡。你也可以尝试更轻的巴沙木片。腕带针织材料弹性针织腕带比固定长度的尼龙粘扣带更舒适能适应不同粗细的手臂佩戴压力分布更均匀。这种“功能模块化”的设计思路使得调试和维护变得非常方便。例如如果加速模块效果不理想你可以单独调整电机的转速或轮子的材质而不影响发射模块。3. 硬件制作与组装全流程详解3.1 激光切割部件的准备与处理激光切割是制作这个项目结构件的核心工艺。你需要准备三个文件底板的DXF或SVG文件、轨道的文件、以及叶片的文件。这些文件通常需要根据你实际采用的电机、舵机尺寸进行微调确保安装孔位匹配。实际操作要点材料厚度与功率设置向你的激光切割服务商或自己操作机器时务必明确材料类型和厚度。例如MDF底板可能用6mm厚亚克力轨道用3mm厚哑光纸板用2mm厚。不同的材料和厚度需要不同的激光功率和切割速度。建议先用边角料进行测试切割找到最佳参数避免功率不足切不透或功率过大烧焦材料。底板MDF的处理切割完成后MDF边缘可能会有一些激光灼烧产生的焦痕。可以用细砂纸如400目轻打磨边缘使其光滑避免木刺扎手。如果追求美观可以在表面喷涂一层哑光清漆既能保护板材也能让外观更统一。轨道亚克力的安装面处理亚克力切割后边缘通常是光滑的。但需要与底板粘贴的背面建议用砂纸稍微打磨一下增加表面积这样在使用胶水粘贴时会粘得更牢固。非常重要的一点在将轨道粘到底板上之前一定要先进行“试运行”。即不涂胶水先将轨道放在底板对应位置手动模拟叶片滑动确保轨道绝对平行且距离合适叶片能无阻碍地通过。一旦粘歪后期极难调整。叶片哑光纸板的优化原设计可能是一个简单的矩形叶片。你可以尝试在叶片尾部设计一个小的“尾翼”或挖减重孔以优化其在空中的飞行姿态减少翻滚。但要注意任何修改都不能增加太多重量且必须保证叶片在轨道内的滑动顺畅。3.2 机械部件的组装与调试这一步是将静态的零件变成动态机构的关键。步骤一安装轨道与魔术贴按照设计底板上有让魔术贴穿过的缝隙。将魔术贴钩面或毛面剪成合适长度从底板下方穿过在正面留出足够粘贴的长度。然后将亚克力轨道对准位置暂时用手压住。此时不要急着粘轨道先把穿出来的魔术贴粘在轨道下方的底板正面这样魔术贴同时也起到了临时固定轨道的作用。再次确认轨道平行度后使用胶水最终固定轨道。我推荐使用CA胶快干胶俗称“哥俩好”类配合加速剂或者环氧树脂AB胶。热熔胶虽然方便但在这个项目上强度不足长时间使用后容易在震动下开裂。在轨道两端和中间点几滴胶水即可避免胶水溢出到轨道内侧影响叶片滑动。步骤二安装电机与舵机前部加速电机这里原作者提供了两个选项——CD/DVD光驱里的直流电机或者微型舵机。我强烈建议使用微型舵机。原因如下CD/DVD电机需要额外的驱动电路虽然CRICKIT可以驱动而且其转速极高但扭矩很小需要搭配合适的滑轮Pulley和橡胶圈才能有效摩擦推动叶片。这个过程调试起来很麻烦转速控制也不如舵机精准。而一个普通的9g微型舵机如SG90我们可以通过程序将其设置为连续旋转模式Continuous Rotation Servo这样就可以精确控制它的旋转速度和方向。安装时使用强力胶或螺丝将舵机固定在底板前部预留的位置上确保两个舵机的转轴高度一致且它们带动的轮子可以用小号O型圈或特氟龙胶带自制刚好能轻轻接触到底板表面未来叶片会在轮子和底板之间被摩擦推进。后部发射舵机这个舵机负责释放橡皮筋。它的安装角度需要精心设计。你需要在其舵盘舵机自带的圆盘上安装一个“撞针”或“挡杆”。当舵机处于初始位置时这个挡杆要能钩住被拉长的橡皮筋当舵机旋转一定角度如60度时挡杆移开释放橡皮筋。安装时务必先不粘死舵机而是接上电通过程序控制它转到初始位置然后手动调整舵机机身的角度使得挡杆能稳稳地钩住橡皮筋再进行固定。这个位置差一点都会导致释放失败。步骤三挂载橡皮筋与连接电路橡皮筋是动力源它的选择和挂载方式直接影响发射力度和可靠性。橡皮筋选择不要用太细或老化的橡皮筋。选择扁平的、弹性好的乳胶橡皮筋。可以尝试不同长度和厚度来调整发射力量。挂载点在底板后部两侧应该有专门用于固定橡皮筋的孔或柱。将橡皮筋一端固定然后拉伸到后部舵机的挡杆处挂好。橡皮筋的预拉伸长度即初始张力需要调试太松则无力太紧则可能让舵机无力释放或损坏结构。电路连接将两个前部加速舵机连接到CRICKIT的伺服电机端口如Servo 1, Servo 2。将后部发射舵机连接到另一个伺服端口如Servo 3。将LED灯带的数据输入线Din焊接到CPX上的任何一个数字IO口例如A1并确保灯带、CPX、CRICKIT共地GND。将3节AAA电池盒的输出线连接到CRICKIT的电源输入端注意正负极。3.3 3D打印外壳与整体集成给CRICKIT设计一个3D打印外壳不仅能保护电路板还能方便地通过魔术贴固定在腕带上。你可以在Thingiverse等网站搜索“CRICKIT Case”通常能找到现成的模型。打印时建议使用PLA材料填充率15%-20%即可兼顾强度和重量。打印完成后用小型螺丝将CRICKIT固定在外壳内。然后在外壳背面粘贴魔术贴的钩面。对应的在针织腕带上缝制或粘贴魔术贴的毛面。这样整个控制单元就可以像徽章一样贴在手臂上了。最后的总装顺序应该是将带有所有电机、轨道的底板通过其背面的魔术贴固定在第一条腕带上。将电池盒粘贴在底板附近或另一条腕带上。将装有CRICKIT和CPX的外壳粘贴在第一条腕带靠近手腕的位置便于操作和观察LED。连接所有电线电池盒到CRICKIT舵机到CRICKITLED到CPX。用扎带或胶带整理好线束避免缠绕或拉扯。4. 核心代码逻辑与传感器编程代码是这个项目的灵魂它定义了装置的交互行为。我们将使用Arduino IDE和Adafruit的库进行编程。首先确保你已安装了Adafruit CircuitPlayground库和Adafruit CRICKIT库。4.1 硬件初始化与伺服电机设置#include Adafruit_CircuitPlayground.h #include Adafruit_Crickit.h // 初始化CRICKIT对象 Adafruit_Crickit crickit; // 定义舵机端口 #define SERVO_LAUNCH 1 // 后部发射舵机接CRICKIT Servo 1 #define SERVO_LEFT 2 // 左前加速舵机接CRICKIT Servo 2 #define SERVO_RIGHT 3 // 右前加速舵机接CRICKIT Servo 3 // 定义舵机对象 servo_t servoLaunch; servo_t servoLeftWheel; servo_t servoRightWheel; // 发射舵机角度常量 const int SERVO_LAUNCH_LOCK 0; // 钩住橡皮筋的角度 const int SERVO_LAUNCH_RELEASE 60; // 释放橡皮筋的角度 void setup() { Serial.begin(115200); // 初始化CPX if (!CircuitPlayground.begin()) { Serial.println(CPX init failed!); while (1); } // 初始化CRICKIT if (!crickit.begin()) { Serial.println(CRICKIT init failed!); while (1); } // 初始化舵机 servoLaunch crickit.servo_init(SERVO_LAUNCH); servoLeftWheel crickit.servo_init(SERVO_LEFT); servoRightWheel crickit.servo_init(SERVO_RIGHT); // 设置舵机频率通常为50Hz crickit.servo_setFreq(SERVO_LAUNCH, 50); crickit.servo_setFreq(SERVO_LEFT, 50); crickit.servo_setFreq(SERVO_RIGHT, 50); // 将发射舵机置于锁定位置 crickit.servo_setPulsewidth(servoLaunch, angleToPulse(SERVO_LAUNCH_LOCK)); // 将前轮舵机设置为停止状态连续旋转舵机的中位值需校准 crickit.servo_setPulsewidth(servoLeftWheel, 1500); // 1500us通常为停止 crickit.servo_setPulsewidth(servoRightWheel, 1500); // 初始化CPX的LED灯带 CircuitPlayground.clearPixels(); }关点解析angleToPulse是一个需要你自己实现的函数用于将角度0-180转换为舵机控制所需的脉冲宽度通常500-2500微秒。不同品牌舵机中点可能略有差异。对于前轮加速舵机我们将其设置为连续旋转模式。这种模下给1500微秒脉冲舵机停止大于1500向一个方向转小于1500向反方向转。具体停止值需要根据你的舵机进行微调。4.2 倾斜触发与发射逻辑我们利用CPX板载的加速度计来检测手臂向下倾斜的动作作为发射的触发条件。// 倾斜触发阈值根据实验调整 const float TILT_THRESHOLD -0.7; // 当Z轴加速度小于此值向下认为倾斜 const unsigned long DEBOUNCE_TIME 500; // 防抖时间毫秒 unsigned long lastLaunchTime 0; void loop() { // 读取加速度计数据单位重力加速度g float x, y, z; CircuitPlayground.motionX(x); CircuitPlayground.motionY(y); CircuitPlayground.motionZ(z); // Z轴指向电路板垂直方向 Serial.print(Z: ); Serial.println(z); // 调试用观察Z值 // 检查是否向下倾斜且距离上次发射已过防抖时间 if (z TILT_THRESHOLD (millis() - lastLaunchTime DEBOUNCE_TIME)) { launchSequence(); lastLaunchTime millis(); } delay(50); // 主循环延迟 } void launchSequence() { Serial.println(Launch Detected!); // 1. 触发LED发射动画 playLaunchAnimation(); // 2. 启动前部加速轮提前一点启动确保叶片到达时轮子已全速 crickit.servo_setPulsewidth(servoLeftWheel, 1300); // 假设1300us为正向全速 crickit.servo_setPulsewidth(servoRightWheel, 1700); // 假设1700us为正向全速注意方向可能相反需调整 delay(100); // 让轮子加速到全速 // 3. 释放发射舵机发射叶片 crickit.servo_setPulsewidth(servoLaunch, angleToPulse(SERVO_LAUNCH_RELEASE)); delay(300); // 保持释放状态一段时间确保橡皮筋完全弹出 // 4. 复位发射舵机重新挂上橡皮筋需要手动或另设机构此处仅为代码示例 crickit.servo_setPulsewidth(servoLaunch, angleToPulse(SERVO_LAUNCH_LOCK)); // 5. 停止前部加速轮 crickit.servo_setPulsewidth(servoLeftWheel, 1500); crickit.servo_setPulsewidth(servoRightWheel, 1500); // 6. 重置LED CircuitPlayground.clearPixels(); }逻辑详解倾斜检测我们主要关注Z轴加速度。当手臂自然下垂时Z轴感受到的重力分量为负值。通过设置一个TILT_THRESHOLD如-0.7g当Z值小于这个阈值时认为用户做出了“发射”姿势。DEBOUNCE_TIME用于防止一次倾斜动作被误判为多次触发。协同时序launchSequence函数是发射过程的核心。注意我让加速轮先启动delay(100)再释放发射舵机。这是因为电机从静止到全速需要一点时间。如果同时触发叶片可能已经滑过轮子轮子还没达到最佳推动转速。这个延迟时间需要根据你的具体电机和叶片在轨道上的滑行速度进行实测调整。舵机复位代码中演示了舵机回到锁定位置。但在实际物理结构中发射后橡皮筋是松驰的你需要手动将橡皮筋重新挂到挡杆上或者设计一个自动上弦的机构会更复杂。这是当前设计的一个交互点意味着每次发射后需要手动准备下一次发射。4.3 LED动画效果编程利用CPX的10颗NeoPixel LED可以增加炫酷的视觉效果。例如一个从中间向两边扩散的发射动画。void playLaunchAnimation() { // 快速闪烁红色模拟准备 for(int i0; i3; i){ CircuitPlayground.setPixelColor(4, 255, 0, 0); // 中间LED CircuitPlayground.setPixelColor(5, 255, 0, 0); delay(100); CircuitPlayground.clearPixels(); delay(100); } // 发射流光动画从中心向两端 for(int i0; i4; i) { // 点亮中心向两侧对称的LED CircuitPlayground.setPixelColor(4-i, 0, 255, 0); // 绿色 CircuitPlayground.setPixelColor(5i, 0, 255, 0); delay(50); // 控制流光速度 } delay(100); }你可以发挥创意设计更复杂的颜色渐变、彩虹波等效果让设备更具个性。5. 调试、优化与问题排查实录即使完全按照步骤制作第一次也几乎不可能完美运行。以下是你在调试过程中一定会遇到并且必须解决的几个典型问题。5.1 机械部分常见问题问题1叶片发射无力或根本射不出去。可能原因A橡皮筋力量不足或老化。排查用手拉一下橡皮筋感觉弹性。或者更换更粗、更短的橡皮筋试试。解决选用弹性好的新橡皮筋。可以尝试将橡皮筋对折成双股使用增加拉力。可能原因B发射舵机释放角度不对或力度不够。排查观察舵机动作。它是否旋转到了预定角度挡杆是否完全移开没有刮蹭到橡皮筋舵机在挂载橡皮筋的张力下是否还能顺畅转动解决调整舵机的安装角度和挡杆的形状。确保在锁定位置挡杆能牢牢钩住橡皮筋在释放位置挡杆能彻底远离橡皮筋的运动路径。如果舵机扭矩太小如9g舵机而橡皮筋太紧可能导致舵机“堵转”此时需要更换扭矩更大的舵机如25g或改用更细的橡皮筋。可能原因C轨道摩擦阻力太大。排查不挂橡皮筋手动推动叶片在轨道内滑动感觉是否顺滑。解决用干布清洁轨道内侧。如果轨道是亚克力本身已经很光滑问题可能在于叶片。检查叶片边缘是否有毛刺用砂纸打磨光滑。也可以在叶片底部涂抹一点点干性润滑剂如石墨粉。问题2叶片飞行轨迹不稳定乱翻跟头。可能原因A叶片自身不对称或重心不稳。解决确保叶片激光切割后形状对称。可以在叶片尾部粘一条极轻的胶带作为尾翼增加空气动力学稳定性。可能原因B两个前加速轮转速不一致或接触压力不同。排查目测两个轮子旋转是否都积极有力。用一张小纸片分别靠近两个轮子测试其“吸力”或推力是否相似。解决在代码中微调两个舵机的脉冲宽度使它们的转速尽可能一致。物理上检查两个舵机的安装高度和角度确保轮子与底板平面的接触情况相同。问题3设备戴在手上晃动影响瞄准。解决这是可穿戴设备的通病。首先确保魔术贴粘贴牢固。其次可以增加腕带的宽度或者使用两条腕带分别固定前臂和上臂分散设备重量。最后发射时手臂最好有一个支撑点比如另一只手托住发射臂的手腕。5.2 电子与代码部分常见问题问题1舵机/电机不转或抽搐。可能原因A供电不足。这是最常见的问题。所有舵机同时工作特别是加速舵机启动瞬间电流需求很大。排查使用万用表测量电池盒空载电压。3节新AAA电池应在4.5V以上。然后接上负载整个系统在发射瞬间测量CRICKIT电源输入端的电压如果电压跌落严重如低于3.7V说明电池内阻太大或电量不足。解决更换全新的碱性AAA电池。或者升级供电方案使用一块3.7V 500mAh以上的锂聚合物电池通过CRICKIT的JST接口供电。锂电池能提供更大的瞬间放电电流系统会稳定得多。可能原因B信号线接触不良或接错。排查检查所有连接到CRICKIT的舵机线是否插紧信号线通常是黄色或橙色对准“S”标识。检查LED灯带的焊接点是否虚焊。可能原因C舵机类型设置错误。解决确认你的前轮舵机是否已被修改为连续旋转模式。标准舵机无法360度连续旋转需要购买已改好的型号或自行拆开调整不推荐新手操作。问题2倾斜触发不灵敏或误触发。可能原因A阈值TILT_THRESHOLD设置不当。排查与解决在loop()函数中打印出Z轴的加速度值Serial.println(z)。观察手臂在自然下垂和抬起时Z值的变化范围。将阈值设置在这个范围的中间偏下位置。例如静止水平时Z≈1垂直向下时Z≈-0.8那么阈值可以设为-0.3到-0.5进行试验。可能原因B没有防抖处理。解决确保代码中包含了DEBOUNCE_TIME逻辑。人体动作会有抖动一次倾斜可能会产生多个低于阈值的数据点。防抖时间如500毫秒能确保一次动作只触发一次发射。问题3LED灯带不亮或颜色错乱。可能原因A数据线接错或焊接不良。解决NeoPixel灯带对数据线顺序非常敏感。确保数据流向正确CPX引脚 - 灯带Din。检查焊接点是否牢固有无短路。可能原因B未正确初始化或供电不足。解决确保代码中调用了CircuitPlayground.begin()和CircuitPlayground.clearPixels()。如果灯带较长可能需要单独供电。但CPX板载的10颗LED其电源由CPX管理一般没问题。5.3 进阶优化建议当基本功能实现后你可以尝试以下优化让项目更上一层楼增加发射模式通过CPX上的按钮切换模式。例如模式一倾斜触发单发模式二按下按钮连发模式三声控触发利用CPX麦克风。加入状态反馈用LED颜色表示不同状态。例如蓝色待机红色闪烁橡皮筋未挂载可通过在发射机构处增加一个微型限位开关检测绿色准备就绪。改进自动上弦这是最大的机械挑战。可以设计一个由另一个微型舵机驱动的“上弦滑块”机构发射后自动将橡皮筋拉回并挂到挡杆上。但这会显著增加机械复杂度和程序逻辑。量化性能用高速手机摄像头慢动作拍摄发射过程测量叶片飞行的初速度和距离。尝试更换不同粗细的橡皮筋、调整前轮转速记录数据找到最优配置。这个项目从想法到实现最大的乐趣和收获就在于不断的调试和优化。每一个小问题的解决都会让你对机械结构、电子控制和程序逻辑有更深的理解。它不仅仅做出了一个好玩的弹射器更是一套完整的、关于如何将创意转化为实物的方法论实践。当你终于看到叶片被稳定地弹射出去划出一道漂亮的轨迹时那种成就感是纯粹的代码项目无法给予的。