
1. 项目概述与核心思路如果你也和我一样对机器人如何像生物一样适应复杂环境充满好奇那么亲手打造一个能“变形”的轮式机器人无疑是一次绝佳的实践。这个项目源于一个简单的观察传统轮子在平坦路面效率极高但遇到沙地、碎石或小障碍时往往就束手无策了。而许多动物比如猫在攀爬时能伸出爪子增加抓地力给了我们灵感——为什么轮子不能也“伸出爪子”呢这就是“自适应地形机器人”的核心一套能根据地面状况在圆形轮和爪形轮之间自主切换的行走机构。整个系统的逻辑非常清晰一个“眼睛”超声波传感器不断探测前方地面的平整度一个“大脑”Arduino判断当前轮形是否匹配地面最后“四肢”直流电机执行变形或移动指令。听起来像是科幻片里的场景但用我们手边常见的开源硬件和3D打印技术完全可以在工作台上实现。我这次搭建的原型重点解决了三个工程难题一是如何用最精简的机械结构实现轮子的可靠开合二是如何用有限的预算约200欧元和常见的电子模块如Arduino、L298N构建稳定的控制系统三是如何编写逻辑让传感器数据能准确驱动机械动作而不是乱动一气。整个过程下来不仅做出了一个能跑能变的机器人更对机电一体化系统的设计、集成与调试有了更深的理解。无论你是机器人爱好者、工科学生还是想找个硬核项目练手的创客跟着这篇记录走一遍你收获的将远不止一堆零件和代码。2. 核心机械结构可变形轮的设计与实现可变形轮是整个项目的灵魂它的设计直接决定了机器人的地形适应能力。我们的目标很明确轮子需要有两种稳定形态——闭合时为标准的圆形轮用于高速、低阻力的平坦路面行驶展开时变为三个或更多抓地爪用于增加与松散、不平地面的接触面积和附着力就像给轮子穿上了钉鞋。2.1 变形原理与传动方案选择实现轮子变形主流思路有两种一是采用独立的直线推杆如舵机连杆直接推动轮辐开合优点是控制直接但结构复杂、重量大二是利用差速原理通过两个电机的速度差驱动一套行星齿轮机构让轮子在滚动的同时完成变形结构紧凑但控制逻辑稍复杂。我们选择了第二种方案它更巧妙也更考验机械设计功底。其核心灵感来源于轮腿复合机器人的研究。具体来说每个轮子内部集成了一套传动系统一个电机负责驱动轮子整体旋转我们称为“行进电机”另一个电机则固定在与轮子同轴旋转的支架上负责驱动一个中心小齿轮我们称为“变形电机”。当两个电机同步旋转时轮子保持闭合状态平稳滚动当我们需要轮子展开时就让“变形电机”的输出速度与“行进电机”产生一个速度差。这个速度差会通过齿轮传递转化为驱动轮辐即“半轮”部件向外展开的力从而实现变形。简单理解就像你用手握住一个旋转的伞柄如果你手的转速和伞柄不一致伞面就会开合。注意这里有一个关键点“变形电机”的壳体必须是随轮子一起转动的。也就是说当轮子滚动时这个电机本身也在做“公转”。这就要求电机的供电不能使用普通的导线否则会很快缠绕拧断。我们采用了微型滑环来解决这个问题它允许电流在旋转部件间稳定传输。2.2 3D打印部件的设计与优化为了快速迭代和降低成本所有非标机械结构均采用3D打印制作。主要包含以下五个关键部件其设计要点直接关系到最终运行的顺畅度轮毂壳体这是整个轮子的骨架需要同时容纳行进电机、变形电机以及传动齿轮。设计时内部空腔的直径我们设为27mm必须严格匹配所选“变形电机”JGA25-370的外壳直径确保电机能紧密固定避免在高速旋转中晃动。此外壳体前后需要预留轴承位以支撑主轴减少摩擦。打印时需要注意这是一对镜像对称的零件左轮和右轮的壳体是相反的切片时务必应用镜像功能。中心齿轮这个小齿轮直接安装在“变形电机”的输出轴上是驱动轮子开合的动力源。它的齿数我们设计为12齿和模数1.5需要与后续的传动系统匹配。最关键的是齿轮中心的轴孔必须与电机轴的形状通常是D型轴或圆形带平面和尺寸严丝合缝最好能设计一个紧配合必要时可以滴一滴胶水加固防止打滑。“半轮”抓地爪这就是轮子展开后看到的“爪子”。我们设计为三个独立的弧形爪片。其根部需要设计转轴孔与轮毂壳体上的轴配合。爪片的外缘需要设计防滑纹路并预留粘贴橡胶垫的凹槽以增加在松散地面的抓地力。爪片的形状和重量分布需要优化确保展开和收拢时运动轨迹顺畅且不会因为离心力而意外弹出。从动大齿轮这个齿轮28齿通过螺丝固定在轮毂壳体的背面它与“行进电机”上的驱动齿轮啮合负责将动力传递给整个轮子使其旋转。它的固定必须非常牢固因为需要传递驱动整台机器人前进的扭矩。电机驱动齿轮这个齿轮23齿安装在“行进电机”的输出轴上与上述的从动大齿轮啮合。齿轮比23:28决定了最终输出到轮子的转速和扭矩需要根据电机的额定转速和机器人的期望速度进行核算。所有齿轮均采用14.5°压力角、模数1.5的标准渐开线齿轮这保证了啮合的平稳性和强度。使用CAD软件如Fusion 360设计时可以利用内置的齿轮生成器插件只需输入模数、齿数等参数即可自动生成大大降低了设计门槛。实操心得3D打印齿轮和结构件材料选择很关键。PLA材料虽然容易打印但较脆长期受力可能断裂。建议使用PETG或者ABS材料它们韧性更好更适合做受力件。打印填充率建议设置在40%以上层高可以选0.2mm或更小以提高零件的强度和表面精度确保齿轮啮合顺滑。2.3 整体装配与机械调试装配顺序很重要。首先将“变形电机”装入轮毂壳体并安装好中心齿轮。然后将三个“半轮”抓地爪通过销轴安装到壳体前部的对应位置。接着从壳体后方装入“行进电机”并装上电机驱动齿轮再将从动大齿轮对准齿轮副后用螺丝紧固到壳体上。最后将组装好的整个轮子模块通过主轴安装到机器人的侧板支架上。装配完成后不要急着通电先进行手动调试。用手转动轮子感受是否有卡滞尝试手动拨动抓地爪检查其开合范围是否达到设计预期运动过程有无干涉。特别要检查两个齿轮副的啮合间隙间隙太大会导致传动不精确、产生噪音间隙太小则会增加阻力甚至卡死。可以通过在电机安装座上添加垫片来微调齿轮间隙。3. 电子系统设计与电路搭建一个灵活的机械身体需要一个可靠的中枢神经系统来指挥。我们的电子系统围绕Arduino Uno展开核心任务就两个感知环境超声波传感器和控制执行器四个直流电机。整个电路的设计原则是模块化、清晰化和安全供电。3.1 主控与电源方案解析选择Arduino Uno作为主控几乎是创客项目的标准答案。原因很简单它拥有14个数字I/O口其中6个支持PWM和6个模拟输入口足以控制我们需要的4个电机和1个传感器其基于ATmega328P的架构稳定可靠最重要的是它拥有极其庞大的社区和库支持任何问题几乎都能找到解决方案这对快速开发和调试至关重要。供电是机器人稳定运行的基石。我们总共使用了4个直流电机其中两个驱动轮子行进RS PRO 12V两个驱动轮子变形JGA25-370 12V它们都是“用电大户”。此外Arduino和传感器需要5V逻辑电压。如果所有设备共用一组电池在大电流负载下逻辑电压可能会被拉低导致单片机重启或传感器误读。因此我们采用了双路独立供电方案动力电源使用8节1.5V AA电池串联成12V专门为4个电机供电。电机启动和堵转时电流很大独立供电可以避免干扰控制电路。控制电源另外使用8节1.5V AA电池串联成12V先经过一个LM2596降压模块将电压稳定降至9V再供给Arduino的Vin引脚。Arduino板载的稳压器会将其进一步降至5V供给自身和超声波传感器。这样确保了控制核心电压的纯净和稳定。踩坑记录最初尝试用一组12V电池同时给电机和Arduino供电通过L298N模块的5V输出端给Arduino供电。结果发现当电机启动或负载加大时Arduino会频繁重启。这是因为L298N的5V输出是线性稳压输出电流有限且容易受到电机端电压波动的影响。改用完全独立的双路供电后问题彻底解决。3.2 电机驱动与传感器接口控制直流电机正反转和调速最常用的就是H桥电路。我们选用现成的L298N双路电机驱动模块一个模块可以驱动两个电机正好需要两个模块来驱动四个电机。接线逻辑如下电源端模块的12V和GND接动力电源的12V正负极。电机端每个模块的OUT1、OUT2接一个电机OUT3、OUT4接另一个电机。控制端这是与Arduino对话的关键。IN1、IN2、IN3、IN4是方向控制引脚接Arduino的任意数字I/O口如2, 3, 4, 5。通过设置(IN1, IN2)为(HIGH, LOW)或(LOW, HIGH)来控制对应电机的正反转设为(LOW, LOW)或(HIGH, HIGH)则为刹车或停止。ENA、ENB是使能/PWM调速引脚必须接Arduino上带有~标识的PWM输出口如6, 9。通过analogWrite(pin, value)函数输出0-255的值可以无级调节电机的速度。逻辑供电L298N模块上有一个5V输出端和一个5V Input跳线帽。当使用独立电源为电机供电时需要拔掉跳线帽并从Arduino的5V引脚引一根线接到模块的5V输入端以此给模块内部的逻辑电路供电确保控制信号电平匹配。HC-SR04超声波传感器的接口则简单得多。它只有四个引脚VCC接Arduino的5V。GND接Arduino的GND。Trig触发引脚接一个数字I/O口如10。给此引脚一个至少10微秒的高电平脉冲传感器就会发射超声波。Echo回响引脚接一个数字I/O口如11。当传感器接收到回波后此引脚会输出一个高电平脉冲脉冲的宽度正比于被测距离。3.3 电路集成与布线技巧将所有模块集成在一块洞洞板Protoboard上并用焊锡连接比用面包板更可靠能避免机器人运动时接头松动。布局时遵循“电源走一边信号走一边”的原则在洞洞板的一侧建立一条“电源总线”将动力电源的12V、GND和控制电源的9V、GND分别用粗导线并联引出多个接入点。所有模块的电源正负极就近接入对应的总线。信号线如Arduino到L298N的控制线、到传感器的线可以走另一侧尽量整齐捆扎。在总电源入口处一定要加一个开关方便快速切断电源安全第一。给Arduino和每个L298N模块的安装孔配上铜柱和螺丝牢固地固定在机器人的底板上防止震动脱落。注意事项电机在停止、反转瞬间会产生很高的反向电动势可能会损坏驱动芯片。虽然L298N内部有续流二极管但为了更安全可以在每个电机的两个引脚之间焊接一个0.1uF的瓷片电容和一个反向并联的二极管如1N4007组成消火花电路有效保护驱动模块。4. 机器人本体结构设计与组装电子系统是大脑和神经机械轮子是手脚而机器人的“躯干”则需要将它们稳固、合理地整合在一起。我们的设计目标是轻量化总重2kg、高刚性、易于装配和维护。4.1 激光切割骨架设计我们选择了6mm厚的中密度纤维板作为主体结构材料。MDF易于激光切割加工精度高且重量相对较轻刚度足以支撑整个机器人。使用CAD软件如SolidWorks或Fusion 360进行设计可以精确规划每一个零件。骨架主要由以下几部分构成双侧主侧板这是承载所有重量的核心部件。板上需要设计轮子模块安装孔用于固定轮毂壳体的轴承座。孔位必须与3D打印的轮毂壳体上的安装孔完全对应精度要求高。行进电机安装座设计带加强筋的电机座并用M3螺丝固定确保电机在输出大扭矩时不会晃动。内部电子设备安装柱设计多个带螺纹孔的支柱用于安装Arduino、L298N驱动板和电池盒。减轻孔在非受力区域切割出各种形状的孔洞在保证强度的前提下最大限度减轻重量。内部加强隔板连接左右两侧板防止其在高负载下向外弯曲变形。同时这些隔板也作为内部设备的安装平台和走线通道。顶板与传感器支架顶板用于封闭顶部增加整体扭转刚度。传感器支架是一个向前下方伸出的“灯笼”状结构其底部开有精确的圆孔用于嵌入超声波传感器的发射和接收头并将其固定指向地面实现垂直方向的地面高度检测。设计完成后将零件图导出为.dxf格式供激光切割机使用。一个高级技巧是可以在设计时就在螺丝孔位置绘制出比螺丝直径稍小的圆激光切割后MDF材料会形成一个紧密的摩擦配合孔直接拧入自攻螺丝就能获得很好的固定效果省去了预埋螺母的步骤。4.2 总装流程与调校组装遵循从内到外、从下到上的顺序安装内部结构先将内部加强隔板与一侧主侧板用螺丝组装好。然后在这一侧的内部安装上电池盒、Arduino和L298N驱动板。将电机线、传感器线、电源线预先布置好并用扎带固定。安装轮子与电机将组装好的轮子模块含行进电机安装到主侧板的对应位置。将“变形电机”的导线穿过滑环后连接到对应的L298N驱动板输出端。务必确保左右轮的装配是镜像对称的。合拢与封闭将另一侧主侧板盖上对齐所有螺丝孔位并紧固。此时机器人主体框架基本成型。安装顶板与传感器盖上顶板并固定。将超声波传感器小心压入传感器支架的孔中为了更牢固可以在传感器侧面粘贴一小块魔术贴毛面与支架内壁的勾面粘合。安装尾轮机器人尾部需要一对从动尾轮来保持平衡。我们直接使用了两个现成的橡胶轮通过一个M6的螺丝和螺母作为轴安装在底板尾部。尾轮的高度需要仔细调整确保机器人在平地时四个轮子两个主动轮两个尾轮能同时着地且车身基本水平。粘贴防滑橡胶最后在所有3D打印的主动轮和“爪子”的外缘用强力胶粘贴上一圈自行车内胎剪成的橡胶条。这能极大增加抓地力尤其是在光滑的MDF板或瓷砖上测试时能有效防止空转打滑。装配心得在拧紧所有螺丝之前最好进行一次“假组”即不拧紧先看看所有零件是否都能对齐线缆是否有足够的活动空间。另外给所有螺丝点一滴螺丝胶如乐泰242可以防止机器人在高频振动下螺丝松动这是从航模领域学来的宝贵经验。5. 控制逻辑与Arduino程序剖析硬件搭建完毕接下来就是赋予机器人“智能”的关键——编程。程序的核心是一个基于状态机的决策循环它不断询问“我在哪我该是什么形态我现在对吗如果不对我该怎么做”5.1 传感器数据处理与地面类型判断我们使用超声波传感器垂直向下检测地面高度。原理很简单在平坦地面上传感器到地面的距离是基本稳定的当遇到碎石地时由于地面凹凸不平测得的距离值会持续、快速地上下波动。但这里有一个严重的干扰当轮子处于展开爪形状态时即使是在平地上由于爪子的凸起结构机器人前进时车身也会随之轻微地上下起伏导致传感器读数出现周期性波动。这个波动幅度可能会被误判为碎石地。解决方法是引入“容忍度”概念。我们不是看单次测量的绝对值而是计算一个时间窗口内的测量平均值。数据采集在loop()函数中以固定频率如每50毫秒读取一次传感器距离值。滑动平均滤波维护一个数组存储最近N次比如10次的测量值并实时计算其平均值。这种滤波方法能有效消除偶然的尖峰噪声。变化量检测计算当前平均值与上一个时间窗口的平均值之间的差值绝对值。阈值判断设定一个“容忍度”阈值。如果变化量小于该阈值则认为地面是“平坦的”如果大于该阈值则认为地面是“不平的”碎石地。这个阈值需要通过实验校准让机器人在平地上以展开轮状态行驶记录下传感器读数的最大波动范围阈值应略大于这个范围。// 伪代码示例 const int SAMPLE_COUNT 10; long distanceSamples[SAMPLE_COUNT]; int sampleIndex 0; long previousAverage 0; const long TOLERANCE 30; // 容忍度阈值单位毫米需实验测定 void checkTerrain() { long currentDistance readUltrasonic(); // 读取传感器 distanceSamples[sampleIndex] currentDistance; sampleIndex (sampleIndex 1) % SAMPLE_COUNT; long currentAverage calculateAverage(distanceSamples, SAMPLE_COUNT); long change abs(currentAverage - previousAverage); if (change TOLERANCE) { terrainType ROUGH; // 不平地面 } else { terrainType FLAT; // 平坦地面 } previousAverage currentAverage; }5.2 状态机与轮形控制逻辑机器人的行为可以用一个简单的状态机来描述它主要有三个状态MOVING移动中、STOPPED已停止、TRANSFORMING变形中。程序流程如下初始化开机后从Arduino的EEPROM中读取一个保存的变量wheelStateDEPLOYED或RETRACTED该变量记录了上次关机时轮子的形态。然后机器人进入MOVING状态启动行进电机。主循环 a.持续感知在MOVING状态下持续调用checkTerrain()函数判断地面类型。 b.决策将判断出的terrainType与当前的wheelState进行比较。 - 如果(terrainType ROUGH wheelState RETRACTED)说明在碎石地上用了闭合轮需要展开。触发状态转换MOVING-STOPPED-TRANSFORMING展开-MOVING。 - 如果(terrainType FLAT wheelState DEPLOYED)说明在平地上用了展开轮需要收拢。触发状态转换MOVING-STOPPED-TRANSFORMING收拢-MOVING。 - 其他情况形态匹配则保持MOVING状态。 c.执行与记录在TRANSFORMING状态控制“变形电机”正转或反转一定时间需实验测定完成轮子开合。动作完成后更新wheelState变量并将其写入EEPROM保存然后切换回MOVING状态。使用EEPROM是为了实现“记忆”功能。假设机器人在碎石地展开轮子后断电下次开机时它能知道轮子当前是展开的如果检测到地面平坦就会主动收拢轮子而不是错误地保持展开状态。5.3 电机控制函数与参数校准程序需要封装几个基础电机控制函数使主逻辑清晰void moveForward(int speed): 设置两个行进电机的PWM值使机器人直行。void stopMoving(): 停止行进电机。void deployWheels(): 控制两个变形电机同向旋转例如正转持续预设的deployTime毫秒。void retractWheels(): 控制两个变形电机反向旋转例如反转持续预设的retractTime毫秒。参数校准是调试中最耗时但最关键的一步deployTime/retractTime这两个时间需要手动测试确定。时间太短轮子变形不到位时间太长电机会堵转齿轮可能损坏。测试时应让机器人悬空逐步增加时间直到轮子完全开合到位并留有一点余量。moveSpeed行进电机的PWM值。太慢效率低太快在变形瞬间可能失稳。建议从较低速度如PWM150开始测试。TOLERANCE如前所述需要机器人装上展开轮在平地上行驶通过串口监视器观察传感器平均值的最大波动然后设定一个比该值大20%-30%的阈值。调试技巧在代码中大量使用Serial.print()语句将关键变量如传感器读数、平均值、当前状态、轮子状态实时打印到串口监视器。这是你了解机器人“内心想法”的最直接窗口对于排查逻辑错误和校准参数不可或缺。6. 测试、优化与问题排查实录从一堆零件到一个能自主运行的机器人中间必定充满挑战。我将整个测试调试过程中遇到的主要问题、解决思路和优化方法记录下来希望能帮你少走弯路。6.1 初期功能测试与暴露的问题第一阶段我们分模块进行测试轮子变形测试单独给变形电机供电观察轮子能否顺畅、完整地开合。问题偶尔会出现某个“爪子”卡住无法完全展开或收拢。排查发现是3D打印的爪片转轴孔有毛刺导致转动不顺畅。用锉刀和小钻头仔细清理所有轴孔后解决。同时在齿轮啮合处涂抹少量白色润滑脂减少阻力。移动测试只连接行进电机让机器人空载不装传感器和其他设备在平滑地面移动。问题机器人走不直总是偏向一边。排查首先检查左右轮安装是否对称、紧固。然后通过串口分别设置左右电机为相同的PWM值用手机测速软件测量两轮实际转速发现果然有差异。这是由于即使是同一型号的电机也存在微小的性能差异。解决在代码中为左右电机设置一个微调系数。例如如果右轮慢5%则将右轮电机的PWM值乘以1.05。这是一个非常实用的“软件校准”方法。传感器测试将传感器安装到位编写简单程序读取其在平坦桌面和铺有鹅卵石的托盘上的数值。问题数值跳动很大不稳定。排查超声波传感器对供电噪声很敏感。检查发现其VCC和GND是和其他模块共用一条较长的导线。解决为传感器单独拉一条较短的、直接从Arduino的5V和GND引脚引出的电源线并在VCC和GND之间并联一个10uF的电解电容和一个0.1uF的瓷片电容进行滤波。之后读数稳定多了。6.2 系统集成与联调挑战当所有模块组合在一起进行全功能测试时更复杂的问题出现了变形时机器人“跳闸”重启当轮子开始变形时整个系统有时会断电重启。分析变形电机启动瞬间电流极大可能造成动力电源电压瞬间跌落如果控制电源与其关联就会牵连Arduino重启。确认我们使用的是独立双路供电理论上隔离了。但用万用表监测发现当变形电机动作时控制电源的电压也会有小幅波动。根源两个电池组的负极GND在电路中是共地的。大电流负载引起的“地弹”噪声会通过共同的地线干扰控制电路。解决在动力电源的输入端并联一个大的电解电容如1000uF/16V它可以像一个小水库在电机启动瞬间提供瞬时大电流平滑电压跌落。同时确保所有GND连接点接触良好导线尽可能粗短。误判与抖动机器人在平地上行驶时偶尔会突然误判为碎石地而停车变形。分析查看串口数据发现误判发生时传感器读数出现了短暂的巨大跳变。排查检查传感器安装发现其只是卡在孔里没有完全固定机器人震动时传感器角度可能微变导致测距不准。解决用热熔胶将传感器牢牢固定在支架内确保其指向绝对垂直向下。同时将滑动平均滤波的窗口样本数SAMPLE_COUNT从10增加到20进一步平滑数据。变形后行进无力轮子展开后在碎石地上行进非常慢甚至无法前进。分析展开后轮子与地面的接触点变了力臂变短可能需要更大的扭矩。同时碎石地阻力也更大。解决在代码中设置两套行进速度。当wheelState为DEPLOYED时将moveSpeed的PWM值提高例如从180提高到220为电机提供更大功率。同时确保电池电量充足老旧电池内阻增大无法提供大电流。6.3 最终优化与性能提升点经过反复调试机器人已经可以可靠地在平地和模拟碎石地铺满核桃或小木块之间切换轮形态。但仍有提升空间机械自锁结构目前的轮子展开后仅靠齿轮传动的摩擦力保持形态。在受到较大侧向冲击时爪子有可能意外收拢。可以在轮毂壳体内设计一个简单的棘轮或弹簧销机构当爪子到达极限位置时能锁死需要电机主动反转才能解锁收回。更智能的感知算法目前仅靠高度变化方差来判断地形比较粗糙。可以尝试采集更长时间、更多维度的传感器数据如变化频率、周期性甚至结合一个简单的惯性测量单元IMU检测车身振动用更复杂的算法如阈值比较简单模式识别来提高判断准确率。动态速度调节当前行进速度是固定的。可以加入编码器或通过检测电机电流来估算轮子是否打滑从而实现简单的牵引力控制在打滑时自动降低速度或微调左右轮速差。轻量化与续航如原文所述我们使用的RS PRO电机单个重达800g是主要的重量来源。后续可以寻找功率重量比更高的直流电机或微型减速电机能显著提升机器人的灵活性和续航时间。回顾整个项目最大的收获不是做出了一个多么完美的机器人而是完整经历了一次从概念、设计、制造到调试的工程闭环。每一个出现的问题都是对理论知识的一次拷问和深化。当你看到自己设计的机器人第一次根据你的指令成功在两种地形间切换形态并前进时那种成就感是无与伦比的。这个项目就像一个微缩的机器人实验室它所涉及的机械设计、电子电路、嵌入式编程和系统集成思想是通往更复杂机器人世界的坚实基石。