TFmini Plus在Arduino上的开发例程(二)

2023-05-16

本例程以Arduino Uno板为例,通过Arduino实现TFmini Plus相关指令的写入,上行数据的读取、判断和测量数据的获取打印,主要帮助客户快速熟悉我公司雷达,减少产品的研发周期。
关于Arduino的详细介绍请参考以下网站:
英文官网:-www.arduino.cc

步骤一:硬件连接

如图1所示,为TFmini Plus 激光雷达的线序。TFmini Plus采用+5V供电,可以直接连接UNO板的5V和GND,串口通信采用软件串口方式,定义UNO板的(2,3)引脚为软串口(RX,TX)。系统接线如图2所示。

编号颜色对应PIN脚功能说明
1PIN-1+5V电源正极
1PIN-2RXD/SDATTL接收I2C数据
1蓝/绿PIN-3TXD/SCL/IOTTL发送/I2C时钟/IO输出
1PIN-4GND电源地

在这里插入图片描述

步骤二:程序编写

该例程功能的实现至少需要Arduino的两个串口,一个接收雷达的数据,一个用于将数据输出到电脑端显示出来。可以复制以下代码粘贴到IDE程序编辑窗口,也可直接打开相应附件文件。

/* This program is the interpretation routine of standard output protocol of TFmini Plus product on Arduino. For details, refer to Product Specifications.
For Arduino boards with only one serial port like UNO board, the function of software visual serial port is to be used. */ 
#include<SoftwareSerial.h>//软串口头文件
SoftwareSerial Serial1(2,3); //定义软串口名称为Serial1,并把pin2定为RX,pin3定为TX

//TFmini Plus相关配置指令,这里没有陈列的指令,可以参考TFmini Plus说明书自行添加。注:本例程采用串口方式进行通信
char getversion[4]={0x5a,0x04,0x01,0x5f};//获取固件版本
char reset[4]={0x5a,0x04,0x02,0x60};//复位
char enable[5]={0x5a,0x05,0x07,0x00,0x66};//关闭输出使能
char disable[5]={0x5a,0x05,0x07,0x01,0x67};//打开输出使能 
char UART[5]={0x5a,0x05,0x0a,0x00,0x69};//修改通信方式为UART
char I2C[5]={0x5a,0x05,0x0a,0x01,0x6a};//修改通信方式为I2C
char samplerate_01[6]={0x5a,0x06,0x03,0x01,0x00,0x64};//设置采样率为1Hz   
char samplerate_10[6]={0x5a,0x06,0x03,0x0a,0x00,0x6d};//设置采样率为10Hz
char samplerate_100[6]={0x5a,0x06,0x03,0x64,0x00,0xc7};//设置采样率为100Hz
char factoryreset[4]={0x5a,0x04,0x10,0x6e};//恢复出厂设置
char save[4]={0x5a,0x04,0x11,0x6f};//保存配置

//TFmini Plus相关配置上行指令。注:输出帧率,输出使能开关,返回下行指令;修改通信方式,无上行数据,直接执行
//获取固件版本后的上行指令
int return_version[7]={0};
//设置采样率后的上行指令
int return_samplerate[6]={0};
//设置输出使能开关后的上行指令
int return_switch[5]={0};
//复位后的上行指令
int return_reset[5]={0};
char reset_success[5]={0x5a,0x05,0x02,0x00,0x60};
char reset_fail[5]={0x5a,0x05,0x02,0x01,0x61};
//恢复出厂后的上行指令
int return_factoryreset[5]={0};
char factoryreset_success[5]={0x5a,0x05,0x10,0x00,0x6e};
char factoryreset_fail[5]={0x5a,0x05,0x10,0x01,0x6f};
//保存配置后的上行指令
int return_save[5]={0};
char save_success[5]={0x5a,0x05,0x11,0x00,0x70};
char save_fail[5]={0x5a,0x05,0x11,0x01,0x71};

//提示信息
String info_getversion="get version ok";
String info_reset="reset ok";
String info_enable="enable ok";
String info_disable="get version ok";
String info_UART="UART ok";
String info_I2C="I2C ok";
String info_samplerate_01="samplerate_01 ok";
String info_samplerate_10="samplerate_10 ok";
String info_samplerate_100="samplerate_100 ok";
String info_factoryreset="factoryreset ok";
String info_save="save ok";

