Arduino 全向麦克纳姆轮机器人:PS2 手柄遥控 + 自主避障
项目亮点
基于 **Arduino Mega 2560** 构建**四轮全向麦克纳姆轮底盘**,实现**全向移动 (前进/后退/平移/旋转/斜向)** 与**原地旋转**。双控模式:**PS2 手柄 (2.4G 无线) 手动遥控** + **超声波/红外多传感器融合自主避障**。采用 **TB6612FNG 双 H 桥驱动 4 路 TT 减速电机 (带编码器)**,PID 闭环控速,里程计融合 IMU (MPU6050) 实现基础定位。适合 ROS 入门、SLAM 算法验证、服务机器人原型开发。
硬件清单 (BOM)
| 类别 | 器件 | 数量 | 关键规格 |
|---|---|---|---|
| 主控 | Arduino Mega 2560 | 1 | 54 Digital, 16 Analog, 4 Hardware Serial |
| MPU6050 IMU | 1 | I²C 0x68, DMP 可选, 姿态解算 | |
| 驱动与电机 | TB6612FNG 双 H 桥模块 | 2 | 每模块驱动 2 电机, PWM 1kHz+, 1.2A 持续 |
| TT 齿轮减速电机 (带 AB 相编码器) | 4 | 1:48 减速比, 48 CPR, 6V/12V 可选 | |
| 麦克纳姆轮 (直径 65mm/100mm) | 4 | 左旋/右旋各 2, 正确安装是全向前提 | |
| 传感器 | HC-SR04 超声波测距 | 4 | 前/左/右/后, 2cm–4m, 触发周期 ≥60ms |
| 红外避障模块 (TCRT5000) | 4 | 近距离 (<20cm) 补盲, 数字量输出 | |
| 电池电压检测 (分压电阻) | 1 | 监测 2S/3S LiPo, 低压保护 | |
| 通信 | PS2 手柄接收器 (2.4G) | 1 | SPI 模式, 接 Mega SPI 引脚 (50-53) |
| 电源 | 3S LiPo (11.1V/2200mAh) + 5V/3A UBEC | 1 | 电机直供 11.1V, UBEC 给 Mega/逻辑/传感器 |
| 结构 | 铝合金/亚克力底盘、3D 打印电机座、走线槽 | 1 套 | 轮距 200mm, 轴距 180mm 可调 |
麦克纳姆轮运动学核心
四轮速度矢量合成:
// vx: 前进+, vy: 左平移+, ω: 逆时针旋转+
// L = 半轴距, W = 半轮距, R = 轮半径
float v_fl = (vx - vy - (L+W)*omega) / R; // 前左
float v_fr = (vx + vy + (L+W)*omega) / R; // 前右
float v_rl = (vx + vy - (L+W)*omega) / R; // 后左
float v_rr = (vx - vy + (L+W)*omega) / R; // 后右
映射为电机 PWM:PWM = constrain(v * Kp + integral * Ki + derivative * Kd, -255, 255),编码器读取中断计数计算实时速度闭环。
PS2 手柄映射 (双摇杆 + 方向键)
| 手柄输入 | 运动模式 | 参数映射 |
|---|---|---|
| 左摇杆 Y | 前进/后退 | vx = map(LY, 0,255, -MAX, MAX) |
| 左摇杆 X | 左/右平移 | vy = map(LX, 0,255, -MAX, MAX) |
| 右摇杆 X | 原地旋转 | ω = map(RX, 0,255, -MAX_A, MAX_A) |
| 方向键 ↑↓←→ | 离散 8 向移动 | 预设速度矢量, 适合精准对位 |
| L2/R2 | 速度档位切换 | 低/中/高三档 MAX 缩放 |
| Start | 模式切换 | 手动 ↔ 自主避障 |
| Select | 急停/复位 | 全电机停转, 里程计清零 |
自主避障策略 (行为栈/子串和法)
- 数据融合:4 路超声波中位数滤波 + 红外近场触发,生成极坐标障碍物地图 (角度分辨率 45°)
- 势场法简化:目标方向引力 + 障碍物斥力矢量叠加,输出期望
vx, vy, ω - 行为优先级:
紧急停车 (红外触发) > 避障转向 > 目标导航 > 原地待机 - 陷阱处理:连续 3s 无有效路径 → 后退 + 原地大角度旋转探索
软件架构 (模块化 .ino 分文件)
Config.h:引脚定义、PID 参数、几何参数、阈值Motor.cpp/h:TB6612 驱动封装、编码器中断 (PinChangeInterrupt)、PID 速度环Kinematics.cpp/h:运动学正/逆解、速度限幅、死区补偿PS2_Controller.cpp/h:PS2X 库封装、手柄状态机、按键消抖Sensors.cpp/h:超声波定时触发 (避免串扰)、红外读取、MPU6050 DMP 姿态Navigator.cpp/h:避障势场、里程计积分 (x,y,θ)、路径规划接口Main.ino:setup()初始化所有模块,loop()10ms 周期调度
调试与标定流程
- 编码器极性:单轮前进,串口打印计数符号,修正 A/B 相接线
- 麦克纳姆轮安装验证:发送纯
vx→ 四轮同向;纯vy→ 对角轮同向、另两轮反向;纯ω→ 同侧轮同向、异侧反向 - PID 调参:目标速度阶跃响应,示波器/串口绘图观察超调/稳态误差,Ziegler-Nichols 粗调后手动微调
- IMU 校准:静止采样 2000 次求零偏,六面体标定加速度计/陀螺仪比例因子
- 超声波串扰消除:错峰触发 (间隔 25ms)、中位数滤波 (5 次取中)
ROS 衔接准备 (为后续迁移铺路)
- 串口协议标准化:
ros_serial兼容帧格式0xFF 0xFE len cmd data... chk - 发布话题:
/odom (nav_msgs/Odometry)、/imu/data (sensor_msgs/Imu)、/scan (sensor_msgs/LaserScan 模拟)、/battery (sensor_msgs/BatteryState) - 订阅话题:
/cmd_vel (geometry_msgs/Twist)、/mode (std_msgs/UInt8) - Mega 2560 内存受限,建议后续迁移 **ESP32/STM32 + micro-ROS** 或 **树莓派 4B + Mega 从机** 架构
安全与规范
- 3S LiPo 必配平衡充电器、防火袋、低压报警 (3.5V/节)
- 麦克纳姆轮滚子易缠毛发/细线,定期清理
- 超声波盲区 (0–2cm) 由红外补盲,防撞条物理缓冲
- 代码看门狗 (WDT) 复位,防止跑飞
项目资源
完整模块化代码、原理图 (KiCad)、STL 文件、PS2 手柄库、标定脚本、ROS 串口协议文档已开源,欢迎贡献 PID 自调参、SLAM 接口等改进。
制造工艺
- 高级气象站 v2.0:BME280 实时监测温度/气压/湿度/海拔 (Windows 10 IoT Core)
- Arduino 自制 DCC 命令站:蓝牙控制模型铁路,免费 App 支持 CV 读写
- Arduino驱动的六发鸡尾酒自动调配站 – 打造你的专属智能调酒机
- DIY 蓝牙控制 Arduino 间谍小车
- 自制 10 美元便携 Arduino 气象站 - Nano + DHT22 + BMP180 + LCD
- eDOT:基于 Arduino 的精密时钟与气象站,内置红外遥控
- Arduino + ThingSpeak 实时气象监测站
- 实时物联网压力监测:MKR GSM 1400 + Arduino Cloud + Google Sheets
- Arduino 全向麦克纳姆轮机器人:PS2 手柄遥控 + 自主避障
- 打造可靠的 Arduino 气象站:DHT 传感器 + LCD + RTC
- 用 Arduino 控制 Chrome 恐龙游戏:真实硬件交互项目
- 基于 Sigfox 与 Twilio 的远程短信按钮:Arduino MKR Fox 1200 实现