基于CircuitPython与弯曲传感器的可穿戴机械手指制作指南
1. 项目概述:当科幻灵感照进现实
几年前,我在一部科幻电影里看到一个场景:士兵穿戴的外骨骼装备上,延伸出一根灵活的机械手指,辅助他完成一些精细操作。这个画面一直印在我脑海里,让我思考,如果普通人也能拥有这样一根“额外”的手指,生活会有什么不同?是能更轻松地弹奏复杂的和弦,还是在组装微小模型时多一个稳定的“助手”?这个想法,最终催生了“第六指”这个项目。
“第六指”是一个基于开源硬件的可穿戴交互装置。它的核心逻辑非常直观:用一根戴在自己手指上的 弯曲传感器 来“感受”你的动作,然后将这个动作信号传递给一块小巧的开发板,开发板再驱动一个 舵机 ,最终拉动一根3D打印的机械手指做出相应的弯曲动作。简单说,就是你弯自己的手指,那根“第六指”也跟着弯,仿佛它就是你身体的一部分。
这个项目的价值远不止于一个酷炫的玩具。它本质上是一个微型的“人机接口”原型。我们通过传感器将生物体的动作(模拟信号)转化为数字世界能理解的信号,再通过执行器(舵机)将数字指令反馈回物理世界,完成一个完整的控制闭环。这套逻辑,正是许多现代辅助技术(如智能假肢)、康复设备乃至高级人机交互设备的底层原理。通过亲手制作“第六指”,你能透彻理解传感器采样、信号处理、电机驱动这些嵌入式系统的核心概念,而3D打印的加入,则让创意能快速从数字模型变为可握在手中的实体。
整个项目围绕 Adafruit Circuit Playground Express (以下简称CPX)开发板及其专用扩展板 Crickit 构建。CPX本身集成了多种传感器和LED,非常适合快速原型开发;而Crickit则提供了安全、便捷的电机、舵机驱动能力,让驱动机械结构变得非常简单。即使你之前没有嵌入式开发经验,跟着步骤走,也能顺利完成这个融合了硬件、软件和机械的综合性项目。
2. 核心硬件选型与设计思路解析
为什么是Circuit Playground Express和Crickit这个组合?这是我在项目构思初期反复权衡后的选择。市面上常见的微控制器如Arduino Uno固然经典,但对于一个需要佩戴在手上的可穿戴设备来说,体积、集成度和开发效率是关键。
Circuit Playground Express 是一块“五脏俱全”的开发板。它内置了加速度计、光线传感器、温度传感器、麦克风,还有10个可编程的RGB NeoPixel灯珠。这意味着很多基础功能无需外接模块。更重要的是,它支持 CircuitPython 和 MakeCode 图形化编程,对于初学者和快速验证想法来说,门槛极低。你甚至可以直接通过USB线把它模拟成一个U盘,把编辑好的代码文件拖进去就能运行,省去了编译、烧录的繁琐步骤。在这个项目中,我们主要利用它的模拟输入引脚来读取弯曲传感器的值。
然而,CPX的引脚驱动能力有限,无法直接驱动需要较大电流的舵机。强行驱动可能导致板子损坏或不稳定。这就是 Adafruit Crickit for Circuit Playground Express 出场的原因。Crickit是一个“机器人创意套件”扩展板,它通过一个专用的夹子插座与CPX严丝合缝地连接。它的核心价值在于提供了4个带保护电路的 舵机驱动通道 和2个带MOSFET管的 电机驱动通道 ,还有额外的放大器、触摸感应接口等。Crickit上的舵机驱动端口提供了稳定的5V电源和足够的电流,确保舵机动作有力且不会干扰主控板的稳定运行。这种“主控+驱动扩展”的架构,既保证了核心控制的灵活性,又兼顾了驱动大电流外设的安全性与便利性,是可穿戴和机器人项目中非常优雅的解决方案。
传感器方面 ,我们选用的是 弯曲传感器 。它的工作原理类似于一个可变电阻。当传感器平直时,其电阻值较低(约10kΩ);当它被弯曲时,内部的导电材料被拉伸,电阻值会增大(可能达到30-50kΩ甚至更高)。我们将它连接成一个分压电路,CPX的模拟引脚测量的是中间点的电压。手指弯曲导致传感器电阻变化,从而引起电压变化,CPX通过 模拟数字转换器 读取这个电压值(范围0-65535,对应0-3.3V),我们就得到了一个与弯曲程度相关的数字信号。选择它是因为其形状贴合手指,检测动作直观,且模拟信号的处理对我们来说足够简单。
执行机构 是一个标准的 微型舵机 。舵机是一种位置伺服机构,它接收脉冲宽度调制信号,并将信号脉冲宽度转化为相应的输出轴角度。在这个项目中,我们将弯曲传感器读取到的模拟量,映射成舵机需要转动的角度(例如0-180度)。舵机通过齿轮组拉动一根线缆,进而牵引机械手指关节。
机械结构 全部通过 3D打印 实现。这赋予了项目极大的设计自由度。手指的关节设计模仿了人类的指节,采用铰链结构,并在背面预留了线缆通道和橡胶筋的挂点。选择PLA材料打印是因为其强度足够、打印成功率高且成本低廉。而伺服舵机的固定支架、Crickit的佩戴底座以及手环,都需要根据具体的舵机型号和佩戴者的手腕尺寸进行个性化设计和打印,这正是数字制造的优势所在。
整个系统的设计思路遵循了“感知-决策-执行”的经典控制模型,并充分考虑了可穿戴设备对体积、重量和功耗的约束,所有选型都服务于“易于实现、稳定可靠、便于佩戴”的核心目标。
2.1 电路连接详解与安全注意事项
电路连接是整个项目的物理基础,正确的连接不仅能保证功能,更是保护昂贵开发板的关键。整个电路的核心是弯曲传感器与CPX模拟引脚的连接,以及舵机与Crickit的连接。
弯曲传感器电路 是一个典型的分压电路。你需要准备一个 10kΩ的直插电阻或贴片电阻 (色环为棕-黑-橙-金)。连接步骤如下:
- 准备电源与地线 :从CPX上找到标有“3.3V”和“GND”的焊盘或引脚。3.3V是CPX的逻辑电压,也为我们的传感器电路供电。
- 构建分压电路 :将10kΩ电阻的一端连接到 3.3V 。将 弯曲传感器的一端(通常颜色较深或标有记号)连接到GND 。请注意,弯曲传感器的两个引脚可能没有标记,但通常其中一端有一个彩色标记或凸起,这一端应接地。如果不确定,可以用万用表测量,弯曲时电阻变化大的一端接我们的信号线。
- 读取信号 :将10kΩ电阻的另一端与弯曲传感器的另一端(非接地端)连接在一起,这个连接点我们称为“信号节点”。从这个节点引出一根导线,连接到CPX上任一个标有“A”开头的模拟输入引脚,例如 A3 。这样,A3引脚读取的就是信号节点对地的电压。
重要提示 :务必确保弯曲传感器的接地端正确连接到了GND,而不是3.3V。接反了虽然可能不会立即损坏传感器,但会导致信号逻辑相反,且可能使电路工作在不稳定状态。另外,CPX的模拟输入引脚耐受电压就是3.3V,绝对不要接入5V电压,否则会永久损坏芯片。
舵机连接 则简单安全得多,这得益于Crickit的设计。找到Crickit板上标有“Servo 1”到“Servo 4”的接口。每个接口都有三排插针,分别标有:
- 黄色或白色线(信号线) :连接到舵机的信号线(通常是橙色或黄色)。
- 红色线(电源线) :连接到舵机的红线(+5V)。
- 黑色或棕色线(地线) :连接到舵机的黑线或棕线(GND)。
Crickit的舵机接口自带反接保护和过流保护,只要对准颜色插入,一般不会出错。建议使用本项目配套的3D打印舵机支架,它既能固定舵机,其预留的走线槽也能让连接更整洁。
供电方面 ,在调试阶段,通过USB线为CPX供电即可,Crickit和舵机所需的电力会通过板间连接器获取。但如果最终佩戴使用时,舵机动作可能导致电流瞬间增大,可能引起USB供电不稳定。此时,可以考虑通过Crickit上专用的 外部电源接口 ,接入一个5-6V的电池组(如4节AA电池盒或一块小型锂电池),以确保系统动力充足。Crickit的设计允许同时使用USB(用于编程通信)和外部电源(用于驱动电机),非常灵活。
3. 软件编程:从传感器数据到舵机动作
硬件连接妥当后,我们需要让CPX“学会”如何解读弯曲传感器的信号,并据此指挥舵机运动。我们将使用 CircuitPython 进行编程,因为它语法简单,类似于Python,并且具有交互式串行输出功能,非常利于调试。
首先,你需要准备开发环境:
- 访问CircuitPython官网,下载适用于Circuit Playground Express的最新版本UF2固件文件。
- 用USB线连接CPX到电脑。长按板子上的“Reset”按钮,直到靠近USB接口的LED灯环变成绿色。此时电脑上会出现一个名为“CPLAYBOOT”的U盘。
- 将下载好的UF2固件文件拖入这个U盘。完成后,U盘会自动弹出并重新挂载,名称变为“CIRCUITPY”。这意味着你的CPX现在已经是一台CircuitPython“电脑”了。
- 在“CIRCUITPY”盘符根目录下,你会看到一个
code.py文件。用任何文本编辑器(推荐Mu Editor或VS Code with CircuitPython插件)打开并编辑它,这就是主程序文件。
接下来是核心代码的编写。代码逻辑主要分为三部分:初始化、循环读取传感器、映射并控制舵机。
import time
import board
import analogio
from adafruit_crickit import crickit
# 1. 初始化弯曲传感器引脚 (连接到A3)
flex_sensor = analogio.AnalogIn(board.A3)
# 2. 初始化舵机 (连接到Crickit的Servo 1端口)
servo = crickit.servo_1
# 3. 设置舵机角度范围 (根据你的舵机规格调整,通常是0-180)
servo.set_pulse_width_range(min_pulse=500, max_pulse=2500)
# 4. 传感器校准变量
# 你需要先测量手指伸直和完全弯曲时的传感器读数
FLEX_STRAIGHT = 25000 # 示例值,伸直时的ADC读数
FLEX_BENT = 40000 # 示例值,弯曲时的ADC读数
def map_range(value, from_low, from_high, to_low, to_high):
"""将一个数值从一个范围线性映射到另一个范围"""
return (value - from_low) * (to_high - to_low) / (from_high - from_low) + to_low
# 主循环
while True:
# 读取弯曲传感器的原始模拟值 (0-65535)
flex_value = flex_sensor.value
# 将传感器值映射到舵机角度 (例如:伸直对应0度,弯曲对应180度)
# 注意:传感器电阻随弯曲增大而增大,读取的电压值会减小,所以映射关系可能是反的
# 如果舵机运动方向与手指弯曲方向相反,可以交换FLEX_STRAIGHT和FLEX_BENT的值,或者交换0和180
servo_angle = map_range(flex_value, FLEX_BENT, FLEX_STRAIGHT, 0, 180)
# 限制角度在有效范围内,防止舵机过冲
servo_angle = max(0, min(180, servo_angle))
# 将角度命令发送给舵机
servo.angle = servo_angle
# 为了调试,可以打印出数值(通过串口监视器查看)
# print((flex_value, servo_angle))
# 短暂延迟,避免循环过快
time.sleep(0.02)
代码关键点解析与校准 :
analogio.AnalogIn:这是CircuitPython中用于读取模拟信号的库。flex_sensor.value返回一个16位整数(0-65535),对应0到3.3V的电压。- 校准过程至关重要 :代码中的
FLEX_STRAIGHT和FLEX_BENT不是固定值,你必须通过实验确定。首先,将弯曲传感器按佩戴方式固定在你的手指上。在while True循环里,添加print(flex_sensor.value)并让手指保持 完全伸直 状态几秒钟,观察串口输出(使用Mu Editor的“串行”面板)的稳定值,将其填入FLEX_STRAIGHT。然后, 尽量弯曲手指 ,再次观察稳定值,填入FLEX_BENT。这个步骤直接决定了控制的精度和线性度。 - 映射函数 :
map_range函数实现了线性映射。这里我们将传感器读数范围[FLEX_BENT, FLEX_STRAIGHT]映射到舵机角度范围[0, 180]。如果你发现舵机运动方向是反的(手指弯曲时舵机回正),只需将映射改为map_range(flex_value, FLEX_STRAIGHT, FLEX_BENT, 0, 180)即可。 - 角度限制 :使用
max()和min()函数将计算出的角度限制在0到180度之间,这是一个保护舵机的好习惯。 - 延迟 :
time.sleep(0.02)意味着每20毫秒更新一次舵机位置,约50Hz的更新率,对于手指跟随动作来说已经非常流畅,且不会给处理器造成过大负担。
实操心得 :在调试阶段,务必充分利用串口打印功能。将原始传感器值、计算后的角度都打印出来,你能清晰地看到整个转换过程是否合乎预期。如果舵机出现抖动,可能是电源功率不足,或者映射范围设置得过于敏感,导致传感器微小波动引起角度剧烈变化。可以尝试在映射后加入一个简单的平滑滤波,例如
servo_angle = 0.7 * servo_angle + 0.3 * previous_angle,能有效减少抖动。
4. 机械结构制作、组装与佩戴优化
软件调试成功后,项目的成功就系于机械结构的可靠性与佩戴的舒适度。3D打印的部件需要精心处理,组装过程也需要耐心和技巧。
3D打印与后处理 : 模型文件通常包括手指关节、舵机支架、Crickit底座和手环。打印时建议注意以下几点:
- 层高与填充 :对于手指关节这类活动部件,建议使用 0.15mm或0.2mm的层高 以提高表面光滑度,减少运动摩擦。填充率选择 20%-25% 即可在保证强度的前提下节省材料和时间。舵机支架和底座需要承重,填充率可以提高到30%或以上。
- 支撑 :手指关节的铰链部位通常有悬空结构,必须 生成支撑 。打印完成后,需要非常小心地去除支撑,特别是关节内部的支撑,可以使用尖头镊子和笔刀仔细清理,避免损坏细小的轴孔。
- 组装测试 :在正式穿线前,先手动活动一下打印好的手指关节,确保各个关节转动顺滑,没有明显的卡滞或摩擦。如果有毛刺,可以用细砂纸轻轻打磨。
穿线与动力传递机构组装 : 这是整个机械部分的核心,其可靠性直接决定了手指动作是否跟手。
- 安装橡胶筋 :将一根细小的乳胶圈或橡皮筋,用一小滴 超级胶水 (氰基丙烯酸酯)粘在手指末节背面的凹槽内。这是手指的“复位弹簧”,负责在舵机放松线缆时将手指拉直。
- 穿引线缆 :使用坚韧的 编织线 (如钓鱼线或风筝线)作为牵引线。从指尖的孔穿入,依次穿过每个指节的导向孔,最后从手指根部的孔穿出。这个过程需要耐心,可以借助细铁丝作为引线。关键点在于,线缆在关节处的路径必须顺畅,不能有急弯或摩擦点。
- 连接舵机 :将线缆的末端牢牢系在舵机的舵盘(舵机摇臂)上。舵盘上通常有小孔,打结后可以用一滴胶水固定防止滑脱。舵机应安装在打印的支架上,并确保舵盘旋转时,线缆的收放方向与手指关节的运动平面一致。
避坑指南 :线缆的松紧度需要微调。太松,手指弯曲不到位,反应迟钝;太紧,则舵机负载大,手指难以复位,甚至损坏结构。理想的狀態是,当舵机处于初始位置(0度)时,线缆刚好被拉直,但手指仍能被橡胶筋拉回伸直位。可以通过调节线缆在舵盘上的固定点(缠绕圈数)或使用可调节的线缆锁扣来微调。
传感器佩戴与整体集成 :
- 固定弯曲传感器 :将弯曲传感器用 医用透气胶布 或弹性绷带缠绕固定在你的食指或中指的第二指节上。确保传感器弯曲部分与你的指关节对齐,并且固定牢固,不会在动作中滑动。你也可以设计一个简单的硅胶或织物指套,将传感器缝制在内侧,这样佩戴更舒适美观。
- 集成电子部分 :将CPX和Crickit用螺丝固定在打印的底座上。将所有导线(传感器线、舵机线)用扎带或胶布整理好,避免杂乱。可以考虑用热缩管或编织网管包裹线束,提升美观度和耐用性。
- 佩戴方案 :最终的佩戴系统需要将机械手指、舵机总成和电子模块固定在手背或小臂上。可以使用 弹性腕带 、 魔术贴绑带 或者定制一个3D打印的臂环。目标是: 稳固 (运动时不晃动)、 舒适 (长时间佩戴不压迫)、 重心合理 (重量分布均匀,不觉得前重后轻)。一个巧妙的做法是将电池组(如果使用)放在手臂另一侧,以平衡舵机和手指的重量。
5. 系统调试、问题排查与性能优化
将所有部件组装并佩戴好后,首次通电测试往往不会一帆风顺。下面是一些常见问题及其排查思路,以及让“第六指”表现更出色的优化技巧。
常见问题排查速查表 :
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 舵机完全不动作 | 1. 电源问题 2. 信号线连接错误 3. 代码未正确上传或执行 |
1. 检查Crickit和CPX连接是否牢固,USB线是否供电正常。尝试使用外部电池供电。 2. 确认舵机信号线(黄/白)插在Crickit的“Signal”针脚上。 3. 检查CPX上的LED是否按程序设定闪烁(如果有),通过串口监视器查看打印信息,确认程序在运行。 |
| 舵机抖动或发出异响 | 1. 电源功率不足 2. 机械阻力过大(线缆卡住) 3. 控制信号不稳定 |
1. 换用输出电流更大的USB电源或连接外部电池。这是最常见的原因。 2. 手动检查手指关节活动是否顺滑,线缆有无被结构件磨损。 3. 在代码中增加对传感器值的平滑滤波(如移动平均),减少信号噪声。 |
| 手指动作方向与预期相反 | 传感器映射关系错误 | 调整代码中的 map_range 函数参数,交换 FLEX_STRAIGHT 和 FLEX_BENT 的顺序。 |
| 手指弯曲范围不足 | 1. 舵机角度范围设置不当 2. 线缆行程不够 3. 传感器校准范围太窄 |
1. 检查 set_pulse_width_range 设置是否匹配你的舵机规格。 2. 调整线缆在舵盘上的固定点,增大舵盘旋转时线缆的收放长度。 3. 重新进行传感器校准,确保在手指完全伸直和弯曲时,代码读取到了足够大的数值差异。 |
| 传感器读数跳动剧烈 | 1. 接触不良 2. 电源噪声 |
1. 检查所有焊接点或插接点是否牢固,特别是弯曲传感器的引脚处,可以用热熔胶加固。 2. 尝试在CPX的3.3V和GND之间并联一个 10uF的电解电容 ,起到滤波稳压作用。 |
| 系统运行一段时间后复位 | 1. 电流过大导致电压跌落 2. 代码陷入死循环或内存泄漏 |
1. 强烈建议在最终可穿戴版本中使用独立电池为Crickit供电,与USB编程电源隔离。 2. 检查代码逻辑,确保没有在循环中动态创建大量对象。CircuitPython需要管理内存。 |
性能优化与进阶玩法 :
- 增加动作模式 :目前的代码是简单的“跟随模式”。你可以修改代码,实现“镜像模式”(左手传感器控制右手手指)、“开关模式”(弯曲一次手指,第六指完成一个预设动作如握拳)甚至“手势序列模式”(识别特定的弯曲速度或模式,触发复杂动作)。
- 引入反馈与交互 :利用CPX板载的 NeoPixel LED灯环 。可以让LED颜色根据手指弯曲程度变化(如从绿色渐变到红色),或者用蜂鸣器发出不同音调,提供视觉或听觉反馈。
- 改善佩戴体验 :为整个装置设计一个流线型的 外壳 ,将电子部分封装起来,既美观又安全。使用更轻质的材料(如尼龙)进行3D打印,可以减轻手腕负担。
- 无线化 :如果你希望摆脱线缆的束缚,可以考虑为CPX增加蓝牙或无线模块,但需要注意这会显著增加功耗和复杂度。一个更简单的无线化思路是,将传感器部分和主控/执行部分分开,通过一个小型无线收发模块(如NRF24L01)进行通信,这样传感器可以单独戴在手指上,更加轻便。
关于稳定性的终极心得 :可穿戴设备的稳定性,一半在电路和代码,一半在机械。机械结构的每一次摩擦、每一个不对中的关节,都会消耗舵机的力量,导致动作不准、反应迟滞甚至过热损坏。在组装过程中,多花时间进行 手工测试和微调 ——手动拉动线缆看手指是否灵活,检查每个关节的转动轴是否光滑,确保舵机安装座牢固无晃动。这些细节上的功夫,远比追求复杂的代码算法更能提升最终效果。我的第一个原型机失败,就是因为一个关节的支撑去除不彻底,导致动作卡顿,舵机很快就烧毁了。所以,耐心和细致,是这个项目带给我的最重要的经验。
更多推荐



所有评论(0)