//参数配置函数,down为需要写入的指令,n1为down的数据的个数,buff为接收上行数据,up为数据通信协议中理论的上行数据,n2为buff数据的个数,info为对应指令的提示信息
void configure(char down[],int n1,int buff[],char up[],int n2,String info); //用于比较上行数据是否满足通信协议 1、系统复位2、恢复出厂设置3、保存设置4、波特率5、使能开关
void configure(char down[],int n1,int buff[],int n2,String info);//1、用于不需要比较上行数据的指令 1、获取版本号
void configure(char down[],int n1,String info);//用于UART和I2C修改的指令
//定义接收雷达数据参数
int dist;//雷达实测距离值
int strength;//雷达接收激光的强度值
int check;//校验数值存放
int uart[9];//存放雷达测量的数据
const int HEADER=0x59;//数据包帧头
int i=0;

//教程以设置雷达采样率为10Hz为例,其他设置对应(红色部分)修改即可。
void setup() 
{
  Serial.begin(115200);//设置arduino与电脑连接串口的波特率
  Serial1.begin(115200); //设置arduino与雷达连接串口的波特率
  configure(samplerate_10,6,return_samplerate,samplerate_10,6,info_samplerate_10);
  configure(save,4,return_save,save_success,5,info_save);
}

//根据TFmini Plus说明书中的数据协议,获取并通过串口终端进行距离显示
void loop() 
{
  if (Serial1.available())//查看串口是否有数据输入
  {
    if(Serial1.read()==HEADER)//判断数据包帧头0x59
    {
      uart[0]=HEADER;
      if(Serial1.read()==HEADER)//判断数据包帧头0x59
      {
        uart[1]=HEADER;
        for(i=2;i<9;i++)//存储数据到数组
        {
          uart[i]=Serial1.read();
        } 
        check=uart[0]+uart[1]+uart[2]+uart[3]+uart[4]+uart[5]+uart[6]+uart[7];
        if(uart[8]==(check&0xff))//按照协议对收到的数据进行校验
        {
          dist=uart[2]+uart[3]*256;//计算距离值
          strength=uart[4]+uart[5]*256;//计算强度值
          Serial.print("distance=");
          Serial.print(dist);
          Serial.print('\t');
          Serial.print("strength=");
          Serial.print(strength);
          Serial.print('\n');
        }
      }
    }
  }
}
void configure(char down[],int n1,int buff[],char up[],int n2,String info)
{
  for(i=0;i<n1;i++)
  {
     Serial1.write(down[i]);
  }
  bool getdata=false;
  int num=0;
  while(!getdata)
  {
    if (Serial1.available())
    {
      if(Serial1.read()==0x5a) //判断通信协议帧头0x5a
      {
        buff[0]=0x5a;
        for(i=1;i<n2;i++)
        {
          buff[i]=Serial1.read();
        }
        for(i=0;i<n2;i++)
        {
          if(buff[i]==up[i])
          {
            Serial.print(buff[i],HEX);
            Serial.print('\t');
            num++;
           }    
        }
        if(num==n2)
        {
          num=0;
          Serial.print(info);
        }
        getdata=true;
      }
    } 
  }
  getdata=false;
  Serial.print('\n');  
}
void configure(char down[],int n1,int buff[],int n2,String info)
{
  for(i=0;i<n1;i++)
  {
     Serial1.write(down[i]);
  }
  bool getdata=false;
  while(!getdata)
  {
    if (Serial1.available())
    {
      if(Serial1.read()==0x5a) //判断通信协议帧头0x5a
      {
        buff[0]=0x5a;
        for(i=1;i<n2;i++)
        {
          buff[i]=Serial1.read();
        }
        for(i=0;i<n2;i++)
        {
           Serial.print(buff[i],HEX);  
           Serial.print('\t');
        }
        Serial.print(info);
        getdata=true;
      }
    } 
  }
  getdata=false;
  Serial.print('\n');  
}
void configure(char down[],int n1,String info)
{
  for(i=0;i<n1;i++)
  {
     Serial1.write(down[i]);
  } 
  Serial.print(info);
  Serial.print('\n');  
} 

