1. 项目概述:一个会动的鲨鱼头盔

如果你对嵌入式开发感兴趣,又觉得单纯的LED闪烁或者传感器读数有些乏味,那么将代码与物理世界结合,制作一个能“动”起来的可穿戴设备,绝对是件充满乐趣的事。今天分享的这个项目,就是一个绝佳的入门实践:用一块小巧的开发板,驱动一个由纸板制成的鲨鱼头盔,让它能根据你的指令(或者未来可以扩展为声音、动作触发)张开血盆大口。这不仅仅是一个手工活,更是一个融合了电路连接、嵌入式编程和基础机械传动的微型机电一体化项目。

项目的核心是 Adafruit Circuit Playground Express(CPX) 开发板,它集成了传感器、LED、按钮,最关键的是它支持 CircuitPython ,一种对初学者极其友好的Python变种,让你能用几行简单的代码就控制舵机这类执行器。我们将用CPX驱动一个 伺服电机 ,通过一根结实的 钓鱼线 ,拉动鲨鱼头盔的下颌,实现开合动作。整个过程涉及开发板环境搭建、CircuitPython代码编写、纸板结构设计与制作,以及最终的机电整合调试。无论你是想给孩子做一个炫酷的万圣节道具,还是作为学习嵌入式系统和物理计算的第一个动手项目,这个指南都将带你走完全程,并分享那些只有亲手做过才会知道的细节和“坑”。

2. 核心硬件与工具选型解析

2.1 为什么选择CPX与CircuitPython?

在开始动手之前,理解我们为什么选用这些核心组件至关重要。这决定了项目的可行性、难易度和扩展性。

Adafruit Circuit Playground Express (CPX) 是这个项目的“大脑”。它不是一个通用的微控制器(如Arduino Uno),而是一个高度集成、为教育和快速原型设计而生的开发板。对于可穿戴项目,它的优势非常明显:

  1. 集成度高,省去焊接烦恼 :板上自带10个可编程RGB NeoPixel LED、运动传感器(加速度计)、温度传感器、光线传感器、声音传感器、两个按钮、一个滑动开关和一个红外接收发射器。这意味着我们不需要为了感知环境而额外连接一堆模块,大大简化了电路。
  2. 内置USB支持与电池管理 :它通过USB接口供电和编程,同时有一个JST PH 2mm电池接口,可以方便地连接锂离子电池,实现设备脱机运行,这对于可穿戴设备是刚需。
  3. 对初学者友好 :板载的LED和传感器可以通过简单的代码调用,即时获得反馈,学习曲线平缓。

CircuitPython 是让CPX变得如此易用的关键。它是MicroPython的一个分支,由Adafruit维护,针对其硬件进行了深度优化。与传统的Arduino(C/C++)相比,CircuitPython的优势在于:

  • 无需编译 :你只需将代码文件( code.py )拖入CPX的U盘( CIRCUITPY )中,它就会自动运行。修改代码后直接保存文件即可更新,实现了真正的“保存即运行”,调试效率极高。
  • Python语法 :对于有Python基础的人来说几乎零门槛;对于新手,Python也比C++更易读易懂。控制一个舵机可能只需要3-4行直观的代码。
  • 丰富的库 :Adafruit提供了庞大的“CircuitPython Library Bundle”,包含了驱动各种传感器、执行器、显示屏的库,我们需要的舵机库就在其中,直接复制使用即可。

伺服电机(舵机) 的选择也很有讲究。我们这里需要的是 连续旋转舵机 ,而不是常见的角度舵机。角度舵机只能在0-180度范围内精确控制位置,而连续旋转舵机可以控制其旋转速度和方向(正转/反转),非常适合用来收放线缆,实现下颌的连续开合动作。如果你错误地购买了角度舵机,会发现它无法完成连续的拉线动作。

2.2 材料清单与工具准备

根据项目需求和上述解析,以下是详细的物料清单。我强烈建议在开始前核对一遍,避免中途因缺件而中断。

电子部分:

  1. Adafruit Circuit Playground Express (CPX) 开发板 x1
  2. 微型伺服电机(连续旋转型) x1。推荐SG90尺寸的连续旋转舵机,扭力足够且价格便宜。
  3. USB Micro-B 数据线 x1。用于供电和编程。
  4. 3.7V 锂离子聚合物电池 (500mAh或更大) x1 及配套的 JST PH 2mm接口充电器 。电池容量决定了续航,500mAh对于间歇性动作可以支撑数小时。确保电池有保护板。
  5. 公对母杜邦线 若干。用于连接CPX与舵机。通常舵机线是母头,我们需要公对母线将信号端连接到CPX。

