基于CircuitPython与舵机的可穿戴鲨鱼头盔制作指南
1. 项目概述:一个会动的鲨鱼头盔
如果你对嵌入式开发感兴趣,又觉得单纯的LED闪烁或者传感器读数有些乏味,那么将代码与物理世界结合,制作一个能“动”起来的可穿戴设备,绝对是件充满乐趣的事。今天分享的这个项目,就是一个绝佳的入门实践:用一块小巧的开发板,驱动一个由纸板制成的鲨鱼头盔,让它能根据你的指令(或者未来可以扩展为声音、动作触发)张开血盆大口。这不仅仅是一个手工活,更是一个融合了电路连接、嵌入式编程和基础机械传动的微型机电一体化项目。
项目的核心是Adafruit Circuit Playground Express(CPX)开发板,它集成了传感器、LED、按钮,最关键的是它支持CircuitPython,一种对初学者极其友好的Python变种,让你能用几行简单的代码就控制舵机这类执行器。我们将用CPX驱动一个伺服电机,通过一根结实的钓鱼线,拉动鲨鱼头盔的下颌,实现开合动作。整个过程涉及开发板环境搭建、CircuitPython代码编写、纸板结构设计与制作,以及最终的机电整合调试。无论你是想给孩子做一个炫酷的万圣节道具,还是作为学习嵌入式系统和物理计算的第一个动手项目,这个指南都将带你走完全程,并分享那些只有亲手做过才会知道的细节和“坑”。
2. 核心硬件与工具选型解析
2.1 为什么选择CPX与CircuitPython?
在开始动手之前,理解我们为什么选用这些核心组件至关重要。这决定了项目的可行性、难易度和扩展性。
Adafruit Circuit Playground Express (CPX)是这个项目的“大脑”。它不是一个通用的微控制器(如Arduino Uno),而是一个高度集成、为教育和快速原型设计而生的开发板。对于可穿戴项目,它的优势非常明显:
- 集成度高,省去焊接烦恼:板上自带10个可编程RGB NeoPixel LED、运动传感器(加速度计)、温度传感器、光线传感器、声音传感器、两个按钮、一个滑动开关和一个红外接收发射器。这意味着我们不需要为了感知环境而额外连接一堆模块,大大简化了电路。
- 内置USB支持与电池管理:它通过USB接口供电和编程,同时有一个JST PH 2mm电池接口,可以方便地连接锂离子电池,实现设备脱机运行,这对于可穿戴设备是刚需。
- 对初学者友好:板载的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 材料清单与工具准备
根据项目需求和上述解析,以下是详细的物料清单。我强烈建议在开始前核对一遍,避免中途因缺件而中断。
电子部分:
- Adafruit Circuit Playground Express (CPX) 开发板x1
- 微型伺服电机(连续旋转型)x1。推荐SG90尺寸的连续旋转舵机,扭力足够且价格便宜。
- USB Micro-B 数据线x1。用于供电和编程。
- 3.7V 锂离子聚合物电池 (500mAh或更大)x1 及配套的JST PH 2mm接口充电器。电池容量决定了续航,500mAh对于间歇性动作可以支撑数小时。确保电池有保护板。
- 公对母杜邦线若干。用于连接CPX与舵机。通常舵机线是母头,我们需要公对母线将信号端连接到CPX。
结构部分:
- 硬质卡纸或瓦楞纸板:这是制作头盔主体的主要材料。建议使用厚度约3mm的瓦楞纸板,它在强度、重量和易加工性上取得了很好的平衡。一个大号快递箱就足够了。
- 钓鱼线或尼龙线:用于传动。建议使用高强度编织尼龙线(如飞镖靶线),直径约0.5mm。它比普通钓鱼线更耐磨、不易打滑,且几乎没有弹性,能精确传递运动。
- 木销钉或粗竹签(直径约8-10mm) x1:作为下颌与头盔主体之间的转轴(合页)。
- 热熔胶枪与胶棒:纸板结构粘接的主力。速干、强度尚可,便于调整。
- 白乳胶或木工胶:用于加固关键受力点(如合页处),干透后强度远超热熔胶。
- 剪刀、美工刀、钢尺、切割垫:基础加工工具。
- 铅笔、圆规:用于画图和标记。
- 钳子、小钻头(或锥子):用于在纸板和木销上打孔。
注意:安全第一!使用美工刀和热熔胶枪时务必小心。建议在切割垫上操作,热熔胶枪使用后立即放在支架上,避免烫伤。
3. 软件开发环境搭建与基础代码
3.1 配置CircuitPython运行环境
这一步是为CPX“安装操作系统”。请严格按照顺序操作,我会补充官方指南里可能没说清的细节。
进入引导加载模式:
- 用USB线将CPX连接到电脑。你会看到板子上的LED开始闪烁。
- 快速双击CPX板上的复位按钮(板子中央的小按钮)。双击后,所有LED会变成红色,然后变为绿色,最后变成一个缓慢呼吸的红色。此时,电脑上会出现一个名为
CPLAYBOOT的可移动磁盘。这说明CPX已进入引导加载模式。
刷入CircuitPython固件:
- 访问CircuitPython官网的CPX页面,下载最新的
.uf2格式固件文件。 - 将下载好的
.uf2文件直接拖拽或复制到CPLAYBOOT磁盘中。CPX会自动重启。 - 重启后,电脑上会出现一个新的可移动磁盘,名为
CIRCUITPY。恭喜,你的CPX现在运行着CircuitPython了!CIRCUITPY盘符就是你的代码和库的存放位置。
- 访问CircuitPython官网的CPX页面,下载最新的
安装代码编辑器 - Mu Editor:
- 虽然你可以用任何文本编辑器编写
code.py,但Mu Editor是官方推荐且最适合新手的。它内置了串行监视器、代码检查和对CircuitPython设备的直接支持。 - 从Mu官网下载对应你操作系统的版本并安装。打开Mu后,在模式选择中,务必选择“CircuitPython”模式。
- 虽然你可以用任何文本编辑器编写
安装必要的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 鲨鱼头盔主体制作
纸板建模听起来简陋,但其中有很多结构力学的小技巧。我们的目标是做一个轻便、结实、动作顺畅的头部外壳。
上颌(头盔顶部)制作:
- 裁切:根据你头部的大小,裁切一个长方形纸板作为基底。一个成年人的尺寸参考约为长35cm,宽25cm。这不仅是上颌,也是整个头盔的“天花板”。
- 制作侧面与后面挡板:在这个长方形三条边(两侧和后面)上,画出高约10cm的垂直挡板,并留出约2cm的粘边。用美工刀沿线切割,注意只切断三边,让挡板能向上折起。
- 塑造曲面:鲨鱼头不是方盒子。关键一步是将两侧挡板的下沿,用剪刀剪成向后倾斜的弧线(参考鲨鱼头部的流线型)。然后,在粘边处涂上热熔胶,将挡板折起并粘牢,形成一个有弧度的、包裹头部的后半部分壳体。
- 制作牙齿:在长方形的前沿(下颌对应的位置),用铅笔画出尖锐的三角形齿状。逐个剪下,形成上排牙。为了美观和强度,可以剪两片相同的齿状纸板,用白乳胶背对背粘合,做成“夹心”牙齿。
下颌(活动部分)制作:
- 裁切与挖空:裁切一个比上颌略小的长方形作为下颌主体。最关键的一步:在这个长方形的中央,挖出一个大的“U”形或拱门形的洞。这个洞的大小要足以让你的下巴和整个下颌放入,这是佩戴舒适性的关键。洞的边缘要打磨光滑。
- 制作下排牙:在下颌的前沿粘贴下排牙齿,方法与上排牙类似。
- 安装转轴(合页):这是活动关节的核心。在上颌两侧前下方和下颌对应的位置,用锥子或小钻头钻孔。将木销钉穿过这些孔,形成转轴。务必确保孔洞大小合适,能让销钉自由转动但旷量不大。在销钉两端和纸板接触处点少量热熔胶固定,防止销钉滑出,但注意不要将胶粘到转动部位。
4.2 传动机构设计与安装
如何把舵机的旋转运动,变成下颌的上下开合?这里我们采用最简单的“绕线轴”方式。
舵机固定与摇臂准备:
- 将舵机用一大坨热熔胶或强力双面胶,固定在上颌内部靠前的位置。确保舵机的输出轴朝下或朝向合适的方向。
- 将舵机附带的塑料摇臂(舵机臂)安装到输出轴上。通常选用最长的那个臂,以增加杠杆力臂,获得更大的拉线行程。
穿线与力点设计:
- 在下颌的前端中心靠下的位置,钻一个小孔。将高强度尼龙线的一端穿过此孔,并在内部打一个大的结或用一小段牙签卡住,防止拉脱。
- 线的另一端向上,缠绕并系紧在舵机摇臂最外端的孔上。
- 核心原理:当舵机正转(
throttle = 1.0),摇臂拉动尼龙线,线牵动下颌前端向上绕转轴旋转,实现“闭嘴”。当舵机反转(throttle = -1.0),摇臂放松线,此时需要依靠下颌自身的重量或一个轻微的弹性回复力(比如在转轴处加一根很松的橡皮筋)让下颌回落,实现“张嘴”。这是一个“单边驱动”系统,简单可靠。
注意事项:线的长度需要仔细调整。在舵机处于停止位置(
throttle=0)时,线应该处于略微松弛但又不完全下垂的状态。如果太紧,舵机可能无法让下颌完全闭合或负载过大;如果太松,则反转时无法有效收线,导致动作无力。这是一个需要反复调试的过程。
4.3 佩戴结构与最终整合
- 制作内衬头箍:
- 单纯一个纸壳戴在头上会晃。我们需要一个内衬的“头箍”来固定。测量你头部的前后径,裁切一条宽约8cm的卡纸条,长度略长于你的头围。
- 将这条卡纸弯成一个与你头部曲线吻合的拱形,用热熔胶将其两端固定在上颌内部两侧。这个头箍能有效地将头盔的重量分散到你的头部两侧,而不是压在头顶。
- 安装背鳍与装饰:
- 用纸板剪出一个经典的鲨鱼背鳍形状,用热熔胶垂直粘在上颌的顶部中线上。
- 可以用白色纸板剪出眼睛粘在两侧,用马克笔或颜料涂装鲨鱼的皮肤纹理(如灰色底色、白色腹部),这能极大提升完成品的视觉效果。
- 电子部分内部走线与固定:
- 将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丰富的传感器,让鲨鱼头盔变得更“智能”:
- 声音触发: 利用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) # 短暂延迟,防止过于敏感 - 动作触发: 利用加速度计。当检测到头部快速上下晃动(点头)时,触发动作。
while True: x, y, z = cp.acceleration if abs(z) > 15: # 检测Z轴加速度变化(上下晃动) # 触发动作 ... - 灯光效果: 利用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)) # 蓝色 - 无线控制: 通过CPX的红外接收发射器,可以用一个普通的红外遥控器来控制鲨鱼张嘴闭嘴,实现远程互动。
这个项目从一片空白的代码编辑器和一个纸板箱开始,到最终做出一个响应你指令的机械生物,整个过程充满了工程实现的成就感。它麻雀虽小,却涵盖了嵌入式开发的全流程:环境搭建、编程、电路连接、机械设计、调试排错。最让我有感触的不是最终成品,而是在调试舵机中点、调整线缆长度、解决结构卡顿这些“坑”里爬出来的过程。每一个问题都迫使你去理解背后的原理——PWM信号是怎么回事、杠杆力臂如何影响行程、摩擦力对运动的影响——这些经验远比单纯复制一段代码来得宝贵。
如果你也完成了这个项目,不妨试试给它加上“眼睛”(两个LED),或者用更坚固的材料(如EVA泡沫板)重制外壳,甚至设计一个更复杂的双舵机系统来实现下颌的平行开合。创客的乐趣,就在于让想法在手中一点一点变成现实。
