本例程以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脚 | 功能 | 说明 |
---|
1 | 红 | PIN-1 | +5V | 电源正极 |
1 | 白 | PIN-2 | RXD/SDA | TTL接收I2C数据 |
1 | 蓝/绿 | PIN-3 | TXD/SCL/IO | TTL发送/I2C时钟/IO输出 |
1 | 黑 | PIN-4 | GND | 电源地 |
步骤二:程序编写
该例程功能的实现至少需要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(使用前将#替换为@)