结构部分:

  1. 硬质卡纸或瓦楞纸板 :这是制作头盔主体的主要材料。建议使用厚度约3mm的瓦楞纸板,它在强度、重量和易加工性上取得了很好的平衡。一个大号快递箱就足够了。
  2. 钓鱼线或尼龙线 :用于传动。建议使用 高强度编织尼龙线 (如飞镖靶线),直径约0.5mm。它比普通钓鱼线更耐磨、不易打滑,且几乎没有弹性,能精确传递运动。
  3. 木销钉或粗竹签 (直径约8-10mm) x1:作为下颌与头盔主体之间的转轴(合页)。
  4. 热熔胶枪与胶棒 :纸板结构粘接的主力。速干、强度尚可,便于调整。
  5. 白乳胶或木工胶 :用于加固关键受力点(如合页处),干透后强度远超热熔胶。
  6. 剪刀、美工刀、钢尺、切割垫 :基础加工工具。
  7. 铅笔、圆规 :用于画图和标记。
  8. 钳子、小钻头(或锥子) :用于在纸板和木销上打孔。

注意:安全第一! 使用美工刀和热熔胶枪时务必小心。建议在切割垫上操作,热熔胶枪使用后立即放在支架上,避免烫伤。

3. 软件开发环境搭建与基础代码

3.1 配置CircuitPython运行环境

这一步是为CPX“安装操作系统”。请严格按照顺序操作,我会补充官方指南里可能没说清的细节。

  1. 进入引导加载模式

    • 用USB线将CPX连接到电脑。你会看到板子上的LED开始闪烁。
    • 快速 双击 CPX板上的 复位按钮 (板子中央的小按钮)。双击后,所有LED会变成红色,然后变为绿色,最后变成一个缓慢呼吸的红色。此时,电脑上会出现一个名为 CPLAYBOOT 的可移动磁盘。这说明CPX已进入引导加载模式。
  2. 刷入CircuitPython固件

    • 访问CircuitPython官网的CPX页面,下载最新的 .uf2 格式固件文件。
    • 将下载好的 .uf2 文件直接 拖拽 复制 CPLAYBOOT 磁盘中。CPX会自动重启。
    • 重启后,电脑上会出现一个新的可移动磁盘,名为 CIRCUITPY 。恭喜,你的CPX现在运行着CircuitPython了! CIRCUITPY 盘符就是你的代码和库的存放位置。
  3. 安装代码编辑器 - Mu Editor

    • 虽然你可以用任何文本编辑器编写 code.py ,但 Mu Editor 是官方推荐且最适合新手的。它内置了串行监视器、代码检查和对CircuitPython设备的直接支持。
    • 从Mu官网下载对应你操作系统的版本并安装。打开Mu后,在模式选择中,务必选择 “CircuitPython” 模式。
  4. 安装必要的CircuitPython库

    • 访问CircuitPython库页面,下载与你的CircuitPython固件版本匹配的“Library Bundle”(库合集)。
    • 下载的是一个压缩包,解压后你会看到一个 lib 文件夹。
    • 打开 CIRCUITPY 磁盘,如果里面没有 lib 文件夹,就新建一个。
    • 从解压的库合集中,找到并复制以下两个文件夹到 CIRCUITPY 盘的 lib 文件夹内:
      • adafruit_motor : 这是控制电机(包括舵机)的核心库。
      • adafruit_circuitplayground : 这是简化CPX板上传感器、LED控制的库。

实操心得 : 有时复制库后代码仍提示找不到模块。请确保:1. 复制的是整个文件夹,而不是文件夹里的内容。2. lib 文件夹直接在 CIRCUITPY 根目录下,没有多层级。3. 重启一下CPX(拔插USB)有时能解决缓存问题。

3.2 编写舵机控制代码

现在,我们将在Mu Editor中编写让舵机动起来的核心代码。代码的逻辑是:初始化舵机,然后在一个循环中,让舵机先正转(张开嘴),停一会儿,再反转(闭上嘴),如此往复。

打开Mu Editor,确保左下角显示已连接到 CIRCUITPY 。点击“加载”按钮,打开 CIRCUITPY 盘根目录下的 code.py 文件。如果文件是空的或不存在,Mu会新建一个。

