1. 项目概述:当《宇宙小子》遇见创客硬件
如果你和我一样,既是《宇宙小子》的粉丝,又对用硬件把动画里的酷炫道具带到现实世界充满兴趣,那么这个项目绝对会让你兴奋。今天要聊的,就是如何用一块小小的Adafruit Circuit Playground Express开发板(后面简称CPX),通过微软的MakeCode图形化编程工具,亲手制作出剧中石榴的掌中宝石——就是那个能代表红宝石和蓝宝石融合、发出炫目光芒的玩意儿。
这不仅仅是一个简单的LED灯项目。它的核心在于复现“融合”这一关键动画情节:通过按下板载按钮,触发一段色彩旋转变换的动画,最终定格在石榴标志性的品红色光芒上,并且还能用另一颗“宝石”同步互动。整个过程涉及图形化编程逻辑设计、NeoPixel环形灯的高级色彩与动画控制、简单的音乐合成,以及利用红外通信实现双设备协同。对于刚接触嵌入式开发或STEAM教育的朋友来说,这是一个绝佳的入门项目,它把抽象的编程概念和电子原理,包装成了一个看得见、摸得着、还能玩的流行文化产物。你不需要事先精通C++或Python,只需要拖拽积木块,就能见证代码如何驱动硬件,创造出魔法般的视觉效果。
2. 核心硬件与工具选型解析
2.1 为什么是Circuit Playground Express?
在开始动手前,我们得先搞清楚手头的“武器”。Adafruit Circuit Playground Express是这个项目的绝对核心。选择它,而非其他更基础的开发板(如Arduino Uno)或更复杂的(如ESP32),是基于几个非常实际的考量:
首先,高度集成与开箱即用。CPX在一块圆形的板子上集成了项目所需的所有关键部件:10颗可独立编程的RGB NeoPixel LED组成一个环形灯、两个实体按键(标记为A和B)、一个红外发射接收器、一个蜂鸣器(用于播放音乐),以及多种传感器。这意味着你不需要为了点亮LED而去焊接电阻和LED,也不需要为了播放声音而外接复杂的音频模块。所有东西都已经就位,大大降低了硬件搭建的复杂度和出错概率,让你能专注于编程逻辑和创意实现。
其次,对MakeCode的完美支持。CPX是微软MakeCode平台官方深度支持的硬件之一。这意味着在MakeCode的在线编辑器中,你可以直接找到为CPX所有功能量身定制的图形化积木块,从控制每一颗NeoPixel的颜色,到发送红外信号,再到播放自定义旋律,都只需要拖拽即可完成。这种软硬件的高度整合,为教育场景和快速原型开发提供了无与伦比的便利性。
最后,供电与便携性。CPX可以通过Micro-USB接口供电,也可以使用外接的3节AAA电池盒。后者对于“掌中宝石”这样的可穿戴项目至关重要。电池盒搭配一个简单的腕带或表带,就能轻松将设备固定在手掌上,实现真正的可穿戴互动,而不是一个必须连着电脑的演示品。
2.2 项目物料清单与备选方案
根据项目需求,你需要准备以下核心物料:
- Adafruit Circuit Playground Express开发板:至少一块。如果想实现双宝石互动,则需要两块。这是项目的大脑和心脏。
- 3xAAA电池盒(带开关和JST插头):为CPX提供移动电源。务必选择带开关的型号,方便随时断电。JST插头能与CPX的电池接口完美对接。
- AAA碱性电池:3节,为电池盒供电。
- Micro-USB数据线:用于连接电脑和CPX,进行程序烧录。
- CPX专用保护外壳(可选但推荐):一个塑料或硅胶外壳,能保护板载元件免受刮擦和静电损伤,同时也让成品看起来更精致、更像一个“宝石”。
- 腕带或固定带:用于将宝石固定在手掌上。可以是手表带、弹力绳,甚至自己用丝带DIY。
注意:在采购CPX时,请确保你拿到的是“Express”版本,而不是早期的“Classic”版本。Express版本功能更强大,且对MakeCode的支持更好。Adafruit官网是可靠的购买渠道。
如果手头没有CPX,是否有替代方案?理论上,任何支持NeoPixel和MakeCode的开发板都可以尝试,例如Adafruit的Circuit Playground Bluefruit,或者某些基于ATSAMD21芯片的板子。但CPX的生态最完善,教程和社区支持也最丰富,对于首次尝试者来说,它能帮你避开许多兼容性“坑”。
3. 开发环境搭建与MakeCode入门
3.1 初识MakeCode:从积木块到机器码
MakeCode的核心设计哲学是“可视化编程”。它将复杂的代码语句(如变量声明、循环控制、函数调用)封装成一块块色彩鲜明、形状各异的“积木”。用户通过鼠标拖拽这些积木并进行拼接,就像搭乐高一样构建程序逻辑。这对于编程初学者、艺术家、教育工作者来说,极大地降低了心理门槛和技术壁垒。
其背后的技术原理可以简单理解为:MakeCode编辑器是一个运行在浏览器中的集成开发环境。当你完成积木拼接后,编辑器会将这些图形化逻辑实时编译(翻译)成底层微控制器能够识别的机器代码(对于CPX,通常是C++代码,并最终编译为ARM机器码),然后打包成一个.uf2格式的二进制文件。当你将CPX通过USB连接到电脑,并进入启动加载模式(Bootloader)后,电脑会将其识别为一个名为CPLAYBOOT的U盘,你只需将生成的.uf2文件拖入这个“U盘”,程序便会自动烧录到CPX的闪存中。整个过程无需安装复杂的编译器或驱动,非常友好。
3.2 第一步:访问编辑器与连接硬件
- 打开MakeCode for Adafruit:在浏览器中访问
https://makecode.adafruit.com/。这是Adafruit定制的MakeCode版本,预置了所有CPX及其他Adafruit板卡的专属积木块。 - 创建新项目:点击“新建项目”,为你的项目起个名字,比如“Garnet‘s Gem”。
- 连接硬件:用Micro-USB线将CPX连接到电脑。首次连接时,电脑可能需要一点时间来安装驱动。
- 进入Bootloader模式:这是关键一步。为了烧录程序,你需要让CPX进入编程模式。找到板子上的“重置”按钮(Reset)。快速双击它。此时,板子上的所有LED会变成红色,然后变为绿色,最后电脑会弹出一个名为
CPLAYBOOT的新驱动器。这表明CPX已准备好接收新程序。
实操心得:双击“重置”按钮的速度要快,间隔最好在半秒内。如果没成功,多试几次。成功进入Bootloader模式后,CPX会断开与MakeCode编辑器的模拟器连接,这是正常现象。烧录完成后,再次单击“重置”按钮,程序就会开始运行。
4. 单宝石融合特效的代码实现
4.1 项目初始化与灯光基础设置
任何程序都需要一个起点。在MakeCode中,这个起点是当开机时积木块。所有只需要执行一次的初始化设置都应该放在这里。
首先,我们从“循环”类别中拖出当开机时积木块到编辑区。接下来,我们要设置宝石的初始状态:一半红宝石(红色),一半蓝宝石(蓝色)。
- 设置亮度:从“灯光”类别中,找到
设置亮度为 255积木块,拖入当开机时块内。亮度值范围是0-255,255最亮。但为了省电和眼睛舒适,我们一开始不用全亮。将数值改为30,这是一个温和且足够清晰的亮度。 - 设置环形灯颜色:从“灯光”类别中,找到
显示环形灯颜色为 红积木块。这个积木块下方有10个小圆圈,代表板子上的10颗NeoPixel。点击每个小圆圈,可以单独设置其颜色。- 我们的目标是:左边5颗灯(从顶部顺时针数,大约位置)设为红色(Ruby),右边5颗灯设为蓝色(Sapphire)。
- 操作方法:用鼠标依次点击左边5个圆圈,在颜色选择器里点选红色;再依次点击右边5个圆圈,选择蓝色。
- 技巧:你可以先点击第一个圆圈选红色,然后按住鼠标从第一个拖到第五个,可以快速填充一片区域。
现在,你的初始化代码应该看起来像这样:
当开机时 设置亮度为 30 显示环形灯颜色为 [红,红,红,红,红,蓝,蓝,蓝,蓝,蓝]点击编辑器左下角的“模拟器”按钮,你应该能看到一个虚拟的CPX,其环形灯呈现红蓝各半的效果。这验证了我们的基础设置是正确的。
4.2 按钮交互与融合动画逻辑
接下来是实现核心功能:按下B键,触发从红蓝到品红(石榴色)的融合动画。
- 创建按钮事件:从“输入”类别中,拖出
当按钮 A 被按下积木块。点击积木上下拉菜单,将A改为B。这个积木块定义了一个“事件监听器”:当B键被单击时,块内的所有代码会按顺序执行。 - 添加融合动画:从“灯光”类别中,找到
显示动画 彩虹 持续 500 毫秒积木块,拖入当按钮 B 被按下块内。- 点击
彩虹下拉菜单,选择彗星动画。这个动画效果是灯光像彗星一样旋转,非常适合表现能量汇聚、融合的过程。 - 将持续时间从
500毫秒改为1500毫秒(即1.5秒)。这给了动画足够的时间来营造戏剧效果。
- 点击
- 设定融合后颜色:动画结束后,宝石应该稳定在石榴的品红色。在动画积木块下方,再添加一个
显示环形灯颜色为 红积木块。这次,点击颜色选择器,选择一个明亮的品红色(Magenta),并将所有10个灯圈都设置为这个颜色。 - 增加闪光特效:为了增强融合的瞬间感,我们可以在变色后加入一个快速的亮度闪烁。
- 添加
设置亮度为 255积木块,将值设为120(一个很高的亮度)。 - 从“循环”类别添加
暂停(ms) 100积木块,将暂停时间改为500毫秒。这会让高亮度保持半秒。 - 再添加一个
设置亮度为 255积木块,将值改回30。这样,在短暂的闪耀后,亮度恢复常态,留下品红色的宝石光芒。
- 添加
至此,融合的代码逻辑就完成了。你可以点击模拟器里的B按钮,或者将代码下载到实体的CPX上测试效果。按下B键,你应该看到红蓝灯光开始旋转,然后瞬间变为品红色并伴随一次闪光。
4.3 解融合与音乐功能的添加
有融合,自然要有解融合。解融合的代码逻辑与融合类似,但过程相反。
- 复用代码块:在MakeCode编辑器中,右键点击刚才创建的
当按钮 B 被按下积木块,选择“复制区块”。将复制出来的块拖到旁边。 - 修改事件与内容:将新块的按钮从
B改为A。现在,这个块用来响应A键单击,即解融合。 - 调整动画与颜色:删除块内最后三个关于亮度闪烁的积木块(设置高亮、暂停、设置低亮),我们解融合时不需要闪光。
- 将
彗星动画改为闪烁动画,持续时间改为300毫秒。这模拟了宝石分离时的星光闪烁效果。 - 将最后的
显示环形灯颜色为积木块中的颜色,重新设置为初始的红蓝各半状态。
- 将
- 加入主题音乐:让宝石在融合或解融合时播放《宇宙小子》的主题曲片段,体验更沉浸。我们使用“音乐”类别下的积木。
- 设置节奏:在
当开机时块内,添加将节奏设为(bpm) 120积木块。BPM(每分钟节拍数)控制音乐播放速度,120是一个中等偏快的节奏,可以根据喜好调整。 - 创建音乐函数:为了代码整洁,我们将较长的乐谱封装成一个“函数”。点击编辑器底部的“高级”,展开后点击“函数”,然后选择“创建一个函数...”。将其命名为
themeSong。 - 编写乐谱:在新建的
函数 themeSong块内,从“音乐”类别拖入演奏音符 中音C 持续 半拍积木块。通过复制、修改音符和时长,逐步构建出主题曲的旋律。例如,一个简单的开头可以是:C(1/6拍)、G(1/6拍)、C(1/6拍)、休止符(1/4拍)…… 你可以根据网上找到的简谱或通过听音来还原。 - 调用函数:在
当按钮 B 被按下块内,在闪光特效之后(或之前,根据你想要的效果),从“函数”类别拖入调用 themeSong积木块。这样,每次融合时都会播放这段音乐。
- 设置节奏:在
注意事项:蜂鸣器音量可能较大,且音质比较电子化。你可以通过
设置音量 127积木块(在“音乐”类别)来调整音量。同时,播放音乐时会短暂阻塞其他代码执行(直到播完),所以动画和灯光变化最好在音乐开始前完成设置。
5. 双宝石红外联动方案剖析
单宝石版本已经很有趣,但双宝石互动才是真正还原剧中“融合”概念的精髓。我们需要让两颗宝石(即两块CPX板)能够无线通信,同步它们的状态。
5.1 红外通信原理与限制
CPX板载了一个红外发射器和接收器,可以像电视遥控器一样发送和接收简单的数字信号。在这个项目中,我们用它来传递按钮按下的消息。
工作原理:
- 发送端:当一块CPX的按钮被按下时,它通过红外LED发射一串调制过的光信号,信号中编码了一个我们预设的数字(比如按B键发送数字1)。
- 接收端:另一块CPX的红外接收器检测到这串光信号,将其解码还原成数字(1)。
- 响应:接收端CPX根据收到的数字(1),执行对应的操作(播放融合动画)。
当前限制:根据项目原文提示,在撰写本文时,MakeCode中存在一个已知问题:红外通信功能与部分音乐播放功能可能冲突。如果同时使用,可能导致程序运行不稳定或红外失灵。因此,在双宝石版本中,我们通常建议暂时移除或简化音乐部分,优先保证红外同步的可靠性。这是一个典型的软硬件开发中遇到的“坑”,需要在功能间做出权衡。
5.2 双机同步代码改造
我们从单宝石版本的代码(不含音乐部分为佳)开始改造,目标是让两块CPX运行完全相同的程序,并能通过红外互相“对话”。
发送红外信号:
- 在
当按钮 A 被按下(解融合)的积木块内,从“网络”类别找到红外发送数字 0积木块,添加进去。这意味着按下A键时,除了执行自身的解融合动画,还会向外发射一个数字信号“0”。 - 同理,在
当按钮 B 被按下(融合)的积木块内,添加红外发送数字 1积木块。
- 在
接收并处理红外信号:
- 这是实现同步的关键。从“网络”类别拖出
当红外接收到数字积木块。这个块是一个事件监听器,专门等待接收红外信号。 - 我们需要判断接收到的数字是0还是1,然后执行相应的操作。这需要用到“逻辑”判断。
- 从“逻辑”类别拖出
如果为 true 则...否则...条件积木块,放入当红外接收到数字块内。 - 再从“逻辑”类别拖出
0 = 0比较积木块,用它来替换如果为后面的true。将比较积木的第一个0拖入红外接收到的数字变量(它会在当红外接收到数字块上自动出现一个可拖拽的变量),第二个0保持为数字0。 - 现在,这个逻辑的意思是:如果接收到的数字等于0,那么执行“则”部分的代码(即解融合动画),否则执行“否则”部分的代码(即融合动画)。
- 这是实现同步的关键。从“网络”类别拖出
填充条件分支:
- 将原来
当按钮 A 被按下块内除了红外发送之外的所有积木块(动画和设置灯光),复制到如果为的“则”部分。 - 将原来
当按钮 B 被按下块内除了红外发送之外的所有积木块,复制到“否则”部分。
- 将原来
至此,完整的逻辑闭环形成:当你按下宝石1的B键,它自己执行融合动画,并发出信号“1”;宝石2收到“1”,因为“1不等于0”,所以执行“否则”部分的融合动画。两颗宝石便同步完成了融合。解融合过程同理。
实操心得:在给两块CPX烧录完全相同的程序后,测试时请确保它们的红外发射/接收窗(板子边缘的一个小透明塑料件)大致相对,且距离不要太远(一米内效果较好)。中间避免有强光直射或深色物体阻挡。如果同步失败,尝试调整角度和距离。
6. 外壳组装与可穿戴化实战
代码烧录成功后,你得到的是一个功能完整的电子核心。但要成为“掌中宝石”,还需要进行物理封装和佩戴设计。
6.1 使用官方外壳进行组装
Adafruit官方出品的CPX保护外壳是首选方案。它由上下两片扣合而成,预留了所有按钮、传感器和充电口的开孔,并且边缘有专门用于穿绳的槽口。
- 穿入腕带:在合上外壳前,先将你选择的腕带、弹力绳或丝带穿过外壳侧面的槽口。建议使用宽度适中的扁平尼龙表带,既牢固又舒适。
- 放入CPX:将CPX主板小心地放入下半部分外壳中,确保所有按钮和端口都与外壳的开孔对齐。USB口和电池接口应朝向穿带子的另一侧,这样佩戴时线材不会硌手。
- 合盖与固定:盖上上半部分外壳,轻轻按压四周直至卡扣完全扣合。现在,CPX已经被安全地包裹在内。
- 连接电源:将3xAAA电池盒的JST插头插入CPX的电池接口。注意接口有防呆设计,不要用蛮力。
- 佩戴:将电池盒用魔术贴或额外的扎带固定在腕带背面或手腕上,然后将腕带像戴手表一样固定在手掌背部。你可以调整位置,让宝石(CPX)位于掌心或手背中央。
6.2 供电管理与续航优化
- 电源开关:务必使用带开关的电池盒。在项目不演示时,关闭开关以节省电量,防止误触。
- 亮度与续航:NeoPixel全亮度运行(尤其是10颗同时亮白色)时耗电较大。我们在代码中将默认亮度设为30,这是一个在视觉效果和续航间很好的平衡点。如果发现电池消耗过快,可以尝试进一步降低亮度值。
- 电池选择:使用质量可靠的碱性AAA电池。可充电的镍氢电池也是环保经济的选择,但其电压略低(1.2V vs 1.5V),可能导致整体亮度稍有下降。
6.3 创意扩展与个性化
基础版本完成后,你可以发挥创意进行个性化改造:
- 外观装饰:使用丙烯颜料在外壳上涂装《宇宙小子》的其他元素,或用热熔胶粘贴一些仿宝石的树脂配件进行点缀。
- 灯光模式扩展:修改代码,增加更多的灯光模式。例如,长按A键切换不同的静态颜色,或者让宝石在待机时进行缓慢的呼吸灯效果。
- 加入传感器:利用CPX上的加速度计,实现“挥动手臂触发融合”的体感操作。使用
当晃动时事件块替代按钮事件,体验会更魔幻。 - 双人互动游戏:为两颗宝石编写不同的角色代码(如一颗代表红宝石,一颗代表蓝宝石),只有当他们通过红外“相遇”(接收到彼此信号)时,才会共同融合成石榴色。这可以设计成一个简单的双人互动游戏。
7. 常见问题排查与调试技巧
即使按照步骤操作,也可能会遇到一些小问题。这里汇总了一些常见情况及解决方法。
7.1 程序烧录与硬件响应问题
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
点击“下载”后,没有出现CPLAYBOOT盘符。 | 1. CPX未正确进入Bootloader模式。 2. USB线或电脑USB口故障。 3. 驱动未正确安装。 | 1.快速双击重置按钮,观察所有LED是否变红再变绿。 2. 更换USB线和USB端口试试。 3. 尝试在另一台电脑上操作。 |
| 程序已下载,但CPX无任何反应(灯不亮)。 | 1. 电池盒开关未打开或电池没电。 2. 程序逻辑错误, 当开机时块内没有设置灯光。3. 硬件损坏(较少见)。 | 1. 检查电池盒开关,更换电池。连接USB线测试(USB供电优先级高于电池)。 2. 回看MakeCode代码,确保 当开机时块内有设置亮度和显示环形灯积木。3. 用MakeCode内置模拟器测试代码逻辑是否正确。 |
| 模拟器工作正常,但实物效果不对。 | 1. 代码下载到了错误的硬件上(如有多个CPX)。 2. 实物按钮接触不良。 | 1. 确保每次只连接一块CPX到电脑进行下载。 2. 按下按钮时,仔细听是否有轻微的“咔哒”声,确保按到位。 |
7.2 红外通信同步失败问题
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 按下宝石1的按钮,只有自己响应,宝石2无反应。 | 1. 两块CPX的红外窗没有对准。 2. 距离太远或环境光干扰太强。 3. 两块板子的程序不一致。 | 1. 将两块板子的红外窗(小透明窗口)面对面,距离在10-50厘米内测试。 2. 在室内光线均匀的环境下测试,避免阳光或强LED灯直射红外窗。 3.确保两块CPX烧录了完全相同的、包含红外收发逻辑的程序。这是最常见的原因。 |
| 红外通信时灵时不灵。 | 1. 电池电量不足,导致红外发射功率下降。 2. 代码中存在冲突(如同时尝试播放复杂音乐)。 | 1. 更换新电池。 2. 简化代码,移除双宝石版本中的音乐播放功能,优先保证红外通信稳定。 |
7.3 MakeCode编程逻辑问题
- 动画播放不完整或卡顿:检查
显示动画 ... 持续 ... 毫秒积木块后面的代码。在MakeCode中,这个动画是在“后台”播放的,其后的代码(如设置灯光)会立即执行,可能会中断动画。如果你希望动画播放完再执行下一步,需要利用暂停(ms)积木块,暂停时间至少等于动画持续时间。 - 灯光颜色显示不正确:MakeCode模拟器显示的颜色可能与实物NeoPixel显示的颜色有细微差异,这是正常的。模拟器主要用于验证逻辑。如果实物颜色明显错误(如红色显示为绿色),请检查代码中颜色选择是否正确,或者尝试重置CPX并重新烧录程序。
- 函数调用无效:确保你使用了
调用 functionName积木块来执行函数,而不是仅仅定义了一个函数块放在那里。函数定义后必须被调用才会运行。
这个项目从创意到实现,完整地走了一遍基于图形化编程的嵌入式开发流程。它最让我有成就感的地方在于,用如此直观的方式,将动画里的幻想变成了可以握在手中的现实。过程中遇到的每一个小问题,比如红外同步的调试、灯光时序的调整,都是对硬件理解和编程思维的一次锻炼。对于想要入门硬件编程的朋友,我强烈建议从这样的项目开始——它有明确的目标、可视化的反馈和丰富的扩展可能性。当你按下按钮,看到自己编写的代码让灯光如约亮起、动画流转时,那种“造物”的快乐,是纯软件编程难以替代的。不妨动手试试,创造出属于你自己的那颗宝石。