1. 项目概述一个会“踉跄”行走的纸板机器人如果你对机器人感兴趣但又觉得那些复杂的机械结构、昂贵的金属零件和深奥的控制算法让人望而却步那么这个项目就是为你准备的。今天我们要聊的是一个名叫“Stumble-Bot”踉跄机器人的小家伙。它的核心魅力在于用最朴素的材料——一个纸板盒加上一些基础的电子元件就能实现一个拥有协调步态的行走机器人。这听起来可能有点不可思议一个纸盒子怎么走路但正是这种将复杂原理用简单方式实现的过程充满了创客的乐趣和工程智慧。这个项目的核心是伺服电机。你可以把它想象成机器人的“肌肉”和“关节”它能非常精确地转动到一个指定的角度。我们通过CircuitPython这种对初学者极其友好的编程语言向一块名为Circuit Playground Express的微控制器下达指令再由Crickit这块“全能扩展板”来安全、高效地驱动两个伺服电机。最终前腿负责“拉”后腿负责“推”和“支撑”在一进一退的协调中机器人就踉踉跄跄地向前迈步了。整个过程不需要焊接代码逻辑清晰机械结构直观非常适合作为机器人入门、STEM教育或者一个有趣的周末项目。无论你是编程新手还是想寻找一个快速验证想法的硬件黑客都能从这个项目中获得亲手让一个“生命”动起来的成就感。2. 核心硬件解析为什么是它们在动手切割纸板之前我们有必要先搞清楚手头这些电子元件的角色和它们协同工作的原理。理解“为什么用这个”远比记住“怎么连接”更重要这能让你在后续调试甚至改造时心中有数。2.1 大脑与感知Circuit Playground ExpressCircuit Playground Express后文简称CPX是这个项目的大脑。它不仅仅是一块微控制器更像是一个集成了多种传感器的“游乐场”。板载了温度传感器、光线传感器、运动传感器、麦克风甚至还有10个可编程的RGB NeoPixel灯。在这个项目中我们主要利用它的两个核心功能运行CircuitPython程序和处理按键输入。选择CPX的原因在于其极低的上手门槛。它通过一个USB接口就能完成供电和编程无需额外的烧录器。当你用USB线将其连接到电脑时它会显示为一个名为CIRCUITPY的U盘直接将编写好的code.py文件拖进去程序就开始运行了。这种“文件即编程”的方式彻底消除了传统嵌入式开发中编译、烧录的步骤让编程变得和编辑文本文档一样简单。板载的按键A在我们的代码中将被用作机器人的“启动开关”。2.2 肌肉驱动中枢Adafruit Crickit扩展板伺服电机不能直接连接到CPX上因为微控制器的引脚无法提供电机所需的大电流。强行连接可能会损坏宝贵的CPX。这就是Crickit存在的意义。你可以把它看作机器人的“脊髓”和“功率放大器”。Crickit通过一个紧凑的接口严丝合缝地扣在CPX上方为其扩展出了4路舵机/电机驱动通道、2路大电流直流电机/步进电机驱动、8个电容触摸输入接口以及多个 Grove 兼容接口。它内部集成了电机驱动芯片和必要的保护电路负责将CPX发出的低电流控制信号安全地转换为能驱动伺服电机的高电流信号。同时它提供了一个标准的2.1mm直流电源接口允许我们使用外部的电池盒供电将动力系统与逻辑控制系统分离确保系统稳定。在Stumble-Bot中我们使用了Crickit上的两路舵机控制通道。2.3 关节与执行器伺服电机的工作逻辑伺服电机是整个机器人能动起来的关键。它与普通电机只会连续旋转有本质区别。标准舵机内部包含一个小型直流电机、一套减速齿轮组和一个位置反馈电位器或编码器形成一个闭环控制系统。其工作原理是控制板通过Crickit向舵机发送一系列PWM脉冲宽度调制信号。这个信号的脉冲宽度高电平持续时间决定了舵机轴的目标角度。例如一个1.5ms的脉冲可能对应中间位置90度1.0ms的脉冲对应0度2.0ms的脉冲对应180度。舵机内部的电路会持续比较当前电位器反馈的位置与目标脉冲宽度对应的位置并驱动电机正向或反向旋转直到两者一致为止。项目中选用了一大一小的舵机TowerPro SG-5010大型舵机用于驱动后腿。后腿需要承受机器人身体的部分重量并提供推进力因此需要更大的扭矩。SG-5010提供了足够的力量。微型舵机用于驱动前腿。前腿主要执行“抬起-放下”的划动动作对扭矩要求相对较低使用更小、更轻的舵机有助于减轻前端重量并降低功耗。注意不同品牌、甚至同品牌不同批次的舵机其脉冲宽度范围min_pulse和max_pulse可能存在细微差异。代码中设置的500和2500单位微秒是TowerPro类舵机的典型值。如果使用其他舵机发现角度范围不准例如转不到180度可能需要微调这两个参数。2.4 能源供给电池选型的考量我们使用一个3节AA电池盒供电。这里有一个重要的细节为什么是3节AA碱性电池而不是更常见的4节或可充电的3.7V锂电池电压匹配Crickit的舵机驱动电路和CPX的输入电压范围通常在3.5V到5.5V之间。单节AA碱性电池满电电压约为1.6V随着使用会下降但通常稳定在1.5V左右。3节串联的标称电压是4.5V完美地位于设备的安全工作电压范围内。电流能力两个舵机尤其是在启动或卡顿时会产生较大的瞬间电流。AA电池能提供相对平稳的电流输出满足短时峰值需求。安全与简便4节AA电池电压会达到6V虽然很多设备标称能承受但长期工作在电压上限对元件寿命不友好且可能使舵机运动过快、发热。而单节锂电池3.7V-4.2V虽然电压合适但需要额外的充电和保护电路增加了复杂度。3节AA方案在性能、安全和易得性上取得了最佳平衡。3. 机械结构制作从纸板到“骨骼”机器人的“身体”和“腿”全部由纸板构成。这种材料选择不仅成本极低易于加工更重要的是它迫使设计必须简单、有效。整个制作过程是对基础机械原理的一次实践。3.1 箱体选择与腿部设计选择一个坚固、平整的纸板箱作为机器人主体。硬质快递箱是个不错的选择。机器人的“腿”并非独立的零件而是直接由箱体的上盖切割、加固而成。这种一体化设计极大地增强了结构的整体性。前腿设计前腿被设计成一个“A”字型或倒“V”型的刚性结构。这是通过将三片切割好的纸板用热熔胶垂直粘合实现的。这种结构在垂直方向承受向下压力和水平方向向前划动时都有很好的强度能将舵机的旋转运动有效地转化为向前的拉力。后腿设计后腿是一个简单的“U”形摇杆。它的功能更像一个杠杆支点在舵机的驱动下进行较小角度的前后摆动主要作用是协调步伐、抬起身体后半部分以配合前腿前进并提供推进力。在箱盖上画出腿部轮廓时不必追求绝对精确的直线但需要确保左右大致对称并且腿部与箱体连接的区域即将被切割分离的部分有足够的宽度以保持强度。用美工刀或剪刀进行切割时务必在垫板上操作保持刀刃锋利这样切出的边缘更整齐不易产生毛糙的纤维影响后续粘合。3.2 关键加固技术与关节连接纸板本身抗弯曲能力较弱尤其是在作为受力件时。因此加固是这一步的灵魂。垂直粘合与90度角保持在粘合前腿的三层纸板时涂上热熔胶后需要用力按压并保持至少30秒直到胶体完全固化。最关键的是在按压过程中必须用眼睛或直角尺辅助确保中间层纸板与底层完全垂直。一个歪斜的关节会严重影响机器人的行走直线性。雪糕棒加强筋的应用在粘合好的前腿两侧以及后腿的侧面我们用热熔胶粘上雪糕棒。这不是装饰这是经典的“复合材料”增强思路。雪糕棒木质或竹质的抗拉强度远高于纸板。将其粘在纸板受拉或受压的表面就像给混凝土结构加入钢筋一样能极大提高腿部的刚性防止在运动过程中反复受力后变得松软、弯曲。这是让纸板机器人能持久工作的关键技巧。舵盘与腿部的连接舵机附带的塑料舵盘是连接电机轴和腿部结构的关键部件。使用热熔胶或强力双面胶将舵盘平整地粘贴在腿部结构的顶端中心位置。确保粘贴牢固因为这里将传递所有的扭矩。之后用配套的小螺丝将腿部组件紧固在舵盘上。螺丝不要拧得过紧以至于压裂纸板也不要过松导致晃动以牢固、不松动为准。3.3 舵机安装与身体整合舵机在箱体上的安装位置和角度直接决定了机器人的运动姿态。前舵机安装大型SG-5010舵机安装在箱体底部靠近前端约2.5厘米处。在纸箱底部开一个与舵机外壳形状匹配的方孔将舵机从下方推入使其面板与纸箱底部外表面齐平。这样安装后舵机轴是垂直向上的前腿将直接安装在这个轴上做水平面上的旋转运动产生向前的“划桨”动作。后舵机安装微型舵机安装在箱体的后侧立面即后腿所在的那一面的正中央。同样开孔并压入使其面板与箱体侧面齐平。这样安装后舵机轴是水平向前的后腿将安装在这个轴上做垂直面上的前后摆动实现“蹬地”和“支撑”动作。固定与校准两个舵机就位后用热熔胶在四周点几个固定点确保它们不会在运行时因反作用力而移位。在正式连接腿部之前有一个至关重要的步骤手动校准中立点。用代码或手动轻轻转动舵机轴找到其机械旋转范围的大致中点通常是90度位置。然后将腿部组件安装到这个中立位置上。这能确保机器人的起始姿态是平衡的也为后续代码中角度的正负摆动提供了对称的基准。4. 电路连接与系统集成当机械部分准备就绪我们就进入了“赋予生命”的环节——电路连接。正确的连接是保证一切正常工作的基础而有序的布局则影响着机器人的稳定性和美观。4.1 电源系统准备安全永远是第一位的。在进行任何电线处理前务必确保电池盒内的电池已取出。电池盒改装大多数3节AA电池盒输出的是带有JST插头的红黑线。我们需要将其改为2.1mm直流插头。剪掉JST插头将红黑线各剥出约6-7毫米的铜芯。连接DC插头将剥好的红线插入直流插头端子座的“”端螺丝孔下黑线插入“-”端。拧紧螺丝确保电线被牢固压住没有铜丝裸露在外。完成后可以轻轻拉扯电线测试是否连接牢固。一个接触不良的电源接口将是后期最难排查的故障点之一。优化布局可选如果电池盒背面有腰带夹可以将其拆除这样能让电池盒更平整地贴在纸箱内壁上。4.2 主控制系统连接这是将所有核心部件串联起来的步骤请按照顺序操作堆叠核心板首先将Crickit扩展板对准Circuit Playground Express背面的金色引脚轻轻垂直压下直到两者完全结合。这个连接同时提供了数据通信和5V电源。连接舵机将两个舵机的接口线缆分别连接到Crickit上标有Servo 1和Servo 2的三针插座上。这里有一个必须遵守的方向确保所有舵机插头的黄色或白色信号线朝向Crickit板子的外侧边缘棕色或黑色地线朝向CPX板子一侧。这是Adafruit产品线的标准布局统一方向可以避免接反。接入电源将改装好的电池盒DC插头插入Crickit上唯一的2.1mm直流电源输入口。固定与布线使用双面胶先将电池盒固定在纸箱内部靠近后部的底板上。然后将Crickit连同其上的CPX堆叠体固定在电池盒上方。这样布局重心较低且集中有利于行走稳定性。用扎带或胶带整理好舵机线缆避免其缠绕进运动部件中。最终检查在通电前进行最后一次“三线检查”USB线连接电脑用于编程、电池盒开关置于OFF、Crickit上的电源开关也置于OFF。5. CircuitPython代码深度解读与调试代码是机器人的“灵魂”。这段代码不仅让机器人动起来更体现了如何用简单的逻辑协调两个执行器形成步态。5.1 代码结构与初始化我们将代码保存为code.py这样当CPX通电时便会自动运行。# SPDX-FileCopyrightText: 2018 Dano Wall for Adafruit Industries # SPDX-License-Identifier: MIT import time import board from digitalio import DigitalInOut, Direction, Pull from adafruit_crickit import crickit # 1. 硬件初始化 led DigitalInOut(board.D13) # 板载红色LED用于状态指示 led.direction Direction.OUTPUT button_A DigitalInOut(board.BUTTON_A) # 启动按钮 button_A.direction Direction.INPUT button_A.pull Pull.DOWN # 启用内部下拉电阻确保按键未按时为低电平 # 2. 舵机初始化 servos [crickit.servo_1, crickit.servo_2] # 创建一个舵机列表方便管理 # 设置脉冲宽度范围匹配TowerPro类舵机 servos[0].set_pulse_width_range(min_pulse500, max_pulse2500) # 后腿舵机 servos[1].set_pulse_width_range(min_pulse500, max_pulse2500) # 前腿舵机 # 将两个舵机都移动到90度位置机械中点 servos[1].angle 90 # 前腿 servos[0].angle 90 # 后腿关键点解析button_A.pull Pull.DOWN这是为了防止引脚悬空产生不确定的电平。启用内部下拉电阻后当按键未按下时引脚被稳定地拉到低电平0按下时连接到高电平3.3V。这是一种硬件消抖的基础配置。set_pulse_width_range这个函数是校准舵机角度范围的关键。500和2500是微秒值定义了舵机对应0度和180度的脉冲宽度。如果你的舵机转动角度不足可以尝试稍微增大max_pulse值例如2600如果转动过度则减小该值。5.2 运动函数实现踉跄步态的核心步态是通过两个独立的函数servo_front和servo_back控制的它们分别控制前腿划动和后腿摆动。def servo_front(direction): if direction 0: index 50 while index 100: servos[1].angle index # 控制前腿舵机servo_2 time.sleep(0.040) # 每次角度变化后延时40ms index index 2 # 每次增加2度 if direction 0: index 100 while index 50: servos[1].angle index time.sleep(0.040) index index - 2 time.sleep(0.002) # 函数执行完毕后的微小延时 def servo_back(direction): if direction 0: index 60 while index 90: servos[0].angle index # 控制后腿舵机servo_1 time.sleep(0.040) index index 4 # 后腿每次增加4度速度更快 if direction 0: index 100 while index 50: servos[0].angle index time.sleep(0.040) index index - 4 time.sleep(0.020)步态逻辑拆解非瞬时运动代码没有使用servo.angle X直接跳到目标角度而是通过while循环配合time.sleep让角度以较小的步长2度或4度逐渐变化。这模拟了“缓慢发力”的过程使得机器人的运动看起来更平滑、更自然也减少了因突然启动对机械结构和电源的冲击。运动范围差异化前腿 (servo_front)在50度到100度之间摆动总行程50度。这模拟了前腿在身体侧方向前划动和收回的动作。后腿 (servo_back)有两个运动段。direction0时从60度到90度上抬30度direction0时从100度到50度下压并后蹬50度。这个不对称设计是步态的关键后腿快速上抬30度然后更有力地后蹬下压50度从而产生向前的净推力。速度差异后腿的角度增量是4度前腿是2度。这意味着后腿完成其运动循环的速度大约是前腿的两倍。这种速度差协调了“蹬”和“划”的节奏。5.3 主循环与步态序列主循环while True持续检测按键A。一旦按下便触发一个完整的“踉跄步”循环。print(Its Stumble Bot Time) while True: if button_A.value: # 检测按键A是否被按下高电平 led.value True # 点亮LED指示开始运动 for i in range(5): # 重复5个完整的四步循环 print(back 1) # 后腿上抬 servo_back(1) time.sleep(0.100) print(front 1) # 前腿向前划动 servo_front(1) time.sleep(0.100) print(back 2) # 后腿下压后蹬 servo_back(-1) time.sleep(0.100) print(front 2) # 前腿收回 servo_front(-1) time.sleep(0.100) led.value False # 熄灭LED指示循环结束步态序列详解 一个完整的移动周期包含四个步骤顺序为后腿上抬 - 前腿前划 - 后腿下蹬 - 前腿收回。后腿上抬减轻后腿对地面的压力为身体前倾做准备。前腿前划此时前腿作为主要支撑点向前划动拖动身体前进。后腿下蹬后腿用力向后下方蹬地提供主要的前进推力。前腿收回前腿收回至起始位置准备下一个循环。这个序列使得机器人的重心在前后腿之间转移形成了独特的、有点笨拙但又有效的“踉跄”步态。for i in range(5)让这个四步序列重复5次然后停止等待下一次按键触发。6. 精细校准与问题排查实录即使完全按照指南制作你的第一个Stumble-Bot也可能不走直线或者动作别扭。别担心这是完全正常的。校准是机器人制作中从“能动”到“走好”的关键一步。6.1 数字校准法通过修改代码微调这是最精确的校准方法。在机器人通过USB连接电脑并且Mu编辑器连接到REPL交互式环境时进行。观察与诊断运行程序观察机器人运动。常见问题有原地转圈一条腿力量或行程不足、步幅不对称一条腿摆动角度大一条小、一条腿拖地中立点偏移。定位参数代码中控制每条腿运动范围的是servo_front和servo_back函数里的while循环起始和结束值。例如index 50和while index 100决定了前腿从50度运动到100度。交互式测试在Mu的REPL中你可以直接输入命令进行测试而无需反复修改保存代码文件。例如 servos[1].angle 90 # 将前腿舵机回到中点 servos[1].angle 70 # 测试前腿一个位置通过反复测试找到能让机器人腿部处于理想“前极限”和“后极限”的角度值。修改与验证将测试好的角度值更新到code.py文件中的相应位置。例如如果发现前腿向前划得不够远可以将while index 100中的100改为110。每次只修改一个参数然后测试效果逐步逼近最佳值。6.2 模拟校准法机械调整如果你没有电脑在身边或者觉得修改代码麻烦可以采用纯粹的机械调整。断电操作首先断开电池和USB供电。松开舵盘用螺丝刀轻轻松开固定腿部和舵盘的小螺丝让腿部可以自由转动但不要完全拆下。手动寻找中立点用手轻轻地将舵机的输出轴旋转到它机械行程的正中间。标准180度舵机的中间点通常在左右各转90度的位置。你可以缓慢地向一个方向转动直到遇到阻力不要强行用力记下位置再反向转到另一个阻力点取这两个位置的中间点。重新固定将腿部调整到你希望的“初始姿态”通常是垂直于地面或稍微有一个预置角度然后在这个姿态下将舵盘和腿部重新拧紧。这样当代码命令舵机转到90度时对应的就是你这个手动设置的“理想中立姿态”。实操心得最有效的方法往往是“数模结合”。先用机械校准法大致将腿部调到对称的物理位置然后再用数字校准法微调运动范围以补偿舵机个体差异、安装误差和纸板结构变形带来的影响。校准过程需要耐心通常需要3-5个迭代周期才能达到比较满意的直线行走效果。6.3 常见问题速查表以下表格汇总了制作和调试过程中可能遇到的典型问题及其解决方案问题现象可能原因排查步骤与解决方案通电后毫无反应LED也不亮1. 电源开关未打开。2. 电池电量耗尽或装反。3. DC插头接触不良。1. 确认Crickit和电池盒开关均在ON位。2. 更换全新碱性电池检查正负极方向。3. 摇晃并重新插拔DC插头检查接线螺丝是否拧紧。Circuit Playground Express未被电脑识别1. 板子处于“引导加载程序”模式。2. USB线仅供电不支持数据。3. 驱动程序问题仅Windows。1. 快速双击CPX上的复位按钮直到CIRCUITPY盘符出现。2. 换一根已知良好的数据线。3. 检查设备管理器可能需要安装Adafruit驱动。舵机抖动、不转动或转动无力1. 电源电压不足。2. 舵机线缆接触不良。3. 机械结构卡死。4. 脉冲宽度参数不匹配。1.首要检查使用万用表测量电池电压应高于4.0V。旧电池请立即更换。2. 重新插拔舵机线确保完全插入且方向正确。3. 手动转动腿部检查是否有纸板干涉或热熔胶堵塞。4. 尝试微调set_pulse_width_range中的值例如改为400, 2600。机器人原地转圈或走弧线1. 左右腿长度或形状有差异。2. 两个舵机性能有差异。3. 腿部安装中立点不一致。4. 地面摩擦力不均。1. 对比检查两条前腿/后腿的尺寸和加固情况。2. 交换两个舵机在Crickit上的接口如果问题方向随之改变则是舵机差异需通过代码校准补偿。3. 重新进行机械中立点校准。4. 在腿部底部粘贴电工胶布或砂纸统一摩擦力。代码已上传但按键无反应1. 文件未命名为code.py。2. 代码中存在语法错误导致无法运行。3. REPL未断开。1. 确认CIRCUITPY驱动器根目录下的主程序文件名为code.py。2. 在Mu中检查代码下方是否有红色错误提示。确保缩进正确。3. 按CtrlC退出REPL让主程序正常运行。运动几次后停止或行为异常1. 电池在负载下电压骤降。2. 舵机堵转导致过载保护。3. 连接线虚接。1. 这是最常见原因。即使新电池在驱动两个舵机时也可能电压不足。强烈建议使用全新的优质碱性电池或镍氢充电电池。2. 检查腿部运动是否被线缆或箱体卡住。3. 逐一检查所有插接件和螺丝接线端子。7. 优化、装饰与扩展思路当你的Stumble-Bot能够稳定地踉跄前行后就可以开始发挥创意让它变得独一无二甚至尝试一些功能扩展。7.1 性能与可靠性优化增加抓地力在光滑地面上纸板腿很容易打滑。用热熔胶在腿的底部画几条Z字型或点状纹路能显著增加摩擦力。或者粘贴一小块橡胶垫、砂纸。减轻重量重量是行走机器人的天敌。检查是否有不必要的冗余纸板可以裁剪掉可以考虑在箱体非承重部位开一些减重孔。重心调整如果机器人总是前倾或后仰可以尝试移动内部电池盒和电路板的位置。理想的重心应该落在四条腿构成的支持面中心略靠前的位置。电源升级如果追求更持久、更稳定的动力可以考虑使用一个输出5V/2A的移动电源充电宝通过USB线直接为CPX供电同时需断开电池。注意这需要Crickit的电源开关也打开且仅当USB供电足够稳定时才可行。7.2 个性化装饰赋予你的机器人个性是项目乐趣的一半。使用扭扭棒制作天线或手臂贴上大大的卡通眼睛用彩笔或贴纸绘制外壳图案。一个简单的“面部表情”或颜色主题能立刻让这个机械造物变得生动可爱。这也是一个向朋友和家人展示项目成果的绝佳方式。7.3 扩展实验与思考这个基础平台为更多实验打开了大门传感器交互利用CPX板载的光线传感器让机器人在黑暗中自动启动行走。或者利用声音传感器让它对你的拍手声做出反应。步态编程尝试修改servo_front和servo_back函数中的角度、步长和延时参数。你能让它走得更快吗能实现转弯吗提示尝试让左右腿动作不对称。无线控制为CPX添加一个红外接收器就可以用电视遥控器来控制它。或者添加蓝牙模块用手机App控制。结构改造能否设计四条腿的版本或者将纸板身体换成3D打印件设计更复杂的关节这个项目最宝贵的收获不仅仅是做出了一个会走的小玩具而是完整地体验了一个嵌入式机器人项目从机械设计、电子连接到软件编程、调试校准的全过程。每一个环节遇到的问题和解决方案都是实实在在的工程经验。当你看到这个由自己亲手组装、编程的纸盒机器人摇摇晃晃却又坚定地穿过桌面时那种跨越虚拟代码和物理世界界限的创造快乐正是创客精神的精髓所在。
用纸板和CircuitPython制作踉跄机器人:从伺服电机控制到步态编程
发布时间:2026/5/19 15:03:41
1. 项目概述一个会“踉跄”行走的纸板机器人如果你对机器人感兴趣但又觉得那些复杂的机械结构、昂贵的金属零件和深奥的控制算法让人望而却步那么这个项目就是为你准备的。今天我们要聊的是一个名叫“Stumble-Bot”踉跄机器人的小家伙。它的核心魅力在于用最朴素的材料——一个纸板盒加上一些基础的电子元件就能实现一个拥有协调步态的行走机器人。这听起来可能有点不可思议一个纸盒子怎么走路但正是这种将复杂原理用简单方式实现的过程充满了创客的乐趣和工程智慧。这个项目的核心是伺服电机。你可以把它想象成机器人的“肌肉”和“关节”它能非常精确地转动到一个指定的角度。我们通过CircuitPython这种对初学者极其友好的编程语言向一块名为Circuit Playground Express的微控制器下达指令再由Crickit这块“全能扩展板”来安全、高效地驱动两个伺服电机。最终前腿负责“拉”后腿负责“推”和“支撑”在一进一退的协调中机器人就踉踉跄跄地向前迈步了。整个过程不需要焊接代码逻辑清晰机械结构直观非常适合作为机器人入门、STEM教育或者一个有趣的周末项目。无论你是编程新手还是想寻找一个快速验证想法的硬件黑客都能从这个项目中获得亲手让一个“生命”动起来的成就感。2. 核心硬件解析为什么是它们在动手切割纸板之前我们有必要先搞清楚手头这些电子元件的角色和它们协同工作的原理。理解“为什么用这个”远比记住“怎么连接”更重要这能让你在后续调试甚至改造时心中有数。2.1 大脑与感知Circuit Playground ExpressCircuit Playground Express后文简称CPX是这个项目的大脑。它不仅仅是一块微控制器更像是一个集成了多种传感器的“游乐场”。板载了温度传感器、光线传感器、运动传感器、麦克风甚至还有10个可编程的RGB NeoPixel灯。在这个项目中我们主要利用它的两个核心功能运行CircuitPython程序和处理按键输入。选择CPX的原因在于其极低的上手门槛。它通过一个USB接口就能完成供电和编程无需额外的烧录器。当你用USB线将其连接到电脑时它会显示为一个名为CIRCUITPY的U盘直接将编写好的code.py文件拖进去程序就开始运行了。这种“文件即编程”的方式彻底消除了传统嵌入式开发中编译、烧录的步骤让编程变得和编辑文本文档一样简单。板载的按键A在我们的代码中将被用作机器人的“启动开关”。2.2 肌肉驱动中枢Adafruit Crickit扩展板伺服电机不能直接连接到CPX上因为微控制器的引脚无法提供电机所需的大电流。强行连接可能会损坏宝贵的CPX。这就是Crickit存在的意义。你可以把它看作机器人的“脊髓”和“功率放大器”。Crickit通过一个紧凑的接口严丝合缝地扣在CPX上方为其扩展出了4路舵机/电机驱动通道、2路大电流直流电机/步进电机驱动、8个电容触摸输入接口以及多个 Grove 兼容接口。它内部集成了电机驱动芯片和必要的保护电路负责将CPX发出的低电流控制信号安全地转换为能驱动伺服电机的高电流信号。同时它提供了一个标准的2.1mm直流电源接口允许我们使用外部的电池盒供电将动力系统与逻辑控制系统分离确保系统稳定。在Stumble-Bot中我们使用了Crickit上的两路舵机控制通道。2.3 关节与执行器伺服电机的工作逻辑伺服电机是整个机器人能动起来的关键。它与普通电机只会连续旋转有本质区别。标准舵机内部包含一个小型直流电机、一套减速齿轮组和一个位置反馈电位器或编码器形成一个闭环控制系统。其工作原理是控制板通过Crickit向舵机发送一系列PWM脉冲宽度调制信号。这个信号的脉冲宽度高电平持续时间决定了舵机轴的目标角度。例如一个1.5ms的脉冲可能对应中间位置90度1.0ms的脉冲对应0度2.0ms的脉冲对应180度。舵机内部的电路会持续比较当前电位器反馈的位置与目标脉冲宽度对应的位置并驱动电机正向或反向旋转直到两者一致为止。项目中选用了一大一小的舵机TowerPro SG-5010大型舵机用于驱动后腿。后腿需要承受机器人身体的部分重量并提供推进力因此需要更大的扭矩。SG-5010提供了足够的力量。微型舵机用于驱动前腿。前腿主要执行“抬起-放下”的划动动作对扭矩要求相对较低使用更小、更轻的舵机有助于减轻前端重量并降低功耗。注意不同品牌、甚至同品牌不同批次的舵机其脉冲宽度范围min_pulse和max_pulse可能存在细微差异。代码中设置的500和2500单位微秒是TowerPro类舵机的典型值。如果使用其他舵机发现角度范围不准例如转不到180度可能需要微调这两个参数。2.4 能源供给电池选型的考量我们使用一个3节AA电池盒供电。这里有一个重要的细节为什么是3节AA碱性电池而不是更常见的4节或可充电的3.7V锂电池电压匹配Crickit的舵机驱动电路和CPX的输入电压范围通常在3.5V到5.5V之间。单节AA碱性电池满电电压约为1.6V随着使用会下降但通常稳定在1.5V左右。3节串联的标称电压是4.5V完美地位于设备的安全工作电压范围内。电流能力两个舵机尤其是在启动或卡顿时会产生较大的瞬间电流。AA电池能提供相对平稳的电流输出满足短时峰值需求。安全与简便4节AA电池电压会达到6V虽然很多设备标称能承受但长期工作在电压上限对元件寿命不友好且可能使舵机运动过快、发热。而单节锂电池3.7V-4.2V虽然电压合适但需要额外的充电和保护电路增加了复杂度。3节AA方案在性能、安全和易得性上取得了最佳平衡。3. 机械结构制作从纸板到“骨骼”机器人的“身体”和“腿”全部由纸板构成。这种材料选择不仅成本极低易于加工更重要的是它迫使设计必须简单、有效。整个制作过程是对基础机械原理的一次实践。3.1 箱体选择与腿部设计选择一个坚固、平整的纸板箱作为机器人主体。硬质快递箱是个不错的选择。机器人的“腿”并非独立的零件而是直接由箱体的上盖切割、加固而成。这种一体化设计极大地增强了结构的整体性。前腿设计前腿被设计成一个“A”字型或倒“V”型的刚性结构。这是通过将三片切割好的纸板用热熔胶垂直粘合实现的。这种结构在垂直方向承受向下压力和水平方向向前划动时都有很好的强度能将舵机的旋转运动有效地转化为向前的拉力。后腿设计后腿是一个简单的“U”形摇杆。它的功能更像一个杠杆支点在舵机的驱动下进行较小角度的前后摆动主要作用是协调步伐、抬起身体后半部分以配合前腿前进并提供推进力。在箱盖上画出腿部轮廓时不必追求绝对精确的直线但需要确保左右大致对称并且腿部与箱体连接的区域即将被切割分离的部分有足够的宽度以保持强度。用美工刀或剪刀进行切割时务必在垫板上操作保持刀刃锋利这样切出的边缘更整齐不易产生毛糙的纤维影响后续粘合。3.2 关键加固技术与关节连接纸板本身抗弯曲能力较弱尤其是在作为受力件时。因此加固是这一步的灵魂。垂直粘合与90度角保持在粘合前腿的三层纸板时涂上热熔胶后需要用力按压并保持至少30秒直到胶体完全固化。最关键的是在按压过程中必须用眼睛或直角尺辅助确保中间层纸板与底层完全垂直。一个歪斜的关节会严重影响机器人的行走直线性。雪糕棒加强筋的应用在粘合好的前腿两侧以及后腿的侧面我们用热熔胶粘上雪糕棒。这不是装饰这是经典的“复合材料”增强思路。雪糕棒木质或竹质的抗拉强度远高于纸板。将其粘在纸板受拉或受压的表面就像给混凝土结构加入钢筋一样能极大提高腿部的刚性防止在运动过程中反复受力后变得松软、弯曲。这是让纸板机器人能持久工作的关键技巧。舵盘与腿部的连接舵机附带的塑料舵盘是连接电机轴和腿部结构的关键部件。使用热熔胶或强力双面胶将舵盘平整地粘贴在腿部结构的顶端中心位置。确保粘贴牢固因为这里将传递所有的扭矩。之后用配套的小螺丝将腿部组件紧固在舵盘上。螺丝不要拧得过紧以至于压裂纸板也不要过松导致晃动以牢固、不松动为准。3.3 舵机安装与身体整合舵机在箱体上的安装位置和角度直接决定了机器人的运动姿态。前舵机安装大型SG-5010舵机安装在箱体底部靠近前端约2.5厘米处。在纸箱底部开一个与舵机外壳形状匹配的方孔将舵机从下方推入使其面板与纸箱底部外表面齐平。这样安装后舵机轴是垂直向上的前腿将直接安装在这个轴上做水平面上的旋转运动产生向前的“划桨”动作。后舵机安装微型舵机安装在箱体的后侧立面即后腿所在的那一面的正中央。同样开孔并压入使其面板与箱体侧面齐平。这样安装后舵机轴是水平向前的后腿将安装在这个轴上做垂直面上的前后摆动实现“蹬地”和“支撑”动作。固定与校准两个舵机就位后用热熔胶在四周点几个固定点确保它们不会在运行时因反作用力而移位。在正式连接腿部之前有一个至关重要的步骤手动校准中立点。用代码或手动轻轻转动舵机轴找到其机械旋转范围的大致中点通常是90度位置。然后将腿部组件安装到这个中立位置上。这能确保机器人的起始姿态是平衡的也为后续代码中角度的正负摆动提供了对称的基准。4. 电路连接与系统集成当机械部分准备就绪我们就进入了“赋予生命”的环节——电路连接。正确的连接是保证一切正常工作的基础而有序的布局则影响着机器人的稳定性和美观。4.1 电源系统准备安全永远是第一位的。在进行任何电线处理前务必确保电池盒内的电池已取出。电池盒改装大多数3节AA电池盒输出的是带有JST插头的红黑线。我们需要将其改为2.1mm直流插头。剪掉JST插头将红黑线各剥出约6-7毫米的铜芯。连接DC插头将剥好的红线插入直流插头端子座的“”端螺丝孔下黑线插入“-”端。拧紧螺丝确保电线被牢固压住没有铜丝裸露在外。完成后可以轻轻拉扯电线测试是否连接牢固。一个接触不良的电源接口将是后期最难排查的故障点之一。优化布局可选如果电池盒背面有腰带夹可以将其拆除这样能让电池盒更平整地贴在纸箱内壁上。4.2 主控制系统连接这是将所有核心部件串联起来的步骤请按照顺序操作堆叠核心板首先将Crickit扩展板对准Circuit Playground Express背面的金色引脚轻轻垂直压下直到两者完全结合。这个连接同时提供了数据通信和5V电源。连接舵机将两个舵机的接口线缆分别连接到Crickit上标有Servo 1和Servo 2的三针插座上。这里有一个必须遵守的方向确保所有舵机插头的黄色或白色信号线朝向Crickit板子的外侧边缘棕色或黑色地线朝向CPX板子一侧。这是Adafruit产品线的标准布局统一方向可以避免接反。接入电源将改装好的电池盒DC插头插入Crickit上唯一的2.1mm直流电源输入口。固定与布线使用双面胶先将电池盒固定在纸箱内部靠近后部的底板上。然后将Crickit连同其上的CPX堆叠体固定在电池盒上方。这样布局重心较低且集中有利于行走稳定性。用扎带或胶带整理好舵机线缆避免其缠绕进运动部件中。最终检查在通电前进行最后一次“三线检查”USB线连接电脑用于编程、电池盒开关置于OFF、Crickit上的电源开关也置于OFF。5. CircuitPython代码深度解读与调试代码是机器人的“灵魂”。这段代码不仅让机器人动起来更体现了如何用简单的逻辑协调两个执行器形成步态。5.1 代码结构与初始化我们将代码保存为code.py这样当CPX通电时便会自动运行。# SPDX-FileCopyrightText: 2018 Dano Wall for Adafruit Industries # SPDX-License-Identifier: MIT import time import board from digitalio import DigitalInOut, Direction, Pull from adafruit_crickit import crickit # 1. 硬件初始化 led DigitalInOut(board.D13) # 板载红色LED用于状态指示 led.direction Direction.OUTPUT button_A DigitalInOut(board.BUTTON_A) # 启动按钮 button_A.direction Direction.INPUT button_A.pull Pull.DOWN # 启用内部下拉电阻确保按键未按时为低电平 # 2. 舵机初始化 servos [crickit.servo_1, crickit.servo_2] # 创建一个舵机列表方便管理 # 设置脉冲宽度范围匹配TowerPro类舵机 servos[0].set_pulse_width_range(min_pulse500, max_pulse2500) # 后腿舵机 servos[1].set_pulse_width_range(min_pulse500, max_pulse2500) # 前腿舵机 # 将两个舵机都移动到90度位置机械中点 servos[1].angle 90 # 前腿 servos[0].angle 90 # 后腿关键点解析button_A.pull Pull.DOWN这是为了防止引脚悬空产生不确定的电平。启用内部下拉电阻后当按键未按下时引脚被稳定地拉到低电平0按下时连接到高电平3.3V。这是一种硬件消抖的基础配置。set_pulse_width_range这个函数是校准舵机角度范围的关键。500和2500是微秒值定义了舵机对应0度和180度的脉冲宽度。如果你的舵机转动角度不足可以尝试稍微增大max_pulse值例如2600如果转动过度则减小该值。5.2 运动函数实现踉跄步态的核心步态是通过两个独立的函数servo_front和servo_back控制的它们分别控制前腿划动和后腿摆动。def servo_front(direction): if direction 0: index 50 while index 100: servos[1].angle index # 控制前腿舵机servo_2 time.sleep(0.040) # 每次角度变化后延时40ms index index 2 # 每次增加2度 if direction 0: index 100 while index 50: servos[1].angle index time.sleep(0.040) index index - 2 time.sleep(0.002) # 函数执行完毕后的微小延时 def servo_back(direction): if direction 0: index 60 while index 90: servos[0].angle index # 控制后腿舵机servo_1 time.sleep(0.040) index index 4 # 后腿每次增加4度速度更快 if direction 0: index 100 while index 50: servos[0].angle index time.sleep(0.040) index index - 4 time.sleep(0.020)步态逻辑拆解非瞬时运动代码没有使用servo.angle X直接跳到目标角度而是通过while循环配合time.sleep让角度以较小的步长2度或4度逐渐变化。这模拟了“缓慢发力”的过程使得机器人的运动看起来更平滑、更自然也减少了因突然启动对机械结构和电源的冲击。运动范围差异化前腿 (servo_front)在50度到100度之间摆动总行程50度。这模拟了前腿在身体侧方向前划动和收回的动作。后腿 (servo_back)有两个运动段。direction0时从60度到90度上抬30度direction0时从100度到50度下压并后蹬50度。这个不对称设计是步态的关键后腿快速上抬30度然后更有力地后蹬下压50度从而产生向前的净推力。速度差异后腿的角度增量是4度前腿是2度。这意味着后腿完成其运动循环的速度大约是前腿的两倍。这种速度差协调了“蹬”和“划”的节奏。5.3 主循环与步态序列主循环while True持续检测按键A。一旦按下便触发一个完整的“踉跄步”循环。print(Its Stumble Bot Time) while True: if button_A.value: # 检测按键A是否被按下高电平 led.value True # 点亮LED指示开始运动 for i in range(5): # 重复5个完整的四步循环 print(back 1) # 后腿上抬 servo_back(1) time.sleep(0.100) print(front 1) # 前腿向前划动 servo_front(1) time.sleep(0.100) print(back 2) # 后腿下压后蹬 servo_back(-1) time.sleep(0.100) print(front 2) # 前腿收回 servo_front(-1) time.sleep(0.100) led.value False # 熄灭LED指示循环结束步态序列详解 一个完整的移动周期包含四个步骤顺序为后腿上抬 - 前腿前划 - 后腿下蹬 - 前腿收回。后腿上抬减轻后腿对地面的压力为身体前倾做准备。前腿前划此时前腿作为主要支撑点向前划动拖动身体前进。后腿下蹬后腿用力向后下方蹬地提供主要的前进推力。前腿收回前腿收回至起始位置准备下一个循环。这个序列使得机器人的重心在前后腿之间转移形成了独特的、有点笨拙但又有效的“踉跄”步态。for i in range(5)让这个四步序列重复5次然后停止等待下一次按键触发。6. 精细校准与问题排查实录即使完全按照指南制作你的第一个Stumble-Bot也可能不走直线或者动作别扭。别担心这是完全正常的。校准是机器人制作中从“能动”到“走好”的关键一步。6.1 数字校准法通过修改代码微调这是最精确的校准方法。在机器人通过USB连接电脑并且Mu编辑器连接到REPL交互式环境时进行。观察与诊断运行程序观察机器人运动。常见问题有原地转圈一条腿力量或行程不足、步幅不对称一条腿摆动角度大一条小、一条腿拖地中立点偏移。定位参数代码中控制每条腿运动范围的是servo_front和servo_back函数里的while循环起始和结束值。例如index 50和while index 100决定了前腿从50度运动到100度。交互式测试在Mu的REPL中你可以直接输入命令进行测试而无需反复修改保存代码文件。例如 servos[1].angle 90 # 将前腿舵机回到中点 servos[1].angle 70 # 测试前腿一个位置通过反复测试找到能让机器人腿部处于理想“前极限”和“后极限”的角度值。修改与验证将测试好的角度值更新到code.py文件中的相应位置。例如如果发现前腿向前划得不够远可以将while index 100中的100改为110。每次只修改一个参数然后测试效果逐步逼近最佳值。6.2 模拟校准法机械调整如果你没有电脑在身边或者觉得修改代码麻烦可以采用纯粹的机械调整。断电操作首先断开电池和USB供电。松开舵盘用螺丝刀轻轻松开固定腿部和舵盘的小螺丝让腿部可以自由转动但不要完全拆下。手动寻找中立点用手轻轻地将舵机的输出轴旋转到它机械行程的正中间。标准180度舵机的中间点通常在左右各转90度的位置。你可以缓慢地向一个方向转动直到遇到阻力不要强行用力记下位置再反向转到另一个阻力点取这两个位置的中间点。重新固定将腿部调整到你希望的“初始姿态”通常是垂直于地面或稍微有一个预置角度然后在这个姿态下将舵盘和腿部重新拧紧。这样当代码命令舵机转到90度时对应的就是你这个手动设置的“理想中立姿态”。实操心得最有效的方法往往是“数模结合”。先用机械校准法大致将腿部调到对称的物理位置然后再用数字校准法微调运动范围以补偿舵机个体差异、安装误差和纸板结构变形带来的影响。校准过程需要耐心通常需要3-5个迭代周期才能达到比较满意的直线行走效果。6.3 常见问题速查表以下表格汇总了制作和调试过程中可能遇到的典型问题及其解决方案问题现象可能原因排查步骤与解决方案通电后毫无反应LED也不亮1. 电源开关未打开。2. 电池电量耗尽或装反。3. DC插头接触不良。1. 确认Crickit和电池盒开关均在ON位。2. 更换全新碱性电池检查正负极方向。3. 摇晃并重新插拔DC插头检查接线螺丝是否拧紧。Circuit Playground Express未被电脑识别1. 板子处于“引导加载程序”模式。2. USB线仅供电不支持数据。3. 驱动程序问题仅Windows。1. 快速双击CPX上的复位按钮直到CIRCUITPY盘符出现。2. 换一根已知良好的数据线。3. 检查设备管理器可能需要安装Adafruit驱动。舵机抖动、不转动或转动无力1. 电源电压不足。2. 舵机线缆接触不良。3. 机械结构卡死。4. 脉冲宽度参数不匹配。1.首要检查使用万用表测量电池电压应高于4.0V。旧电池请立即更换。2. 重新插拔舵机线确保完全插入且方向正确。3. 手动转动腿部检查是否有纸板干涉或热熔胶堵塞。4. 尝试微调set_pulse_width_range中的值例如改为400, 2600。机器人原地转圈或走弧线1. 左右腿长度或形状有差异。2. 两个舵机性能有差异。3. 腿部安装中立点不一致。4. 地面摩擦力不均。1. 对比检查两条前腿/后腿的尺寸和加固情况。2. 交换两个舵机在Crickit上的接口如果问题方向随之改变则是舵机差异需通过代码校准补偿。3. 重新进行机械中立点校准。4. 在腿部底部粘贴电工胶布或砂纸统一摩擦力。代码已上传但按键无反应1. 文件未命名为code.py。2. 代码中存在语法错误导致无法运行。3. REPL未断开。1. 确认CIRCUITPY驱动器根目录下的主程序文件名为code.py。2. 在Mu中检查代码下方是否有红色错误提示。确保缩进正确。3. 按CtrlC退出REPL让主程序正常运行。运动几次后停止或行为异常1. 电池在负载下电压骤降。2. 舵机堵转导致过载保护。3. 连接线虚接。1. 这是最常见原因。即使新电池在驱动两个舵机时也可能电压不足。强烈建议使用全新的优质碱性电池或镍氢充电电池。2. 检查腿部运动是否被线缆或箱体卡住。3. 逐一检查所有插接件和螺丝接线端子。7. 优化、装饰与扩展思路当你的Stumble-Bot能够稳定地踉跄前行后就可以开始发挥创意让它变得独一无二甚至尝试一些功能扩展。7.1 性能与可靠性优化增加抓地力在光滑地面上纸板腿很容易打滑。用热熔胶在腿的底部画几条Z字型或点状纹路能显著增加摩擦力。或者粘贴一小块橡胶垫、砂纸。减轻重量重量是行走机器人的天敌。检查是否有不必要的冗余纸板可以裁剪掉可以考虑在箱体非承重部位开一些减重孔。重心调整如果机器人总是前倾或后仰可以尝试移动内部电池盒和电路板的位置。理想的重心应该落在四条腿构成的支持面中心略靠前的位置。电源升级如果追求更持久、更稳定的动力可以考虑使用一个输出5V/2A的移动电源充电宝通过USB线直接为CPX供电同时需断开电池。注意这需要Crickit的电源开关也打开且仅当USB供电足够稳定时才可行。7.2 个性化装饰赋予你的机器人个性是项目乐趣的一半。使用扭扭棒制作天线或手臂贴上大大的卡通眼睛用彩笔或贴纸绘制外壳图案。一个简单的“面部表情”或颜色主题能立刻让这个机械造物变得生动可爱。这也是一个向朋友和家人展示项目成果的绝佳方式。7.3 扩展实验与思考这个基础平台为更多实验打开了大门传感器交互利用CPX板载的光线传感器让机器人在黑暗中自动启动行走。或者利用声音传感器让它对你的拍手声做出反应。步态编程尝试修改servo_front和servo_back函数中的角度、步长和延时参数。你能让它走得更快吗能实现转弯吗提示尝试让左右腿动作不对称。无线控制为CPX添加一个红外接收器就可以用电视遥控器来控制它。或者添加蓝牙模块用手机App控制。结构改造能否设计四条腿的版本或者将纸板身体换成3D打印件设计更复杂的关节这个项目最宝贵的收获不仅仅是做出了一个会走的小玩具而是完整地体验了一个嵌入式机器人项目从机械设计、电子连接到软件编程、调试校准的全过程。每一个环节遇到的问题和解决方案都是实实在在的工程经验。当你看到这个由自己亲手组装、编程的纸盒机器人摇摇晃晃却又坚定地穿过桌面时那种跨越虚拟代码和物理世界界限的创造快乐正是创客精神的精髓所在。