将以下代码复制并粘贴到 code.py 中:

import time
import board
import pwmio
from adafruit_motor import servo

# 初始化舵机控制引脚,CPX的A1口支持PWM输出,常用于舵机
pwm = pwmio.PWMOut(board.A1, frequency=50)  # 舵机标准PWM频率是50Hz

# 创建连续旋转舵机对象
# 注意:min_pulse和max_pulse值可能需要根据你的具体舵机进行微调
# 通常750和2250是一个标准范围的中点,对应停止状态
cservo = servo.ContinuousServo(pwm, min_pulse=750, max_pulse=2250)

# 等待一秒,让系统稳定
time.sleep(1)

print("鲨鱼头盔舵机测试开始!")

while True:
    # 舵机全速正转 - 对应“张开嘴”(拉紧线)
    print("张嘴!")
    cservo.throttle = 1.0  # throttle值范围从-1.0(全速反转)到1.0(全速正转)
    time.sleep(2.0)        # 持续转动2秒

    # 舵机停止
    print("停!")
    cservo.throttle = 0.0
    time.sleep(1.0)        # 停止1秒

    # 舵机全速反转 - 对应“闭上嘴”(放松线)
    print("闭嘴!")
    cservo.throttle = -1.0
    time.sleep(2.0)        # 持续转动2秒

    # 舵机再次停止
    print("停!")
    cservo.throttle = 0.0
    time.sleep(3.0)        # 停止3秒,完成一个循环

代码关键点解析:

  • pwmio.PWMOut(board.A1, frequency=50) : 这行代码在A1引脚上创建了一个PWM(脉冲宽度调制)信号输出对象。舵机通过读取这个脉冲的宽度来决定位置或速度。50Hz是标准舵机信号频率。
  • servo.ContinuousServo() : 这是创建连续旋转舵机对象的关键。 min_pulse max_pulse 定义了脉冲宽度的微秒范围,这个范围决定了 throttle 从-1到1映射到的实际脉冲宽度。 如果你的舵机在中立点( throttle=0 )时仍然缓慢转动,就需要调整这两个值。 例如,如果它慢慢正转,尝试将 min_pulse 稍微调大,如改为 800
  • cservo.throttle : 这是控制速度的属性。 1.0 最大正速, -1.0 最大反速, 0.0 停止。你可以通过设置如 0.5 来获得半速。
  • print() : 输出信息到串行监视器。在Mu Editor中,点击“串行”按钮即可打开一个控制台,看到这些打印信息,这对于调试至关重要。

保存代码 : 在Mu中点击“保存”,文件会自动保存到 CIRCUITPY 盘的 code.py 。CPX会检测到文件变化并自动重新运行代码。此时,如果你已经连接了舵机(下一步会讲),应该能看到舵机开始按节奏正转、停止、反转。

4. 机械结构制作与组装详解

4.1 鲨鱼头盔主体制作

纸板建模听起来简陋,但其中有很多结构力学的小技巧。我们的目标是做一个轻便、结实、动作顺畅的头部外壳。

  1. 上颌(头盔顶部)制作

    • 裁切 :根据你头部的大小,裁切一个长方形纸板作为基底。一个成年人的尺寸参考约为长35cm,宽25cm。这不仅是上颌,也是整个头盔的“天花板”。
    • 制作侧面与后面挡板 :在这个长方形三条边(两侧和后面)上,画出高约10cm的垂直挡板,并留出约2cm的粘边。用美工刀沿线切割,注意只切断三边,让挡板能向上折起。
    • 塑造曲面 :鲨鱼头不是方盒子。关键一步是 将两侧挡板的下沿,用剪刀剪成向后倾斜的弧线 (参考鲨鱼头部的流线型)。然后,在粘边处涂上热熔胶,将挡板折起并粘牢,形成一个有弧度的、包裹头部的后半部分壳体。
    • 制作牙齿 :在长方形的前沿(下颌对应的位置),用铅笔画出尖锐的三角形齿状。逐个剪下,形成上排牙。为了美观和强度,可以剪两片相同的齿状纸板,用白乳胶背对背粘合,做成“夹心”牙齿。
  2. 下颌(活动部分)制作

    • 裁切与挖空 :裁切一个比上颌略小的长方形作为下颌主体。 最关键的一步 :在这个长方形的中央,挖出一个大的“U”形或拱门形的洞。这个洞的大小要足以让你的下巴和整个下颌放入,这是佩戴舒适性的关键。洞的边缘要打磨光滑。
    • 制作下排牙 :在下颌的前沿粘贴下排牙齿,方法与上排牙类似。
    • 安装转轴(合页) :这是活动关节的核心。在上颌两侧前下方和下颌对应的位置,用锥子或小钻头钻孔。将木销钉穿过这些孔,形成转轴。 务必确保孔洞大小合适,能让销钉自由转动但旷量不大 。在销钉两端和纸板接触处点少量热熔胶固定,防止销钉滑出,但注意不要将胶粘到转动部位。

