Benewake(北醒) 单点TF系列雷达在Arduino上的运用

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总线查询雷达数据,再通过串口将数据打印出来。
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 激光雷达可以支持ArduinoArduino是一种开源的硬件平台,使用简单、灵活,并具备丰富的传感器和模块支持。激光雷达是一种基于激光原理的测距设备,能够高精度、高速地获取环境中物体的距离和位置信息。 为了实现激光雷达Arduino的连接,一般需要利用激光雷达的通信接口来与Arduino进行数据传输。常见的通信接口有UART、SPI、I2C等。通常情况下,激光雷达会提供相应的驱动库或示例代码,供开发者使用。 使用激光雷达Arduino,可以实现许多应用。比如,在机器人导航中,通过激光雷达获取环境中障碍物的距离和位置信息,再结合Arduino的控制,可以为机器人提供精确的避障能力。在无人驾驶领域,激光雷达也是重要的传感器之一,能够提供周围环境的三维点云信息,用于实现环境感知和目标检测等功能。 需要注意的是,由于激光雷达测距原理的特殊性,一些低成本的激光雷达可能存在测距误差较大的情况。因此,在选择激光雷达时,需要考虑其测距精度和适应的应用场景。同时,程序开发时,也需要合理设计算法,以处理和优化从激光雷达获取的数据,以满足具体应用的要求。 总之,激光雷达是一种强大的测距设备,可以支持Arduino平台,并且在机器人导航、无人驾驶等领域具有广泛的应用前景。 ### 回答2: 激光雷达是一种传感器设备,用于测量和感知其周围环境的距离和位置信息。它主要通过发射激光束并接收返回的反射激光来实现测距。激光雷达通常可以通过串口或者以太网接口与计算机或其他控制设备进行通信和数据传输。 Arduino是一种开源的硬件平台,可以编写控制程序,以控制各种外部设备和传感器。Arduino使用一种基于C语言的编程语言,具有易于学习和使用的特点,因而非常适合初学者和业余爱好者使用。 激光雷达一般都具有标准的接口和通信协议,一般可以通过串口与Arduino进行连接和通信。通过使用Arduino的串口库和激光雷达的通信协议,可以实现激光雷达Arduino的数据交互。 使用激光雷达时,首先需要连接激光雷达的数据线到Arduino的串口引脚,并且在Arduino程序中编写相应的代码来读取和解析激光雷达发送的数据。然后,可以根据实际需求使用得到的数据进行相应的控制和决策。 总结来说,激光雷达是支持Arduino的。通过合适的硬件接口和通信协议,可以实现激光雷达Arduino的交互与控制,为各种应用提供更加准确和全面的环境感知能力。 ### 回答3: 激光雷达可以通过使用特定的接口和协议与Arduino进行通信和控制。激光雷达一般采用串行通信方式,可以使用Arduino的UART接口将激光雷达Arduino连接。通过串行通信,Arduino可以发送指令控制激光雷达的工作模式、扫描角度和数据采集频率等参数。同时,激光雷达也可以通过串行通信将采集到的数据传送给Arduino进行处理和分析。在Arduino中,可以编写相应的程序来解析和处理激光雷达传输的数据,实现对环境中目标物体的检测、定位和距离测量等功能。因此,可以说激光雷达是支持Arduino的,通过合适的接口和协议,可以实现Arduino激光雷达的通信和控制。这为使用Arduino进行激光雷达相关项目的开发和应用提供了可能。不过需要注意的是,激光雷达的接口和协议可能会因不同的型号和厂商而有所差异,因此在使用激光雷达时需要确认与其通信的具体接口和通信协议,以确保与Arduino的兼容性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值