news 2026/6/12 17:07:42

用TFmini Plus雷达做个智能小车避障,Arduino和树莓派Pico都能搞定(附完整代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用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); } } }

常见问题排查:

  1. 无数据输出 → 检查TX/RX是否接反
  2. 乱码 → 确认波特率设置为115200
  3. 数值跳动大 → 确保模块前方无遮挡物

2.2 电机控制集成

将雷达数据转化为电机动作需要三个关键步骤:

  1. 距离阈值设定:根据小车速度设置安全距离(建议30-50cm)
  2. 避障策略设计:采用最简单的"检测-转向"逻辑
  3. 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, baudrate=115200, tx=Pin(0), rx=Pin(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 性能优化技巧

  1. 多线程处理:使用_thread模块分离传感器读取和电机控制
  2. 数据滤波:实现滑动平均滤波减少测量噪声
  3. 动态调速:根据障碍物距离调整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 = "FORWARD"

4.2 多传感器融合

结合红外或超声波传感器可提升系统鲁棒性。例如:

  1. 红外传感器检测玻璃等激光难以识别的障碍
  2. 陀螺仪辅助判断转向角度
  3. 编码器提供里程计信息

传感器数据融合示例表

传感器类型检测范围优点局限性权重
TFmini Plus0.1-12m精度高受强光影响0.6
红外10-80cm成本低易受干扰0.3
超声波2-400cm范围广精度差0.1

4.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的串口绘图器中观察距离变化曲线,直观调整避障参数。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 16:37:40

KeyboardChatterBlocker终极指南:免费软件解决机械键盘连击问题

KeyboardChatterBlocker终极指南&#xff1a;免费软件解决机械键盘连击问题 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocker 你是否曾经在…

作者头像 李华
网站建设 2026/6/9 16:36:20

语义一致性裁判系统:ADK+Agent SDK构建可审计多模型仲裁方案

1. 项目概述&#xff1a;这不是一个“模型评测工具”&#xff0c;而是一套可落地的语义一致性仲裁系统“Building a Semantic Model Referee With Google ADK and the OpenAI Agent SDK”——这个标题里藏着三个被日常讨论严重低估的关键词&#xff1a;Semantic&#xff08;语义…

作者头像 李华
网站建设 2026/6/9 16:30:10

春节倒计时归零后自动放烟花并跳转页面

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;倒计时结束瞬间触发全屏Canvas烟花动画&#xff0c;无需插件或网络请求。主页面‘新年快乐.html’实时显示距春节剩余天数、时、分、秒&#xff1b;归零后立即跳转至‘烟花.html’&#xff0c;后者用原生JavaSc…

作者头像 李华