步骤3:数据查看

将程序下载到Arduino板,打开串口监视器, 即可看到雷达上行数据,配置指令完成状态,并实时显示探测的距离值和相应的信号强度,如图3所示:
在这里插入图片描述
图3 雷达数据在串口监视器上的显示

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TFmini Plus在Arduino上的开发例程(二) 的相关文章

  • ADXL345 与 ESP32 I2C 垃圾值问题

    我已根据以下教程使用 I2C 接口将 ESP32 与 ADXL345 连接起来Tutorial http www esp32learning com code esp32 and adxl345 sensor example php 但是
  • 如何返回变量?

    我正在编写一个程序 将字母翻译成摩尔斯电码 然后将它们传输到 LED 并闪烁 我无法返回值 include
  • Windows IoT 和 DS3231 RTC 时钟

    对于我的项目 我需要当前时间和日期 不幸的是 当 RP2 关闭时 它就会失去一切 接下来的事情是 我将没有互联网连接来使用 NTP 为此 我需要实现 DS3231 RTC 模块 所有设备的通信都通过 I2C 运行 Raspberry Ard
  • arduino安装DHT11库

    步骤操作如下 打开Arduino IDE 在菜单栏中选择 项目 gt 加载库 gt 管理库 在库管理器的搜索框中 输入 DHT sensor library 找到 DHT sensor library by Adafruit 点击 安装 安
  • 使用 Arduino 将serial.read()转换为可用的字符串

    我正在使用两个 Arduino 来相互发送纯文本字符串新软系列 https docs arduino cc learn built in libraries software serial and an RF http en wikiped
  • 如何使用 PHP 读取串口 [重复]

    这个问题在这里已经有答案了 如何使用 php 从连接到我的服务器 运行 kali linux 的旧笔记本电脑 上的 COM 端口的 arduino 读取串行数据 以便我可以在网页上显示数据 我读过有关同一问题的其他问题 所有这些问题要么超级
  • C++ 递减单字节(易失性)数组的元素不是原子的!为什么? (另外:如何在 Atmel AVR mcus/Arduino 中强制原子性)

    由于试图通过一些我不知道的简单内容来调试我的代码 我损失了几天的时间 实际上是大约 25 小时的工作 事实证明 在 AVR ATmega328 8 位微控制器 Arduino 上 用 C 递减单字节数组的元素不是原子操作 并且需要原子访问防
  • Arduino 中的字符串比较

    我正在开发基于网络的家庭自动化系统 因此我的Arduino向服务器发送请求并在串行监视器中获得以下响应以及 loneOn 这是由于Serial println r 陈述 HTTP 1 1 200 OK Date Mon 13 Oct 201
  • Fedora 中的 Arduino 上传错误“stk500_recv(): 程序员没有响应”

    我正在尝试上传库存Blink在 Fedora Core 15 Linux 中使用 Arduino IDE 绘制草图 我收到此错误 avrdude stk500 recv 程序员没有响应 要重现该问题 通过 USB 线插入 Arduino U
  • 如何将 char 数组定义为常量?

    这里是 C C 菜鸟 我已经在头文件中定义了它 typedef unsigned char BitChar 9 8 data bytes chars and one width byte char extern BitChar BitFon
  • Android BLE 扫描与 UUID 过滤器列表混淆

    我正在 Android 移动设备 A 上执行 UUID 过滤扫描 并且有两个测试用例 一个人在另一台 Android 设备 移动设备 b 上使用名为 BLE Scanner 的应用程序来创建具有两个测试服务 每个服务都有自己唯一的 UUID
  • Arduino从SD卡读取最后一行

    我对 Arduino 业务还很陌生 如何从 SD 卡读取最后一行 通过以下代码片段 我可以读取第一行 n 之前的所有字符 现在我想添加一个 向后 声明 或其他内容 到目前为止我的代码 include
  • Arduino - 高效地迭代 C 数组

    我有以下数组 PROGMEM prog uint16 t show hide info 4216 8900 4380 580 500 600 500 580 1620 580 500 600 500 580 500 600 480 600
  • Arduino:连接字符串时崩溃和错误

    我尝试将 AES 256 加密的输出连接到一个字符串 将此字符串与从 Android 手机发送的加密字符串进行比较 基本上 连接似乎有效 但在几次运行后会出现错误 不可读的字符 字符串变得更短而不是更长 或崩溃 它是可重现的 重启后在同一点
  • 如何使用GSM模块SIM800和Arduino Uno发送短信?

    我正在尝试通过 SIM800 GSM 模块从 Arduino 发送短信 消息到达给定号码 但格式不正确 它显示 消息格式不支持 我在这里添加了我的代码 非常感谢您的快速回复 include
  • SIM900 GSM/GPRS 未获得正确的 AT+CREG?回答

    我使用的是带有 IComsat SIM900 GSM GPRS 扩展板的 Arduino UNO 使用以下教程 Arduino 实时 GPS 追踪器 http www samaria me uk 2011 12 arduino live g
  • 使用 Ardulink 命令 Arduino Uno

    我试图在我的 JAVA 应用程序中使用 Ardulink 库来命令我的 Arduino Uno 但没有成功 我不知道我错过了什么 这是我的代码 Link link Link getDefaultInstance boolean connec
  • 在声明对象之前在全局函数中使用类的成员函数

    我有一个事件处理函数 在该函数中调用了类的成员函数 事件处理函数在类 cpp 文件中声明 但不是类的一部分 它不是成员函数 当我编译代码时 编译器表示该函数在范围内 因为它正在调用全局事件处理函数中的成员函数 我的问题如下 有没有办法在全局
  • 从 iBeacon 接收 BLE 信号到 Bluno(arduino with BLE)

    我想从 iBeacon 到 Bluno 接收 rssi 信号和 UUID Arduino 板具有 BLE 对此有一些疑问 有没有从 BLE 到 BLE 接收 UUID 和 rssi 的解决方案 两个BLE设备可以互相通信吗 我想找一些网站来
  • 如何在 Arduino 中将 char 变量作为数字打印到串行端口?

    我正在使用 Arduino Uno 我正在从 EEPROM 读取一个字节值并将该值存储在类型变量中char 1 字节 我想将变量的值作为数字 而不是相应的 ASCII 代码 打印到串行监视器 例如考虑char val 5 我想查看串行监视器

