目录
TF-UART-9 与 Arduino
硬件接线图
适配产品:TF-Luna\TFmini-S\TFmini Plus\TF02-Pro
注:线条颜色对应雷达线定义如下表
例程代码
TFmini-UART-9
#include<SoftwareSerial.h>/* 软串口头文件 */
SoftwareSerial Serial1(2,3); /* 定义软串口名称为Serial1,并把pin2定为RX,pin3定为TX */
int dist;/* 雷达实测距离值 */
int strength;/* 雷达信号强度 */
int check;/* 校验数值存放 */
int i;
int uart[9];/* 存放雷达测量的数据 */
const int HEADER=0x59;/* 数据包帧头 */
void setup()
{
Serial.begin(115200);/* 设置arduino与电脑连接串口的波特率 */
Serial1.begin(115200);/* 设置雷达与arduino连接串口的波特率 */
}
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("dist = ");
Serial.print(dist);/* 输出雷达测试距离值 */
Serial.print('\t');
Serial.print("strength = ");
Serial.print(strength);//输出信号强度值 */
Serial.print('\n');
}
}
}
}
}
TF IIC 和 TFmini Plus IIC在Arduino上的运用
接线图
带IIC接口的TF系列产品 TF-luna\TFmini-s\TFmini-plus\TF02-Pro
注:如何切换成IIC模式,请查看使用说明书
注:线条颜色对应雷达线定义如下表
TFmini IIC、TFmini Plus IIC、TF Luna IIC例程代码
TFmini IIC
#include <Wire.h>
void setup() {
Wire.begin(); /* join i2c bus (address optional for master) */
Serial.begin(115200); /* start serial for output */
pinMode(LED_BUILTIN, OUTPUT);/* LED */
}
void loop() {
Get_LidarDatafromIIC(0x10);
delay(1);
digitalWrite(LED_BUILTIN, HIGH); /* turn the LED on (HIGH is the voltage level) */
delay(1);
digitalWrite(LED_BUILTIN, LOW); /* turn the LED off by making the voltage LOW */
}
void Get_LidarDatafromIIC(byte address) {
char i = 0;
byte rx_buf[7] = {0};
Wire.beginTransmission(address); /* Begin a transmission to the I2C Slave device with the given address. */
Wire.write(1); /* Reg's Address_H */
Wire.write(2); /* Reg's Address_L */
Wire.write(7); /* Data Length */
Wire.endTransmission(0); /* Send a START Sign */
Wire.requestFrom(address, 7); /* request 7 bytes from slave device address */
/* print the result via serial */
Serial.print("Address=0x");
Serial.print(address, HEX);
Serial.print(": ");
while ( Wire.available())
{
rx_buf[i] = Wire.read(); /* received one byte */
Serial.print("0x");
Serial.print(rx_buf[i], HEX);
Serial.print(";");
i++;
if (i >= 7)
{
i = 0;
Serial.print("---------->");
Serial.print("Distance=");
Serial.print(rx_buf[3] * 256 + rx_buf[2]);
Serial.print(";");
Serial.print("Strength=");
Serial.print(rx_buf[5] * 256 + rx_buf[4]);
}
}
Serial.print("\r\n");
}
Tfmini Plus IIC
#include <Wire.h>
u8 cmd[5] = {0x5a, 0x05, 0x00, 0x01, 0x60};
void setup() {
Wire.begin(); /* join i2c bus (address optional for master) */
Serial.begin(115200); /* start serial for output */
pinMode(LED_BUILTIN, OUTPUT);/* LED */
}
void loop() {
Get_LidarDatafromIIC(0x10);
delay(100);
}
void Get_LidarDatafromIIC(byte address) {
char i = 0;
char j = 0;
byte rx_buf[9] = {0};
Wire.beginTransmission(address); /* Begin a transmission to the I2C Slave device with the given address. */
for (j = 0; j < 5; j++)
{
Wire.write(cmd[j]);
}
Wire.endTransmission(0); /* Send a START Sign */
Wire.requestFrom(address, 9); /* request 7 bytes from slave device address */
//print the result via serial
Serial.print("Address=0x");
Serial.print(address, HEX);
Serial.print(": ");
while ( Wire.available())
{
rx_buf[i] = Wire.read(); /* received one byte */
Serial.print("0x");
Serial.print(rx_buf[i], HEX);
Serial.print(";");
i++;
if (i >= 9)
{
i = 0;
Serial.print("---------->");
Serial.print("Distance=");
Serial.print(rx_buf[3] * 256 + rx_buf[2]);
Serial.print(";");
Serial.print("Strength=");
Serial.print(rx_buf[5] * 256 + rx_buf[4]);
}
}
Serial.print("\r\n");
}
Tf_luna IIC
/******************************************************************************
@file benewake_luna_iic.ino
@author zoran.wu
@version V0.0.1
@date 2021-02-02
@brief This file contains all the main functions.
******************************************************************************
@attention For use only on Benewake TF-Luna
******************************************************************************
Change List
2021-02-02 : First Version
******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include <Wire.h>
#define REG_DIST_L_00H 0x00
#define REG_DIST_H_01H 0x01
#define REG_AMP_L_02H 0x02
#define REG_AMP_H_03H 0x03
#define REG_TEMP_L_04H 0x04
#define REG_TEMP_L_05H 0x05
typedef struct {
u16 u16Distance;
u16 u16Amp;
u16 u16Temp;
int u8Address;
} TF;
TF Lidar1 = {0, 0, 0, 0x10};
void setup() {
Wire.begin(); /* join i2c bus (address optional for master)*/
Serial.begin(115200); /* start serial for output*/
}
void loop() {
GetLidarData(&Lidar1);
Serial.print("Lidar1: ");
Serial.print("Distance = ");
Serial.print(Lidar1.u16Distance);
Serial.print(";");
Serial.print("AMP = ");
Serial.print(Lidar1.u16Amp);
Serial.print(";");
Serial.print("Temp = ");
Serial.print(float(Lidar1.u16Temp)/100);
Serial.println("℃;");
delay(100);
}
void GetLidarData(TF* lidar) {
char i = 0;
byte rx_buf[6] = {0};
Wire.beginTransmission(lidar->u8Address); /*Begin a transmission to the I2C Slave device with the given address.*/
Wire.write(REG_DIST_L_00H);
Wire.endTransmission(); /*Send a START Sign*/
Wire.requestFrom(lidar->u8Address, 6); /* request 7 bytes from slave device address*/
while ( Wire.available())
{
for (i = 0; i < 6; i++)
rx_buf[i] = Wire.read(); /*received one byte*/
}
lidar->u16Distance = rx_buf[1] * 256 + rx_buf[0];
lidar->u16Amp = rx_buf[3] * 256 + rx_buf[2];
lidar->u16Temp = rx_buf[5] * 256 + rx_buf[4];
}
IIC接口运行过程中可能出现的问题:
输出数据均显示为0
可能原因:雷达启动时5号引脚未接地,导致雷达未进入IIC模式;设备ID设置错误。
多台TFLidar以IIC方式连接Arduino使用的参考方案:
以4台雷达为例,通过一组IIC总线在Arduino UNO开发板进行接收数据。
IIC通讯采用主从模式,Arduino开发板作为主机,TFLidar作为从机。每一台TFLidar配置为独立的地址,主机查询对应地址的TFLidar的数据并等待数据返回。
连接测试方案:
1、设置从机地址
串口状态下从机地址修改指令:5A 05 0B ADDR SUM
本方案中将4台TFLidar的从机地址分别设置为0x10、0x11、0x12和0x13.
2、接线
注意:因为电脑USB接口输出电流有限,接多台TFmini同时使用需要外接5V供电。同时雷达与Arduino开发板需要共地。
参考代码
/*This is a reference code about Arduino UNO receive TFmini-I²C Data from I²C bus
* Arduino is Master, TFmini-I²C is slave. Master send check
* Author:zhaomingxin@Benewake
* Update date:2019.4.28
*/
#include <Wire.h>
void setup() {
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(115200); // start serial for output
pinMode(LED_BUILTIN, OUTPUT);//LED
}
void loop() {
Get_LidarDatafromIIC(0x10);
Get_LidarDatafromIIC(0x11);
Get_LidarDatafromIIC(0x12);
Get_LidarDatafromIIC(0x13);
delay(250);
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(250);
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
}
void Get_LidarDatafromIIC(byte address){
char i = 0;
byte rx_buf[7] = {0};
Wire.beginTransmission(address); // Begin a transmission to the I2C Slave device with the given address.
Wire.write(1); // Reg's Address_H
Wire.write(2); // Reg's Address_L
Wire.write(7); // Data Length
Wire.endTransmission(0); // Send a START Sign
Wire.requestFrom(address, 7); // request 7 bytes from slave device address
//print the result via serial
Serial.print("Address=0x");
Serial.print(address,HEX);
Serial.print(": ");
while ( Wire.available())
{
rx_buf[i] = Wire.read(); // received one byte
Serial.print("0x");
Serial.print(rx_buf[i],HEX);
Serial.print(";");
i++;
if(i>=7)
{
i=0;
Serial.print("---------->");
Serial.print("Distance=");
Serial.print(rx_buf[3]*256+rx_buf[2]);
Serial.print(";");
Serial.print("Strength=");
Serial.print(rx_buf[5]*256+rx_buf[4]);
}
}
Serial.print("\r\n");
}
测试结果:
Arduino通过IIC总线查询雷达数据,再通过串口将数据打印出来。