4.2 传动机构设计与安装

如何把舵机的旋转运动,变成下颌的上下开合?这里我们采用最简单的“绕线轴”方式。

  1. 舵机固定与摇臂准备

    • 将舵机用一大坨热熔胶或强力双面胶,固定在上颌内部靠前的位置。确保舵机的输出轴朝下或朝向合适的方向。
    • 将舵机附带的塑料摇臂(舵机臂)安装到输出轴上。通常选用最长的那个臂,以增加杠杆力臂,获得更大的拉线行程。
  2. 穿线与力点设计

    • 在下颌的 前端中心靠下的位置 ,钻一个小孔。将高强度尼龙线的一端穿过此孔,并在内部打一个大的结或用一小段牙签卡住,防止拉脱。
    • 线的另一端向上,缠绕并系紧在舵机摇臂最外端的孔上。
    • 核心原理 :当舵机正转( throttle = 1.0 ),摇臂拉动尼龙线,线牵动下颌前端向上绕转轴旋转,实现“闭嘴”。当舵机反转( throttle = -1.0 ),摇臂放松线,此时需要依靠 下颌自身的重量 或一个 轻微的弹性回复力 (比如在转轴处加一根很松的橡皮筋)让下颌回落,实现“张嘴”。这是一个“单边驱动”系统,简单可靠。

注意事项 :线的长度需要仔细调整。在舵机处于停止位置( throttle=0 )时,线应该处于略微松弛但又不完全下垂的状态。如果太紧,舵机可能无法让下颌完全闭合或负载过大;如果太松,则反转时无法有效收线,导致动作无力。这是一个需要反复调试的过程。

4.3 佩戴结构与最终整合

  1. 制作内衬头箍
    • 单纯一个纸壳戴在头上会晃。我们需要一个内衬的“头箍”来固定。测量你头部的前后径,裁切一条宽约8cm的卡纸条,长度略长于你的头围。
    • 将这条卡纸弯成一个与你头部曲线吻合的拱形,用热熔胶将其两端固定在上颌内部两侧。这个头箍能有效地将头盔的重量分散到你的头部两侧,而不是压在头顶。
  2. 安装背鳍与装饰
    • 用纸板剪出一个经典的鲨鱼背鳍形状,用热熔胶垂直粘在上颌的顶部中线上。
    • 可以用白色纸板剪出眼睛粘在两侧,用马克笔或颜料涂装鲨鱼的皮肤纹理(如灰色底色、白色腹部),这能极大提升完成品的视觉效果。
  3. 电子部分内部走线与固定
    • 将CPX用尼龙扎带或胶带固定在头盔内部后上方,避开头部活动区域。
    • 将锂离子电池也固定在内部,确保其连接线不会缠绕到活动部件。
    • 用胶带或线卡将舵机信号线和电源线整理好,避免杂乱。

5. 系统调试、问题排查与功能扩展

5.1 上电调试与动作校准

当所有部件组装完毕后,连接电池,打开CPX的电源开关(如果使用电池供电)。你应该能看到CPX上的LED亮起,舵机开始按照代码循环动作。

常见问题与排查:

