用TFmini Plus雷达做个智能小车避障,Arduino和树莓派Pico都能搞定(附完整代码)
用TFmini Plus雷达打造智能小车避障系统Arduino与树莓派Pico双平台实战第一次看到TFmini Plus雷达时我正为一个大学机器人社团的智能小车项目发愁——传统的超声波传感器在复杂光线环境下表现极不稳定。这款仅有火柴盒大小的激光雷达模块以其12米的测距范围和毫米级精度瞬间吸引了我的注意。更令人惊喜的是它支持常见的UART串口通信这意味着我们可以轻松地将其接入Arduino或树莓派Pico这样的开源硬件平台。1. 硬件选型与系统架构设计1.1 核心组件解析TFmini Plus是Benewake公司推出的一款单点式激光雷达采用905nm红外激光进行飞行时间(ToF)测距。与超声波传感器相比它具有三大显著优势精度高±3cm的测量误差远优于超声波±1%的典型误差抗干扰强不受环境光线、温度、湿度变化影响响应快100Hz的刷新率适合动态避障场景典型硬件配置清单组件型号数量备注主控板Arduino Uno / 树莓派Pico1根据开发习惯选择雷达模块TFmini Plus1建议购买带杜邦线的套装电机驱动L298N1支持双直流电机小车底盘四轮/两轮1带减速电机和轮子电源18650电池组17.4V输出为佳1.2 系统连接示意图雷达与主控的连接极为简单只需三根线TFmini Plus Arduino/Pico TX → RX (Serial接收) RX → TX (Serial发送) GND → GND注意部分Arduino板需要电平转换器因为TFmini Plus是3.3V逻辑电平。树莓派Pico可直接连接。2. Arduino平台实现方案2.1 基础通信测试在正式组装小车前建议先用Arduino IDE的串口监视器验证雷达功能。上传以下测试代码#include SoftwareSerial.h SoftwareSerial radarSerial(10, 11); // RX,TX void setup() { Serial.begin(115200); radarSerial.begin(115200); } void loop() { if(radarSerial.available() 9) { if(radarSerial.read() 0x59 radarSerial.read() 0x59) { uint16_t distance radarSerial.read() | (radarSerial.read() 8); uint16_t strength radarSerial.read() | (radarSerial.read() 8); radarSerial.read(); // 跳过校验位 Serial.print(距离: ); Serial.print(distance); Serial.print(cm | 信号强度: ); Serial.println(strength); } } }常见问题排查无数据输出 → 检查TX/RX是否接反乱码 → 确认波特率设置为115200数值跳动大 → 确保模块前方无遮挡物2.2 电机控制集成将雷达数据转化为电机动作需要三个关键步骤距离阈值设定根据小车速度设置安全距离建议30-50cm避障策略设计采用最简单的检测-转向逻辑PWM调速控制使转向动作更平滑完整避障代码框架#include SoftwareSerial.h #define MOTOR_A1 5 #define MOTOR_A2 6 #define MOTOR_B1 9 #define MOTOR_B2 10 SoftwareSerial radarSerial(2, 3); // 避免与电机PWM引脚冲突 void setMotors(int left, int right) { analogWrite(MOTOR_A1, left 0 ? left : 0); analogWrite(MOTOR_A2, left 0 ? -left : 0); analogWrite(MOTOR_B1, right 0 ? right : 0); analogWrite(MOTOR_B2, right 0 ? -right : 0); } void avoidObstacle(uint16_t dist) { if(dist 30) { // 紧急停止 setMotors(-100, -100); delay(200); setMotors(150, -150); // 右转 delay(300); } else if(dist 50) { // 减速并准备转向 setMotors(80, 120); // 左轮加速实现左转 } else { // 全速前进 setMotors(200, 200); } }3. 树莓派Pico的MicroPython实现3.1 硬件配置差异树莓派Pico相比Arduino有几个优势双核处理器可并行处理传感器数据与电机控制内置的MicroPython解释器更适合快速原型开发更灵活的GPIO分配和更多的PWM通道接线时需注意使用GPIO0(UART0 TX)和GPIO1(UART0 RX)作为雷达串口电机驱动建议使用GPIO2-5作为PWM输出3.2 MicroPython代码解析from machine import UART, Pin, PWM import time uart UART(0, baudrate115200, txPin(0), rxPin(1)) motor_a PWM(Pin(2)) motor_b PWM(Pin(3)) def parse_distance(data): if len(data) 9 and data[0] 0x59 and data[1] 0x59: return (data[3] 8) | data[2] return None while True: if uart.any(): dist parse_distance(uart.read(9)) if dist and dist 30: motor_a.duty_u16(30000) # 右转 motor_b.duty_u16(60000) else: motor_a.duty_u16(50000) # 直行 motor_b.duty_u16(50000)3.3 性能优化技巧多线程处理使用_thread模块分离传感器读取和电机控制数据滤波实现滑动平均滤波减少测量噪声动态调速根据障碍物距离调整PWM占空比优化后的核心逻辑import _thread distance 0 def sensor_thread(): global distance while True: data uart.read(9) dist parse_distance(data) if dist: distance 0.7*distance 0.3*dist # 低通滤波 _thread.start_new_thread(sensor_thread, ()) while True: speed min(65000, distance * 1000) # 动态速度映射 motor_a.duty_u16(int(speed * 0.9)) motor_b.duty_u16(int(speed))4. 高级避障算法实践4.1 状态机设计简单的if-else逻辑在复杂环境中容易失效。采用有限状态机(FSM)可使小车行为更智能[前进] → (检测障碍) → [减速] → (距离阈值) → [转向] → (安全) → [前进] ↑_________________________________________|状态转换的MicroPython实现states [FORWARD, SLOWDOWN, TURN] current_state FORWARD def update_state(dist): global current_state if current_state FORWARD and dist 50: current_state SLOWDOWN elif current_state SLOWDOWN and dist 30: current_state TURN elif current_state TURN and dist 60: current_state FORWARD4.2 多传感器融合结合红外或超声波传感器可提升系统鲁棒性。例如红外传感器检测玻璃等激光难以识别的障碍陀螺仪辅助判断转向角度编码器提供里程计信息传感器数据融合示例表传感器类型检测范围优点局限性权重TFmini Plus0.1-12m精度高受强光影响0.6红外10-80cm成本低易受干扰0.3超声波2-400cm范围广精度差0.14.3 实际调试经验在实验室测试时发现几个关键点雷达安装高度建议离地15-20cm与常见障碍物(桌椅腿)平齐避免阳光直射雷达窗口可能造成测距失效电机产生的电磁噪声会影响雷达读数建议为雷达单独供电在电源线上加磁环软件上增加异常值过滤一个实用的调试技巧是实时可视化雷达数据。在Arduino端添加以下代码void serialPlotterOutput(uint16_t dist) { Serial.print(Distance:); Serial.print(dist); Serial.print(,); Serial.print(Threshold:); Serial.println(30); // 显示阈值线 }然后在Arduino IDE的串口绘图器中观察距离变化曲线直观调整避障参数。