从零开始自制一台 3D 打印履带式机械臂漫游车:零件选型、底盘结构、电路控制与完整代码实战
很多玩硬件的朋友都有过这样的想法:能不能自己动手做一台既能跑又能抓取的小车?市面上现成的履带式智能小车不少,机械臂也比较常见,但把 3D 打印、履带底盘、舵机机械臂和控制器整合在一起,做成一台可以远程操控的漫游车,确实需要从结构、电路到代码做一次完整的规划。
这篇文章就围绕“3D 打印带机械臂的履带式漫游车”这条主线来展开。我们会先梳理整台车的功能需求,再讲 3D 打印零件的设计与选型,然后进入底盘电机、驱动板、机械臂舵机、控制板的接线与配置,最后给出一套可运行的 Arduino 控制代码,并总结安装、调试以及后期扩展中的常见坑点。无论你是机器人爱好者、电子竞赛选手,还是想把 3D 打印和嵌入式结合起来练手,这篇文章都值得收藏。
1. 漫游车的核心概念与功能拆解
1.1 什么是履带式机械臂漫游车
履带式机械臂漫游车,本质是一台以履带为行走机构、搭载多自由度机械臂的移动机器人。它结合了三项关键技术:
- 履带底盘:履带相比普通轮子拥有更大的接地面积,越障能力和地形适应性更强,适合草地、砂石、室内地板等复杂地面。
- 机械臂:通常由多个舵机或电机驱动关节组成,可以实现抓取、搬运、探测等操作。
- 3D 打印结构件:车架、机械臂连杆、履带轮等零件通过 FDM 3D 打印机加工,成本低、修改方便,适合个人开发者快速迭代。
从控制角度看,这台漫游车可以理解为“移动平台 + 机械臂操作平台”的组合。移动平台负责到达目标位置,机械臂负责执行具体动作,两者既可以独立控制,也可以协同工作。
1.2 整机功能需求分析
在设计之前,先明确我们需要实现的功能:
| 功能模块 | 功能描述 | 核心硬件 |
|---|---|---|
| 移动控制 | 前进、后退、左转、右转、原地转向 | 直流减速电机、电机驱动板、履带 |
| 机械臂控制 | 关节转动、夹爪开合、抬升下降 | 舵机、机械臂结构件 |
| 遥控通信 | 通过手柄/手机/上位机发送控制指令 | 蓝牙模块、Wi-Fi模块、遥控器 |
| 供电管理 | 为控制板和电机、舵机提供稳定电源 | 锂电池、降压模块、电源开关 |
| 状态反馈 | 可选的车速、电量、舵机角度显示 | 显示屏、传感器、编码器 |
对于入门级作品,我们可以先实现“手动遥控 + 手动操作机械臂”,后期再逐步加入蓝牙、Wi-Fi、摄像头图传等功能。
1.3 为什么选择 3D 打印作为主要加工方式
很多成品机器人底盘采用铝合金或碳纤维材料,性能好但成本高,而且一旦设计不合理很难修改。3D 打印在个人项目中的优势非常明显:
- 成本低:PLA、PETG 材料价格不高,打坏一个零件重打即可。
- 定制性强:可以根据电机尺寸、舵机型号定制安装座。
- 迭代快:设计稿修改后几小时就能拿到新零件。
- 可复制:文件可以分享,其他人也能打印同样的结构。
当然,3D 打印也有局限性。FDM 打印件的强度和韧性不如注塑件,因此受力较大的结构件在设计时需要增加壁厚、加强筋,或者使用 PETG、ABS 等强度更高的材料。
2. 环境准备与关键器件选型
2.1 打印环境准备
打印漫游车零件前,你需要先准备好 3D 打印环境。常见配置如下:
- 打印机类型:FDM 桌面级打印机,如创想三维 Ender-3 系列、拓竹 X1/P1 系列等。
- 切片软件:Cura、PrusaSlicer、OrcaSlicer 均可。
- 打印材料:PLA 适合外观件和低受力件,PETG 适合结构件和底盘件。
- 层高:0.2mm 标准层高即可,精度要求高的配合面可以使用 0.16mm。
- 填充率:底盘和悬挂件建议 40%-60%,外观件 20%-30%。
- 支撑设置:悬垂超过 45 度的结构需要加支撑,或者调整模型朝向。
2.2 主控板选择:Arduino vs 树莓派
漫游车的“大脑”有很多选择,最主流的是 Arduino 系列和树莓派系列。
| 主控 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Arduino Uno | 便宜、教程多、实时性好 | 算力低、不能跑复杂算法 | 入门级遥控车、简单避障 |
| Arduino Mega | 引脚多,可接多路舵机 | 同样算力有限 | 多自由度机械臂 |
| ESP32 | 自带 Wi-Fi/蓝牙,性价比高 | 引脚电平 3.3V,需注意电平匹配 | 无线遥控、物联网控制 |
| 树莓派 | 可运行 Linux、Python、OpenCV | 成本高、功耗大、启动慢 | 视觉识别、自主导航 |
如果是第一次做这个项目,推荐使用 Arduino Uno 或 Mega。Uno 足够控制两路直流电机和 4-6 路舵机,代码简单,排查也容易。如果希望小车直接支持手机蓝牙遥控,也可以换用 ESP32。
2.3 电机与驱动方案
2.3.1 直流减速电机
履带底盘通常使用 TT 直流减速电机或 N20 微型减速电机。TT 电机便宜、扭矩一般,适合轻量小车;N20 电机体积小、扭矩大,适合紧凑结构。
漫游车的重量通常在 1-2kg 左右,加上电池和机械臂,建议选择 6V-12V 供电的直流减速电机,转速在 100-200rpm 之间比较合适。转速过高会导致小车起步太冲,转速过低则速度太慢。
2.3.2 电机驱动板
Arduino 的 GPIO 引脚无法直接驱动电机,需要电机驱动板。常用方案有:
- L298N:经典双路 H 桥驱动,支持大电流,但压降较大,发热明显。
- TB6612FNG:体积小、效率高,是 L298N 的常见替代方案。
- DRV8833:适合微型电机,双路驱动,低压性能好。
以 TB6612 为例,它支持两路直流电机,每路最大电流 1.2A,峰值 3.2A,对 TT 电机来说足够用了。
2.4 机械臂舵机选择
机械臂关节需要用到舵机。常见舵机有 SG90(9g 舵机)、MG90S(金属齿轮 9g 舵机)、MG996R(大扭矩金属舵机)。
| 舵机型号 | 扭矩 | 供电电压 | 适用关节 |
|---|---|---|---|
| SG90 | 1.8kg·cm | 4.8V-6V | 小型夹爪、轻型关节 |
| MG90S | 2.2kg·cm | 4.8V-6V | 小型机械臂关节 |
| MG996R | 9.4kg·cm | 4.8V-6.6V | 底部大臂、腰部旋转 |
需要注意:多个舵机同时工作时,瞬时电流很大。尤其是 MG996R 这类大扭矩舵机,如果直接从 Arduino 的 5V 引脚取电,很容易导致 Arduino 复位或者舵机抖动。正确做法是给舵机单独供电,控制板只输出 PWM 信号线。
2.5 供电方案
漫游车供电需要同时考虑电机、舵机、控制板三个部分。比较稳妥的做法是:
- 主电池:7.4V 2S 锂电池或 3S 锂电池。
- 电机电源:直接接电池,通过驱动板给电机供电。
- 控制板电源:使用降压模块将电池电压降到 5V,给 Arduino 供电。
- 舵机电源:如果是小型舵机,可以共用 5V 降压模块;如果是大扭矩舵机,建议用独立的 UBEC(航模降压模块)。
需要特别提醒的是,电机启动时电流会瞬间拉低电池电压,如果控制板和电机共用同一个降压模块,可能出现控制板复位。所以条件允许时,尽量将动力电源和逻辑电源分开。
3. 底盘与机械臂结构设计
3.1 履带底盘的 3D 打印结构
履带底盘通常由以下部分组成:
- 底盘主体框架。
- 主动轮和从动轮。
- 履带。
- 电机安装座。
- 悬挂/支撑结构。
3.1.1 底盘框架
底盘框架需要承载电池、控制板、驱动板和机械臂底座。设计时要注意:
- 预留走线孔,避免线材暴露在外被履带卷入。
- 底板厚度建议在 3mm 以上。
- 安装孔位统一标准,方便固定控制板和驱动板。
如果不想从零建模,可以在 Thingiverse、Printables 等网站搜索“tracked robot chassis STL”关键词,找到合适的底盘模型后,再根据自己手头的电机进行微调。很多开源模型都支持直接安装 TT 电机和履带,省去大量重新设计的精力。
3.1.2 主动轮与从动轮
主动轮安装在电机输出轴上,负责带动履带转动。从动轮安装在底盘前后端,起张紧和导向作用。打印时需要注意主动轮内孔直径和电机轴直径的配合关系,通常预留 0.2mm-0.3mm 的间隙,方便安装但不会太松。
从动轮可以设计成带轴承的结构,使用 608 或 624 轴承可以大幅降低摩擦阻力。如果只是轻量小车,也可以直接用螺栓加垫片充当轴。
3.1.3 履带选择
履带是漫游车最容易磨损的部件。市面上常见的方案有两种:
- 橡胶履带:摩擦力大,越障能力强,但需要配套的履带轮。
- 3D 打印塑料履带:可以自己打印链节和履带板,但打印时间长、装配麻烦,强度也不如橡胶。
对新手来说,推荐买现成的橡胶履带 + 配套轮子套装,比如常见的 FT-Mini 坦克底盘配件,配合自己打印的底盘框架,既能控制成本又能保证可靠性。
3.2 机械臂结构与自由度
机械臂的“自由度”决定了它能做多复杂的动作。一个常见的入门级机械臂有 4-5 个自由度:
- 腰部旋转关节(左右旋转)。
- 大臂抬升关节。
- 小臂抬升关节。
- 腕部旋转/俯仰关节。
- 夹爪开合。
自由度越多,控制越灵活,但舵机数量和重量也随之增加。对于入门作品,推荐先做 4 自由度机械臂:
- 腰部旋转:1 个舵机。
- 大臂抬升:1 个舵机。
- 小臂抬升:1 个舵机。
- 夹爪开合:1 个舵机。
3.2.1 机械臂打印材料选择
机械臂连杆属于受力结构件,打印时要注意:
- 优先使用 PETG 而不是 PLA,避免长期受力后变形开裂。
- 填充率不宜低于 50%。
- 关节连接处可以预留轴承位或铜螺柱位,减少舵机受力。
3.2.2 舵机安装方向
在打印机械臂零件时,需要先确认舵机的安装方向。舵机输出轴一端朝向活动关节方向,舵机机身则固定在前一个连杆上。打印前最好先用游标卡尺测量舵机实际尺寸(特别是耳朵厚度和螺丝孔距),避免模型尺寸不匹配。
4. 电路搭建与接线
4.1 硬件清单汇总
下面是一份比较完整的入门硬件清单,供参考:
| 类别 | 器件 | 数量 |
|---|---|---|
| 主控 | Arduino Uno 或 Mega | 1 |
| 电机 | TT 直流减速电机 | 2 |
| 驱动板 | TB6612FNG 或 L298N | 1 |
| 舵机 | SG90 / MG90S | 2-4 |
| 机械臂 | 舵机支架/打印件 | 1 套 |
| 履带底盘 | 履带 + 主动轮 + 从动轮 | 1 套 |
| 电池 | 7.4V 锂电池 | 1 |
| 降压模块 | LM2596 / MP1584 / UBEC | 1-2 |
| 遥控 | 蓝牙模块 HC-05/HC-06 或 PS2 手柄接收器 | 1 |
| 其他 | 杜邦线、铜柱、螺丝螺母、开关 | 若干 |
4.2 电机驱动板接线
以 TB6612FNG 为例,接线如下:
| TB6612 引脚 | 接 Arduino | 说明 |
|---|---|---|
| PWMA | D5 | 左电机 PWM 调速 |
| AIN1 | D6 | 左电机方向控制 |
| AIN2 | D7 | 左电机方向控制 |
| PWMB | D9 | 右电机 PWM 调速 |
| BIN1 | D8 | 右电机方向控制 |
| BIN2 | D10 | 右电机方向控制 |
| VM | 电池正极(7.4V) | 电机供电电压 |
| VCC | 5V | 逻辑电源 |
| GND | GND | 共地 |
接线时需要注意:TB6612 的 GND 必须和 Arduino 的 GND 连接,否则驱动板无法识别控制信号。
4.3 舵机接线
舵机有三根线,分别是:
- 棕色/黑色:GND。
- 红色:VCC(电源正极)。
- 黄色/橙色:信号线。
对于 Arduino Uno:
- 腰部舵机信号线接 D3。
- 大臂舵机信号线接 D4。
- 小臂舵机信号线接 A0(也可以通过软件用 D11 等引脚)。
- 夹爪舵机信号线接 A1。
注意:舵机的 5V 电源不要从 Arduino 的 5V 引脚直接取电。建议单独从降压模块引出 5V 供电,并且让 Arduino 和舵机共地。
4.4 电源分配示意
下面用 ASCII 简图描述整个电源分配思路:
7.4V 锂电池 | +----> TB6612 VM 引脚(电机电源) | +----> LM2596 降压模块 --> 5V --> Arduino 5V 引脚 | +----> UBEC 降压模块 --> 5V --> 舵机电源线实际接线时,用 T 型分线或接线端子将电池正负极分出多路,每路过流保险丝或开关,保证安全。
5. 完整控制代码实现
5.1 项目代码结构
我们先按照模块化思路组织代码:
rover_control/ ├── rover_control.ino ├── motor_driver.h ├── motor_driver.cpp ├── arm_controller.h ├── arm_controller.cpp └── README.md5.2 电机控制头文件
// 文件路径:rover_control/motor_driver.h #ifndef MOTOR_DRIVER_H #define MOTOR_DRIVER_H #include <Arduino.h> class MotorDriver { public: MotorDriver(int pwmA, int ain1, int ain2, int pwmB, int bin1, int bin2); void init(); void setLeftSpeed(int speed); // speed: -255 ~ 255 void setRightSpeed(int speed); // speed: -255 ~ 255 void moveForward(int speed); void moveBackward(int speed); void turnLeft(int speed); void turnRight(int speed); void stop(); private: int _pwmA, _ain1, _ain2; int _pwmB, _bin1, _bin2; }; #endif5.3 电机控制实现
// 文件路径:rover_control/motor_driver.cpp #include "motor_driver.h" MotorDriver::MotorDriver(int pwmA, int ain1, int ain2, int pwmB, int bin1, int bin2) { _pwmA = pwmA; _ain1 = ain1; _ain2 = ain2; _pwmB = pwmB; _bin1 = bin1; _bin2 = bin2; } void MotorDriver::init() { pinMode(_pwmA, OUTPUT); pinMode(_ain1, OUTPUT); pinMode(_ain2, OUTPUT); pinMode(_pwmB, OUTPUT); pinMode(_bin1, OUTPUT); pinMode(_bin2, OUTPUT); } void MotorDriver::setLeftSpeed(int speed) { speed = constrain(speed, -255, 255); if (speed >= 0) { digitalWrite(_ain1, HIGH); digitalWrite(_ain2, LOW); } else { digitalWrite(_ain1, LOW); digitalWrite(_ain2, HIGH); speed = -speed; } analogWrite(_pwmA, speed); } void MotorDriver::setRightSpeed(int speed) { speed = constrain(speed, -255, 255); if (speed >= 0) { digitalWrite(_bin1, HIGH); digitalWrite(_bin2, LOW); } else { digitalWrite(_bin1, LOW); digitalWrite(_bin2, HIGH); speed = -speed; } analogWrite(_pwmB, speed); } void MotorDriver::moveForward(int speed) { setLeftSpeed(speed); setRightSpeed(speed); } void MotorDriver::moveBackward(int speed) { setLeftSpeed(-speed); setRightSpeed(-speed); } void MotorDriver::turnLeft(int speed) { setLeftSpeed(-speed); setRightSpeed(speed); } void MotorDriver::turnRight(int speed) { setLeftSpeed(speed); setRightSpeed(-speed); } void MotorDriver::stop() { setLeftSpeed(0); setRightSpeed(0); }这里需要注意一个问题:由于履带小车左右电机安装方向相反,可能需要调整 setLeftSpeed 或 setRightSpeed 的极性。具体测试方法见后文。
5.4 机械臂控制实现
机械臂部分使用 Arduino 内置的 Servo 库,非常方便。下面是一个完整的机械臂控制示例:
// 文件路径:rover_control/rover_control.ino #include <Servo.h> #include "motor_driver.h" // 机械臂引脚定义 #define SERVO_WAIST 3 #define SERVO_ARM1 4 #define SERVO_ARM2 A0 #define SERVO_GRIP A1 // 电机驱动引脚定义 #define PWM_A 5 #define AIN1 6 #define AIN2 7 #define PWM_B 9 #define BIN1 8 #define BIN2 10 Servo servoWaist; Servo servoArm1; Servo servoArm2; Servo servoGrip; MotorDriver motor(PWM_A, AIN1, AIN2, PWM_B, BIN1, BIN2); int waistAngle = 90; int arm1Angle = 90; int arm2Angle = 90; int gripAngle = 30; void setup() { Serial.begin(9600); motor.init(); servoWaist.attach(SERVO_WAIST); servoArm1.attach(SERVO_ARM1); servoArm2.attach(SERVO_ARM2); servoGrip.attach(SERVO_GRIP); servoWaist.write(waistAngle); servoArm1.write(arm1Angle); servoArm2.write(arm2Angle); servoGrip.write(gripAngle); } void loop() { if (Serial.available() > 0) { char cmd = Serial.read(); handleCommand(cmd); } } void handleCommand(char cmd) { switch (cmd) { case 'W': case 'w': motor.moveForward(180); break; case 'S': case 's': motor.moveBackward(180); break; case 'A': case 'a': motor.turnLeft(150); break; case 'D': case 'd': motor.turnRight(150); break; case 'X': case 'x': motor.stop(); break; case 'Q': case 'q': // 腰部左转 waistAngle = constrain(waistAngle + 5, 0, 180); servoWaist.write(waistAngle); break; case 'E': case 'e': // 腰部右转 waistAngle = constrain(waistAngle - 5, 0, 180); servoWaist.write(waistAngle); break; case 'R': case 'r': // 大臂抬起 arm1Angle = constrain(arm1Angle + 5, 0, 180); servoArm1.write(arm1Angle); break; case 'F': case 'f': // 大臂放下 arm1Angle = constrain(arm1Angle - 5, 0, 180); servoArm1.write(arm1Angle); break; case 'T': case 't': // 小臂抬起 arm2Angle = constrain(arm2Angle + 5, 0, 180); servoArm2.write(arm2Angle); break; case 'G': case 'g': // 小臂放下 arm2Angle = constrain(arm2Angle - 5, 0, 180); servoArm2.write(arm2Angle); break; case 'C': case 'c': // 夹爪闭合 gripAngle = constrain(gripAngle + 3, 10, 80); servoGrip.write(gripAngle); break; case 'O': case 'o': // 夹爪张开 gripAngle = constrain(gripAngle - 3, 10, 80); servoGrip.write(gripAngle); break; } }5.5 代码逻辑说明
上面的循环中,每次从串口读取一个字符命令,然后执行对应动作。这种“单字符指令”的方式最简单,适合调试阶段。实际项目中使用蓝牙时,仍然是同样的串口数据流,只需要把蓝牙模块的 TX 接到 Arduino 的 RX、RX 接到 Arduino 的 TX 即可。
舵机角度每次只变化 3-5 度,目的是让机械臂动作平滑,避免突然跳变导致舵机过载。constrain 函数则保证角度始终在安全范围内,防止舵机堵转损坏。
6. 组装与调试过程
6.1 打印零件检查
打印完成后,先不要急着组装。花几分钟检查一下:
- 孔位是否通透:用小螺丝刀疏通打印件上的孔洞。
- 配合面是否有毛刺:用锉刀或美工刀修整。
- 履带轮是否转动顺畅:装上轴承后手动转动测试。
- 关键受力件是否有层间开裂:如果发现分层,需要检查打印温度或重新打印。
6.2 底盘组装顺序
推荐按照下面的顺序组装:
- 安装电机到电机座上,注意电机线朝向车体内部。
- 固定主动轮到电机轴,用顶丝拧紧。
- 安装从动轮和履带。
- 将底盘左右两侧通过横梁/底板连接。
- 安装电池盒或锂电池固定座。
- 安装控制板和驱动板。
6.3 机械臂组装顺序
机械臂从底座向上安装:
- 固定腰部舵机到底座。
- 安装大臂连杆,连接大臂舵机。
- 安装小臂连杆,连接小臂舵机。
- 安装夹爪舵机和夹爪指。
- 将整个机械臂固定在底盘前部或中央。
注意:机械臂组装时,所有舵机先连接到 Arduino,通过代码将角度设定到 90 度,然后再安装舵机臂。这样可以保证舵机在中位附近,避免安装完成后因角度偏差导致连杆卡死。
6.4 串口调试方法
完成组装后,打开 Arduino IDE 串口监视器,波特率选择 9600。
然后依次发送以下指令测试:
- 发送
w,观察小车是否前进。 - 发送
s,观察小车是否后退。 - 发送
a/d,观察是否左转/右转。 - 发送
r/f,观察大臂是否上下运动。 - 发送
c/o,观察夹爪是否闭合/张开。
如果小车前进时实际方向相反,只需要在代码中交换 AIN1/AIN2 或者 BIN1/BIN2 的顺序即可。
6.5 蓝牙遥控接入
硬件接线:
- HC-05 的 TX -> Arduino RX(D0)。
- HC-05 的 RX -> Arduino TX(D1)。
- HC-05 的 VCC -> 5V。
- HC-05 的 GND -> GND。
然后手机安装任意一款“蓝牙串口助手”,配对 HC-05 后,发送单字符命令,即可遥控小车。
这里需要注意:HC-05 默认波特率通常是 38400 或 9600。如果发现发送指令没反应,先确认蓝牙模块的波特率和 Arduino 代码中的 Serial.begin 波特率一致。
6.6 常见调试现象与处理
| 现象 | 可能原因 | 解决思路 |
|---|---|---|
| 小车通电后没反应 | 电源开关没开,电池电压过低 | 检查电源和电压 |
| 电机嗡嗡响但不转 | PWM 占空比过低或电机堵转 | 调大 PWM 值,检查履带是否卡住 |
| 小车只前进不后退 | 驱动板方向引脚接线错误 | 交换对应方向引脚 |
| 舵机抖动 | 供电不足 | 使用独立 UBEC 供电 |
| 舵机不动但有电流声 | 舵机堵转或角度超限 | 检查机械臂是否卡死,减小角度范围 |
| 蓝牙搜索不到设备 | 蓝牙模块未进入 AT 模式 | 按住按键上电,重新配对 |
| 小车转向时原地打滑 | 左右电机转速不一致 | 分别校准左右 PWM 值 |
7. 常见问题与排查思路
7.1 3D 打印件公差问题
3D 打印的尺寸存在公差,尤其是孔洞直径。打印机挤出量偏大时,原本设计 3.2mm 的孔可能实际只有 2.8mm,导致螺丝无法穿过。建议:
- 设计孔时预留 0.2mm-0.4mm 余量。
- 打印后用钻头或锉刀扩孔。
- 或者通过切片软件中的“孔洞补偿”功能调整。
7.2 履带脱落问题
履带脱落通常有两个原因:
- 履带太松,主动轮和从动轮之间的距离不足。
- 履带张紧轮位置设计不合理。
解决思路:调整从动轮安装位置,增加张紧结构。也可以购买稍短一节的履带,或者在底盘前后加装张紧轮。
7.3 机械臂重心前倾问题
机械臂安装在底盘前方时,抬臂后整车重心会向前偏移,容易导致小车前倾甚至翻车。解决思路:
- 将电池等重物后置,平衡重心。
- 在底盘前部增加支撑轮。
- 控制机械臂动作幅度,避免大臂伸得太远。
7.4 舵机供电不足问题
多个舵机同时工作时,瞬时电流可能达到 2A-3A,普通的 5V 线性稳压模块会过热保护。建议:
- 使用 3A 以上的开关降压模块。
- 给每个舵机增加并联电容(1000uF 电解电容),吸收瞬时电流尖峰。
- 尽量避免多个大扭矩舵机同时运动。
8. 代码优化与扩展方向
8.1 增加手柄遥控支持
单字符串口命令虽然简单,但操作体验一般。如果想让漫游车更好操控,可以接入 PS2 无线手柄,通过 PS2X 库读取摇杆数据,将摇杆值映射到电机速度,实现无级变速控制。
// 伪代码示例 void updateFromPS2() { int leftY = p2x.Analog(PSS_LY); // 左摇杆 Y 轴 int rightY = p2x.Analog(PSS_RY); // 右摇杆 Y 轴 int leftSpeed = map(leftY, 0, 255, -255, 255); int rightSpeed = map(rightY, 0, 255, -255, 255); motor.setLeftSpeed(leftSpeed); motor.setRightSpeed(rightSpeed); }这种“双摇杆坦克转向”控制方式更接近真实履带车辆,操控感明显提升。
8.2 增加摄像头图传
如果想做远程探测车,可以在底盘上加装 WiFi 摄像头模块(如 ESP32-CAM),通过手机查看实时画面。此时主控可以换成 ESP32,用一个板子同时完成摄像头采集、电机控制、舵机控制。
8.3 增加 PWM 舵机平滑控制
直接用 Servo.write 让舵机跳变到目标角度,动作会比较生硬。可以引入“逐步逼近”算法,让舵机角度每 20ms 增加或减少 1 度,实现平滑过渡:
void smoothMove(Servo servo, int ¤tAngle, int targetAngle, int step = 1) { if (currentAngle < targetAngle) { currentAngle = min(currentAngle + step, targetAngle); } else if (currentAngle > targetAngle) { currentAngle = max(currentAngle - step, targetAngle); } servo.write(currentAngle); }8.4 增加编码器与闭环控制
开环控制下,左右电机转速不一致会导致小车跑偏。如果希望小车走直线,可以在电机上加装霍尔编码器,利用 PID 算法调整左右电机 PWM,实现闭环速度控制。这是后续进阶学习中非常有价值的方向。
9. 最佳实践与工程建议
9.1 结构设计阶段建议
- 先画 CAD 草图再建模,尤其是电机安装座和舵机安装座,要手头有实物尺寸后再开始设计。
- 所有螺丝孔位尽量统一,例如底盘全部使用 M3 螺丝,减少螺丝种类。
- 受力件使用 PETG 打印,填充率不低于 50%。
- 零件编号命名,方便打印后区分。
9.2 电路接线建议
- 电源线使用红色和黑色区分正负极,避免接反。
- 信号线使用杜邦线时,最好用不同颜色区分,例如舵机信号线统一用黄色。
- 所有地线必须共地,这是电路稳定工作的前提。
- 在电池正极串联一个船型开关和 2A 保险丝,防止短路烧毁设备。
- 接线完成后,用万用表检查一次正负极是否短路,再通电。
9.3 代码开发建议
- 将电机控制、机械臂控制拆分成独立文件,方便维护。
- 使用 const 定义引脚编号,避免代码中出现魔法数字。
- 每次修改代码前备份一个版本,便于回退。
- 串口调试时把舵机角度和电机状态打印出来,便于定位问题。
- 所有舵机角度范围做 limit 保护,防止舵机堵转。
9.4 安全注意事项
- 通电调试时,手不要靠近电机齿轮和履带夹缝。
- 电池充电时不要离人,锂电池充电必须使用平衡充电器。
- 调试机械臂时,可以先拿掉夹爪,避免夹到手指。
- 不要用舵机强行掰动机械臂,否则会损坏舵机齿轮。
10. 总结与后续学习建议
完成一台 3D 打印履带式机械臂漫游车,表面上看是做了一台“能跑能抓”的玩具,实际上你已经在实践中接触到了机械设计、3D 打印工艺、直流电机驱动、PWM 调速、舵机控制、串口通信、蓝牙通信等多项嵌入式开发核心技能。
建议下一步按以下顺序继续深入:
- 先把手上的漫游车稳定跑起来,把底盘走直线、转向手感调好。
- 加入 PS2 手柄或蓝牙遥控,优化操作体验。
- 再扩展摄像头图传,实现远程探测。
- 最后尝试加入编码器和 PID 闭环,让移动控制更精准。
- 如果有兴趣,可以引入 ROS 或 MicroPython 平台,把漫游车升级成支持自主导航的移动机器人。
如果本文对你有帮助,欢迎收藏,也欢迎在评论区分享你的组装和调试经验。自己动手做一台漫游车,踩坑和解决问题的过程,就是最好的学习路径。