问题现象 可能原因 解决方案
舵机完全不转,且CPX无反应 1. 电池没电或接触不良。
2. CPX电源开关未打开(电池供电时)。
3. USB供电不足(仅用USB时)。
1. 给电池充电,检查JST接头是否插紧。
2. 确认CPX侧面的电源开关拨到“ON”。
3. 换用电脑USB口或手机充电器供电试试。
舵机抖动、鸣叫但不转动 1. 机械结构卡死,舵机堵转。
2. 舵机供电不足。
3. PWM信号线接触不良。
1. 立即断电! 检查下颌转动是否顺畅,尼龙线是否缠绕。手动帮助转动,消除死点。
2. 确保电池电量充足。舵机启动瞬间电流较大,劣质USB线或小容量电池可能无法提供。
3. 检查杜邦线连接,特别是信号线(通常是黄线或白线)是否牢固插在CPX的A1引脚。
舵机只向一个方向转,不会停或反向 1. 代码中 throttle 值设置错误。
2. 连续旋转舵机的“中点”未校准。
1. 检查代码,确认 throttle 在循环中按 1.0 -> 0.0 -> -1.0 -> 0.0 变化。
2. 校准舵机中点 :这是最关键的一步。修改代码,让舵机先停止 cservo.throttle = 0 ,然后上电。观察舵机是否真的静止。如果缓慢转动,微调 min_pulse max_pulse 参数。例如,若缓慢正转,将 min_pulse 从750逐步调大到800,直到停止。
下颌动作幅度太小或太大 1. 舵机摇臂长度不合适。
2. 尼龙线在下颌的固定点位置不佳。
1. 换用更长或更短的舵机摇臂。臂越长,拉线行程越大,下颌开合角度也越大,但所需扭矩也越大。
2. 调整尼龙线在下颌的固定点。固定点越靠前,杠杆效应越明显,同样行程下开合角度越大。
动作几次后,下颌回位不准 1. 尼龙线有弹性或打滑。
2. 转轴摩擦力过大。
3. 缺乏回复力。
1. 换用无弹性的编织尼龙线,并在打结处点一滴502胶水加固。
2. 在木销转轴处涂抹一点润滑油(如凡士林)。
3. 在下颌后方和上颌之间,增加一根很松的橡皮筋作为辅助回位。

5.2 功能扩展与创意想法

基础功能实现后,你可以利用CPX丰富的传感器,让鲨鱼头盔变得更“智能”:

  1. 声音触发 : 利用CPX的内置麦克风。修改代码,当检测到音量超过阈值(比如拍手或大喊)时,触发一次张嘴-闭嘴循环。
    from adafruit_circuitplayground import cp
    ...
    while True:
        if cp.sound_level > 100:  # 阈值需要根据环境调整
            # 执行一次张嘴闭嘴动作
            cservo.throttle = 1.0
            time.sleep(0.5)
            cservo.throttle = -1.0
            time.sleep(0.5)
            cservo.throttle = 0.0
        time.sleep(0.1)  # 短暂延迟,防止过于敏感
    
  2. 动作触发 : 利用加速度计。当检测到头部快速上下晃动(点头)时,触发动作。
    while True:
        x, y, z = cp.acceleration
        if abs(z) > 15:  # 检测Z轴加速度变化(上下晃动)
            # 触发动作
            ...
    
  3. 灯光效果 : 利用CPX的10个RGB LED。在鲨鱼张嘴时,让LED变成红色并闪烁,模拟攻击状态;闭嘴时恢复蓝色或熄灭。
    import neopixel
    pixels = neopixel.NeoPixel(board.NEOPIXEL, 10, brightness=0.1)
    ...
    # 张嘴时
    pixels.fill((255, 0, 0))  # 红色
    # 闭嘴时
    pixels.fill((0, 0, 255))  # 蓝色
    
  4. 无线控制 : 通过CPX的红外接收发射器,可以用一个普通的红外遥控器来控制鲨鱼张嘴闭嘴,实现远程互动。

这个项目从一片空白的代码编辑器和一个纸板箱开始,到最终做出一个响应你指令的机械生物,整个过程充满了工程实现的成就感。它麻雀虽小,却涵盖了嵌入式开发的全流程:环境搭建、编程、电路连接、机械设计、调试排错。最让我有感触的不是最终成品,而是在调试舵机中点、调整线缆长度、解决结构卡顿这些“坑”里爬出来的过程。每一个问题都迫使你去理解背后的原理——PWM信号是怎么回事、杠杆力臂如何影响行程、摩擦力对运动的影响——这些经验远比单纯复制一段代码来得宝贵。

如果你也完成了这个项目,不妨试试给它加上“眼睛”(两个LED),或者用更坚固的材料(如EVA泡沫板)重制外壳,甚至设计一个更复杂的双舵机系统来实现下颌的平行开合。创客的乐趣,就在于让想法在手中一点一点变成现实。

更多推荐