零成本打造四驱机器人:用旧3D打印机零件实现差速转向控制 1. 项目概述与设计初衷手头有一台彻底报废的老式3D打印机拆下来的零件堆了半个储物箱看着这些NEMA17步进电机、光轴和驱动板总觉得直接扔掉太可惜。作为一名常年混迹于工作台前的创客我的信条是“万物皆可复用”。于是一个念头冒了出来能不能用这些“电子垃圾”拼凑出一个能跑能跳的机器人底盘这就是Roverling项目的起点——一个几乎完全由旧3D打印机零件驱动的四轮驱动机器人平台。这个项目的核心目标很明确零成本或极低成本验证一个移动机器人平台的基础可行性。它不是为了参加机器人竞赛也不是为了完成某个商业产品纯粹是一次基于手头资源的、充满不确定性的工程探索。我手头有4个NEMA17步进电机、一堆8mm镀铬光轴、几个A4988驱动模块还有一块闲置的RP2040-Zero开发板。我的想法是用这些零件搭建一个底盘通过差速转向Differential Drive来实现移动和转向并用Micropython编写控制程序最终能用普通的RC遥控器来控制它。为什么选择差速转向因为在四轮独立驱动的结构下这是最直接、无需额外转向舵机的方案。通过控制左右两侧车轮的速度差机器人就能实现转向这在许多轮式机器人上都有成熟应用。当然这一切都停留在理论层面实际效果如何需要搭起来才知道。整个项目没有详细的CAD图纸和仿真更像是一种“随性而造”的创客风格走一步看一步遇到问题再解决问题。2. 核心零件盘点与选型思路项目的物质基础全部来自那台老旧的CTC Replicator 2克隆机。拆解后我得到了以下核心部件它们直接决定了机器人的基本形态和性能边界。2.1 机械结构件光轴与打印件机械骨架的核心是8根直径8mm的镀铬光轴Silver Steel Rods。它们的长度分别是2根420mm2根300mm4根100mm。这些光轴原本是3D打印机X、Y、Z轴的导轨精度和直线度都相当不错是搭建矩形框架的绝佳材料。为了连接这些光轴我设计了两种关键的3D打印件角连接件Corner Bracket用于连接三根互相垂直的光轴构成框架的八个角。每个角连接件上有三个8mm的孔呈直角分布内部还设计了一个4mm的通孔用于安装时排出支撑材料。电机座Motor Mount用于将NEMA17步进电机固定到光轴上。它一端与光轴连接另一端通过螺丝与电机固定。材料选择上我使用了普通的PLA材料。虽然强度不是最高的但对于验证阶段的底盘来说足够了。后来在打印平台面板时我换用了PETG因为它韧性更好能承受一定的形变而不易断裂更适合作为承载电子设备的平台。注意打印参数的取舍打印这些结构件时最大的挑战是内部支撑的清理。因为8mm的孔是深孔支撑材料很难去除。我的经验是增加底部实心层数我设置为5层确保孔洞底部有足够的强度防止钻头捅穿。善用“反向钻孔”技巧清理支撑时先用4mm钻头打通那个预留的4mm辅助孔然后用7.5mm钻头不接电完全手动旋转一点点把孔壁的支撑材料刮下来。手动操作能给你更好的手感避免钻偏或损坏打印件。有时候让钻头反转着慢慢旋进去效果反而更好。利用膨胀槽在设计角连接件时我在8mm孔的开口处设计了细小的膨胀槽。当光轴插入时开口可以微微扩张既保证了紧密配合又避免了应力集中导致的开裂。安装前务必确保孔内没有任何残留的塑料碎屑。2.2 动力与驱动系统电机与驱动器动力来自4个标准的NEMA17步进电机。步进电机的优势在于开环控制下的精确位置控制理论上只要不丢步就能知道轮子转了多少角度。这对于实现精确的差速控制是有帮助的。驱动模块则直接使用了从旧打印机主板上拆下来的4个A4988驱动模块。这里遇到了第一个“坑”这些模块是定制版的没有用于调节电机参考电压Vref的可调电阻Trim Pot。通常通过调节Vref可以设置电机线圈的电流从而控制扭矩和发热。经过一番电路图排查我发现模块上的MS3模式选择引脚并没有连接到A4988芯片的MS3脚而是连到了Vref引脚。这意味着如果MS3引脚悬空Vref电压会处于不确定状态导致电机电流极低根本没有扭矩。解决方案是主动生成Vref信号。我使用RP2040的一个PWM引脚输出100kHz的PWM波然后通过一个由电阻和电容构成的低通滤波器LPF将其平滑成一个稳定的直流电压作为A4988的Vref。经过测试电机相电流mA大约等于Vref电压值 * 315。通过调节PWM的占空比我就能精确控制每个电机的电流上限。在后续的代码中我将PWM占空比与目标电流值的关系总结为PWM占空比值 ≈ 65000 * 目标电流A。这个经验公式对于使用类似定制驱动板的朋友会很有用。2.3 控制与供电核心主控板选择了RP2040-Zero这是一款基于RP2040芯片的迷你开发板。选择它主要是因为其双核ARM Cortex-M0处理器性能足够有丰富的GPIO并且完美支持Micropython。用Python写机器人控制逻辑开发调试速度比C/C快得多非常适合快速原型开发。供电系统则贯彻了“就地取材”的原则。我有很多18V的电动工具电池容量从2Ah到6Ah不等。为什么不利用起来呢我设计并打印了一个电池支架可以将这些电池包固定在机器人平台中央。这带来了一个设计上的调整最初我考虑使用接近30V的电源以获得更高效率但既然决定用18V电池整个电源电路就需要按18V输入来设计。实测电池空载电压约20.5V负载下会逐渐下降当电压低于15V时就应该停止使用以保护电池。为了得到控制系统需要的3.3V和5V电压我使用了两个DFRobot的升降压电源模块DFR0568和DFR0569。它们可以在宽输入电压范围内输出稳定的600mA电流足够为RP2040、接收机和传感器供电。3. 机械装配全流程与实操要点装配过程是项目中最具“手感”的部分很多技巧无法在图纸上体现全靠现场摸索。3.1 框架搭建从散件到方框首先将打印好的4个角连接件和8个电机座准备好。务必进行预组装测试不涂胶水先把所有光轴和连接件拼起来。把框架放在一个绝对平整的桌面上用直角尺检查是否方正并测量两条对角线的长度是否相等这是检验矩形是否规矩的土办法。确认无误后再拆开准备正式粘合。粘合剂我选择了CA胶快干胶俗称“哥俩好”或“502”。为什么不用环氧树脂或结构胶因为光轴和PLA孔的配合是紧配合间隙非常小。CA胶的流动性好能通过毛细作用渗透到整个接触面形成均匀的粘接层而且固化速度快。这里有个重要教训我手头只有中粘度CA胶但实际上低粘度稀如水的CA胶更适合这种深孔粘接它能流得更深更均匀。如果使用中粘度胶动作一定要快。粘接顺序是关键先粘垂直短轴在角连接件的垂直孔内点胶迅速插入100mm的短轴用橡胶锤轻轻敲击到位。务必佩戴护目镜我曾有过在类似操作中被溅出的CA胶粘住睫毛的惨痛经历眼睛的防护绝对不能马虎。组合角单元将两根长轴420mm或300mm插入已经粘好短轴的两个角连接件形成一个“U”形。同样先点胶再插入用锤子辅助。插入第二根长轴后要立刻将整个组件压在工作台面上确保两个角连接件的顶面与台面平行且高度一致。CA胶在几十秒内就会初步固化如果这时组件是歪的之后就很难调整了。合拢框架将两个“U”形组件组合成完整的矩形框架。在最后一个角连接件的两个孔内点胶然后将对面组件伸出的两根长轴同时插入。这是最紧张的一步需要双手稳住组件对准后一次性插入并迅速在台面上找平。整个框架的平整度就看这最后一下。3.2 轮组与电机安装轮子是我专门设计的中心有一个D型孔与步进电机的D型轴匹配可以防止打滑。打印时轮辐部分我用20%的填充率以减轻重量但轮毂中心部分是实心的以确保与电机轴结合的强度。安装电机到轮子上是最费劲的环节。D型轴的配合非常紧徒手几乎不可能按进去。我的方法是先将轮子的D型槽与电机轴的D型面对齐然后用一个冲子Punch顶在电机轴的后端用小锤子轻轻敲击冲子把电机轴“顶”进轮毂里。直到电机轴的前端面与轮子的正面齐平才算安装到位。这个过程要耐心敲击力度要均匀防止轮毂开裂。接着将电机通过打印的电机座安装到框架上。这里原装的M3x25mm螺丝不够长因为要穿过电机座和电机本身的安装孔。我换成了M3x35mm的螺丝并配上了弹簧垫圈和平垫圈防止在震动中松动。安装时注意让电机的出线口朝上这样有利于布线也能避免线缆被底盘刮到。3.3 平台安装与总装平台由4块PETG打印的面板组成通过两两之间的卡槽和中心肋板上的螺丝孔相互连接。PETG材料有一定弹性我特意没有把它们完全粘死而是用螺丝和尼龙锁紧螺母固定。这样平台和下面的光轴框架之间能存在微小的相对位移我认为在颠簸时能吸收一点冲击避免应力全部集中在脆弱的打印连接件上。最后将四个带轮的电机总成安装到框架的四个角上。同样使用CA胶粘接。安装后用眼睛瞄一下或者用直尺靠一下检查四个轮子是否在一个平面上。如果发现有轮子歪了可以在电机座和框架之间的螺丝连接处垫上薄垫片Shim来进行微调让所有轮子接地均匀。4. 电路设计与电子系统集成电路部分没有设计专门的PCB而是在一块12x18cm的万用板Proto Board上进行“飞线”焊接。这种方式灵活性极高方便随时修改和增加功能。4.1 电源分配与安全设计安全是第一位的尤其是使用大容量锂电池时。我的电源路径是电池 - 10A保险丝 - 电源开关 - 主电源板。保险丝我选择了一个10A的慢熔保险丝。这个值是基于估算4个步进电机每个最大可能消耗1.5A两相理论上峰值电流可能达到6A留有一定余量。保险丝座和开关被我集成在一个3D打印的支架上然后固定在平台侧面方便操作。布线主电源线电池到开关、开关到板子我使用了较粗的硅胶线16AWG以减少压降和发热。一个至关重要的安全步骤在焊接任何电源线路时务必断开电池连接锂聚合物电池短路时会产生巨大的电流非常危险。所有焊点完成后我都用热缩管包裹并在容易受力的地方如接线端子根部点上了热熔胶进行加固。4.2 核心控制电路搭建电路原理图可以在项目GitHub仓库找到。核心逻辑如下Vref生成电路如前所述使用RP2040的一个PWM引脚GPIO输出100kHz方波经过一个由160k电阻和100nF电容构成的RC低通滤波器生成平滑的直流电压送到4个A4988的Vref引脚。RC信号输入我使用了一个6通道的PPM接收机。接收机输出的是5V的标准舵机PWM信号而RP2040的GPIO只能承受3.3V。因此每个通道信号都通过一个由4.7k和10k电阻组成的分压电路将电压降到约3.3V再输入到RP2040。电平转换与供电两个升降压模块分别提供稳定的5V给接收机、未来可能的传感器和3.3V给RP2040核心。所有电源网络18V 5V 3.3V GND在万用板背面用粗导线连接并在关键节点并联了多个100nF的陶瓷电容和若干电解电容如100uF 470uF进行滤波以抑制电机启停带来的电源噪声。我的焊接习惯是先电源后信号首先完成所有电源网络的布线焊接。通电前必检测焊接完电源部分后先不接电机和主控用可调限流电源调到低电压、低电流给板子供电用万用表测量每一个电源网络节点确认电压正确没有短路。使用插座对于RP2040-Zero、A4988模块、电源模块我都焊接了排母插座。这样方便单独测试和更换避免把板子焊成“一坨屎”。预留空间我在万用板上留出了大片空白区域为以后添加超声波传感器、IMU惯性测量单元或摄像头留足了位置。5. 软件控制从Micropython到遥控软件是让一堆硬件“活”起来的关键。我选择Micropython看中的就是其交互式开发和丰富的库支持能让想法快速变成现实。5.1 基础驱动与步进控制第一步是让电机转起来。我编写了StepperTest.py作为最基础的测试。在Micropython中使用machine.PWM和machine.Timer来生成控制步进电机速度和方向的脉冲信号。核心控制逻辑是速度梯形曲线。直接让电机从静止跳到高速容易丢步所以我写了一个SetVel(n, velocity, acceleration)函数。你指定电机编号n、目标速度velocity米/秒正负代表方向和加速度acceleration米/秒²。函数内部会根据当前速度和目标速度在每个控制周期由定时器中断触发计算出一个新的、平滑过渡的步进频率然后更新到对应的PWM发生器。这样就实现了电机的软启动和软停止。这里有一个重要的参数步进频率的极限。A4988驱动器和NEMA17电机都有一个最高响应频率。在空载测试中我疯狂地将一个电机的目标速度设到16.5米/秒理论计算步进频率高达8745Hz电机居然能跟上但噪音和振动巨大。然而这毫无意义因为机器人有重量和摩擦。真正的瓶颈在于扭矩。5.2 差速转向与RC遥控集成差速转向的原理很简单想让机器人直行就让左右两侧轮子速度相同想右转就让左侧轮子速度大于右侧想左转则相反。转弯半径由两侧速度差决定。我将这个逻辑与RC遥控器通道映射起来油门通道控制机器人的前进/后退速度即左右轮的基础速度。副翼通道控制转向。摇杆在中位时速度差为零向左打杆左轮减速右轮加速实现左转。起落架通道作为一个开关可以切换运动模式或急停。襟翼通道另一个开关用于使能或禁用所有电机驱动。我编写了RCInterface.py模块它非阻塞地读取6个RC通道的PWM信号将其转换为0-100%的百分比数值。主程序main.py在一个循环中读取这些百分比值根据预设的映射关系计算出左右两侧轮子的目标速度然后调用SetVel函数去平滑地控制四个电机。5.3 性能测试与参数调校理论很美好但实际跑起来问题不少。我进行了一系列负载测试记录下一些关键数据测试条件电机电流 (mA/相)最大稳定速度 (m/s)备注2轮驱动前轮满载7500.25在平地上可稳定运行启动时需要一点推力帮助。4轮驱动满载5000.25扭矩分配更均匀同样速度下所需电流更小。4轮驱动满载10000.60提高电流后最大速度提升明显但电机开始发热。4轮驱动空载10005.0速度很高但底盘剧烈振动毫无实用性。关键发现电流与扭矩提高A4988的Vref即增大电机电流能显著提升低速下的扭矩和最大速度但代价是发热。需要找到一个平衡点。我的经验是对于这个重量的底盘每个电机设置在700-800mA是比较稳妥的。丢步与失速在过载或突然转向时步进电机会丢步甚至停转失速。我的开环控制代码无法检测这一点。一旦失速电机就失去了位置信息机器人也就“迷路”了。这是开环步进控制系统的主要缺点。差速转向的尴尬在实际粗糙地面比如我家门前的砂石车道上差速转向的效率很低。因为轮子与地面的摩擦系数不稳定经常出现一侧轮子打滑空转导致转向不灵或原地转圈。这让我意识到对于户外非结构化地形阿克曼转向或全向轮可能是更好的选择尽管结构更复杂。6. 遇到的问题、反思与优化方向项目做完了能跑能遥控基本目标达到。但回过头看这个“废物利用”的机器人平台暴露了很多问题这也是最有价值的部分。6.1 机械设计上的不足重量是原罪整个底盘大量使用了实心钢制光轴和厚重的3D打印件导致自重很大。功率重量比很低电机大部分扭矩都用来克服自重了留给有效载荷和爬坡的余量很小。如果重来我会毫不犹豫地选择铝型材甚至碳纤维管作为主框架重量能减轻一半以上。轮胎的坑为了增加抓地力我尝试用柔性材料TPU打印轮胎。第一次用了“SemiFlex”预设25%填充一个轮胎打了17个小时结果还是太硬弹性不足。后来调整参数填充率改为0%利用轮胎自身的空心结构提供弹性增加底部和顶部实心层数5层和7层以保证强度最关键的是将最大体积流速提高到2.7 mm³/s打印时间缩短到8小时弹性有了改善。但在砂石路上抓地力依然不足。下次我会尝试更软的TPU材料或者直接使用硅胶浇铸轮胎。热害问题电机长时间运行后轴会发热。电机轴和PLA轮毂是紧配合PLA在60-70摄氏度就会软化。在一次长时间高速测试后我发现有一个轮子变松了。解决方案是设计一个金属的比如铝制轮毂套一端连接电机轴另一端连接塑料轮辐隔绝热传导。6.2 电气与控制的局限开环控制的弊端没有编码器反馈是硬伤。它限制了机器人的可靠性无法实现精确的路径跟踪也无法在复杂地形下防止失步。我手头有几个带编码器的老式Maxon直流电机未来可能会替换掉两个步进电机尝试搭建一个混合步进有刷直流的闭环控制系统。驱动板的性能瓶颈A4988是经典的廉价步进驱动但它不支持微步细分下的高电流散热也是个问题。在持续高扭矩需求下容易过热保护。升级到像TMC2209这样的静音驱动不仅扭矩更大、更安静还支持StallGuard等失速检测功能可以部分弥补开环的缺陷。电源管理粗糙目前没有电池电量监测只能凭感觉或测量电压来判断。应该增加一个电压检测电路当电池电压低于阈值如15V时让主控板自动进入低功耗模式或停止电机保护电池。6.3 软件与功能的扩展目前的代码只是一个最基础的遥控驱动框架。有很多可以扩展的方向上位机控制通过Wi-Fi或蓝牙模块让机器人连接电脑或手机用更直观的界面控制甚至传输摄像头画面。自主导航加装超声波、红外或激光雷达传感器结合简单的SLAM同步定位与地图构建算法实现避障和房间巡航。机械臂集成这个平台本身就是一个移动底盘可以在上面加装一个简易的机械臂变成一个移动抓取机器人。Roverling项目更像是一个起点而不是终点。它完美地验证了“用垃圾造宝贝”的创客精神也清晰地展示了从想法到实物的完整流程中会遇到哪些典型问题。最大的收获不是这个机器人本身而是在解决每一个大小麻烦的过程中积累的经验从清理支撑材料的技巧到CA胶使用的时机从计算电机电流的公式到调试差速转向的PID参数虽然最终没用上。这些经验远比任何现成的教程都来得深刻。如果你也有一堆闲置零件不妨动手试试你的第一个机器人很可能就藏在那堆“电子垃圾”里。