随机推荐

  • 使用cmake编译,组织C++项目

    文章目录 前言例一例二例三 前言 这篇博客是我对cmake用法的一些经验总结 还很浅显 如果有错误或者更好的方案 欢迎指正 使用方法统一为在build目录中执行 cmake make 我觉得养成外部编译是一个好习惯 例一 目录结构为 lzj
  • Spring Security Oauth2.0认证授权

    基本概念 认证 用户认证就是判断一个用户的身份是否合法的过程 xff0c 用户去访问系统资源时系统要求验证用户的身份信息 xff0c 身份合法方可继续访问 xff0c 不合法则拒绝访问 常见的用户身份认证方式有 用户名密码登录 xff0c
  • C语言实现HTTP的GET和POST请求

    HTTP请求和IP TCP 所谓的HTTP协议是基于IP TCP协议的 xff0c 所以要获取远端的html数据只要创建socket对象就足够了 xff1b HTTP是基于IP TCP加上了网络请求的固定格式 get 请求 include
  • 英伟达GPU安装教程

    英伟达GPU安装教程
  • 四种插头类型:XH、VH、SM、HY

    PH1 25mm HY2 0mm XH2 5 2 54mm xff08 这两个其实是一样的 xff09 VH3 96mm 插头分成三种类型 xff1a XH xff1b VH xff1b SM xff1b HY XH 4Y 是插头 xff1
  • STM32F1C8T6Flash读取音频和DAC播放

    文章目录 一 Flash简介1 Flash原理2 STM32F1中的Flash 二 Flash地址空间的数据读取1 题目要求2 CUbeMX工程建立3 Keil工程修改4 STlink调试说明5 调试运行 三 基于片内Flash的提示音播放
  • C语言中的头文件为什么不能定义变量

    1 前提 在实际项目中 xff0c 会遇到这样的情况 xff0c 在链接阶段 xff0c 会提示定义在头文件中的变量 xff0c 重定义 xff0c 然后将将头文件中的变量定义成static类型 xff0c 然后 xff0c 不报错误了 例
  • Ubuntu16.04安裝ROS

    此文章在前人的基礎上 xff0c 並把安裝遇到的問題寫出來 Ubuntu16 04安装ROS Kinetic详细过程 https blog csdn net weixin 43159148 article details 83375218
  • B-spline的理解与路径规划中的应用及C++代码的实现

    研究项目 xff0c 无人机的路径规划 xff0c 需要用到B样条 xff0c 所以在此写下B spline的结合C 43 43 代码的理解以及在项目中的应用 一 阶数p 阶数 61 所有权重中t的最高次幂 61 控制点数量 1 xff1b
  • Jetson TX2 各个模式

    Jetson TX2 工作模式及相应的CPU和GPU频率 xff1a 上电的时候 xff0c 默认最低功耗模式1 xff0c 风扇不转 1 直接运行home下的jetson clocks sh xff0c 开启最大频率 sudo jetso
  • 网络通信基础知识—网络通信的发展历程

    网络通信基础知识 网络通信的发展历程 xff08 1 xff09 单机阶段 xff08 2 xff09 局域网阶段 xff08 3 xff09 广域网internet阶段 xff08 很多个局域网之间通信 xff09 xff08 4 xff
  • win7下装ubuntu双系统 硬盘安装详细教程

    本文转载自http www linuxidc com Linux 2014 10 108430 htm https jingyan baidu com article e4d08ffdace06e0fd2f60d39 html 在自己安装过
  • ROS导航——配置机器人的导航功能(move_base包)

    中间部分是整个导航的核心部分 xff0c 由move base功能包提供 配置如下 xff1a lt launch gt lt node pkg 61 34 move base 34 type 61 34 move base 34 resp
  • 基于docker安装tensorflow

    最近在自学机器学习 xff0c 大热的Tensorflow自然不能错过 xff0c 所以首先解决安装问题 xff0c 为了不影响本地环境 xff0c 所以本文基于Docker来安装Tensorflow xff0c 我的环境是Ubuntu16
  • okHttpUtil工具类

    pom文件 lt dependency gt lt groupId gt com squareup okhttp3 lt groupId gt lt artifactId gt okhttp lt artifactId gt lt vers
  • 基于采样的RRT/RRT*/RRT_connect算法笔记及C++实现

    本文记录常见的基于采样的RRT算法及相关改进算法 xff08 RRT xff0c RRT connect xff09 的原理和代码实现效果 与上一章介绍A 算法的文章不同 xff0c 本文会先给出几种算法之间的效果对比 xff0c 先有个直
  • STM32F103ZE驱动PMW3901光流模块

    本文将会简单的介绍如何使用STM32F103ZE驱动PMW3901光流模块 xff0c 使用标准库 所用材料如下 一块 STM32F103最小系统板以及一个 PMW3901光流模块 通过查阅PMW3901的数据手册可以得知 xff0c 该芯
  • 计算两圆相交面积

    转自 xff1a 模板 求两圆相交面积 xff08 模板 xff09 两圆相交分如下集中情况 xff1a 相离 相切 相交 包含 设两圆圆心分别是O1和O2 xff0c 半径分别是r1和r2 xff0c 设d为两圆心距离 又因为两圆有大有小
  • 深蓝学院-移动机器人运动规划重点笔记

    移动机器人运动规划笔记 xff0c 转载自https blog csdn net wqwqqwqw1231 article details 107310965 感谢原作者的总结 xff01
  • TFmini Plus在Arduino上的开发例程(二)

    本例程以Arduino Uno板为例 xff0c 通过Arduino实现TFmini Plus相关指令的写入 xff0c 上行数据的读取 判断和测量数据的获取打印 xff0c 主要帮助客户快速熟悉我公司雷达 xff0c 减少产品的研发周期