TF 系列单点 LiDAR 与 Raspberry Pi Pico 连接

目录


TF 系列单点 LiDAR 与 Raspberry Pi Pico 连接

前言

本文档英文版本请参考下面链接

本文介绍了如何将 Benewake 单点 LiDAR 与 Raspberry Pi Pico 微控制器连接起来。 运用本文档前提:

  • 最终用户手上有 Pico 微控制器和任何单点激光雷达(Luna、TFmini-Plus、mini-S、TF02-pro、TF03-UART)
  • 用于编译 Pico SDK 的开发环境(包括 Pico SDK) C代码已经设置好
  • 所有需要的线缆和5V电源
  • LiDAR接口模式为TTL(默认标品协议)
  • 任意编辑器编写和修改脚本(推荐使用VS Code)

Pico控制板管脚协议

有关 Pico 的完整文档可在 Raspberry Pi 网站上找到,但为了方便起见,我们将在这里简要讨论引脚排列,并了解哪些引脚可用于 UART 接口。
下图是Pico的引脚排列(放大图片看细节):
TF 系列单点 LiDAR 与 Raspberry Pi Pico 连接
根据 Pico 的规格,它有两个 UART 端口,这些端口可以指向任何可用的引脚。 看上图(GP0,GP1),(GP4,GP5),(GP8,GP9),(GP12,GP13),(GP16,GP17)都适合UART通讯。 在我们的代码中,我们使用了GPIO-4和5。需要注意的是,电压供应只有一个引脚,也是3.3V,而Benewake LiDAR的额定电压是5V。 如果电压不是5V,精度会受到影响,误差会超过额定误差,在某些情况下,误差是非线性的,随着距离的增加而增加。 它可能达到40厘米。 因此建议为 LiDAR 使用单独的 5V 电源。

接线图:

将 LiDAR 连接到 Pico 并使用单独电源的连接图如下:
TF 系列单点 LiDAR 与 Raspberry Pi Pico 连接
有关 LiDAR 电流额定值和您的供电能力的确切详细信息,请参阅它们各自的数据表。

TF系列默认UART通讯参数:

根据TF系列激光雷达的规格书,UART的通讯参数如下:
TF 系列单点 LiDAR 与 Raspberry Pi Pico 连接
代码脚本中的UART通信就是根据这些信息建立起来

电缆和连接器选择:

所有 Benewake 单点 LiDAR 都有 4 针或 7 针(用于 TF03)Molex 连接器,因此所需的匹配连接器为 JST 1.25mm。 您可以根据您拥有的 LiDAR 选择 4 针或 7 针。 在控制器端,如果您使用面包板,则可以根据用户端选择公杜邦连接器或任何其他合适的连接器。 示例电缆之一如下所示:
TF 系列单点 LiDAR 与 Raspberry Pi Pico 连接
数据格式
TF 系列单点 LiDAR 与 Raspberry Pi Pico 连接
TF 系列单点 LiDAR 与 Raspberry Pi Pico 连接

Pico 控制器的 C 代码:

在本节中,我们将讨论用于从 Benewake LiDAR 读取数据的 C 代码的主要部分。 添加必要的库:

#include<stdio.h>
#include "pico/stdlib.h"
#include "hardware/gpio.h"
#include "pico/binary_info.h"
#include "hardware/uart.h"
#include "tusb.h" // this header file will handle the problem of losing initial output

UART 端口引脚初始化:

如上所述,有两个串行端口(端口 0 和端口 1)。 我使用了端口 1。

#define BAUD_RATE 115200
#define UART_ID1 uart1
#define UART1_TX_PIN 4 // pin-6
#define UART1_RX_PIN 5 // pin-7

我使用 C 语言的结构来处理 LiDAR 数据。

//Dist_L Dist_H Strength_L Strength_H Temp_L Temp_H Checksum
typedef struct {
  unsigned short Header;
  unsigned short Dist;
  unsigned short Strength;
} structLidar;
union unionLidar {
  unsigned char Byte[9];
  structLidar lidar;
};
unsigned char lidarCounter = 0;
union unionLidar Lidar;
//***********Structure and Union for handling LiDAR Data********

UART通信处理函数:

//****************************Function to read serial data***********
int isLidar(uart_inst_t * uart, union unionLidar * lidar)
{
  int loop;
  int checksum;
  unsigned char serialChar;
  while (uart_is_readable(uart))
  {
    if (lidarCounter > 8)
    {
      lidarCounter = 0;
      return 0; // something wrong
    }
    serialChar = uart_getc(uart); // Read a single character to UART.
    lidar->Byte[lidarCounter] = serialChar;
    switch (lidarCounter++)
    {
      case 0:
      case 1:
        if (serialChar != 0x59)
          lidarCounter = 0;
        break;
      case 8: // checksum
        checksum = 0;
        lidarCounter = 0;
        for (loop = 0; loop < 8; loop++)
          checksum += lidar->Byte[loop];
        if ((checksum & 0xff) == serialChar)
        {
          //printf("checksum ok\n");
          lidar->lidar.Dist = lidar->Byte[2] | lidar->Byte[3] << 8;
          lidar->lidar.Strength = lidar->Byte[4] | lidar->Byte[5] << 8;
          return 1;
        }
        //printf("bad checksum %02x != %02x\n",checksum & 0xff, serialChar);
    }
  }
  return 0;
}
//****************************Function to read serial data***********

在主函数中,我运行 while 循环,它将持续监视串行端口上的数据流并将其打印到屏幕上。 连接到 Pin-25 的 Pico 的 LED 会随着数据的处理持续闪烁。 有一些二进制信息相关的代码我没有解释,仅用于调试目的,不是很有必要。

//*******************************
cdcd_init();
printf("waiting for usb host");
while (!tud_cdc_connected()) {
  printf(".");
  sleep_ms(500);
}
printf("\nusb host detected!\n");
//********************************

上述部分代码将等待 USB 主机连接,一旦连接,代码流程将转到下一步。 虽然以下代码检查 UART 端口是否已启用:

//************************************************************
// In a default system, printf will also output via the default UART
sleep_ms(5000);
ret = uart_is_enabled (uart1);
if (ret == true) {
  printf("UART-1 is enabled\n");
}
printf("Ready to read data from Benewake LiDAR\n");

While Loop:

while (true) {
  gpio_put(LED_PIN, 0);
  sleep_ms(100);
  gpio_put(LED_PIN, 1);
  if (isLidar(UART_ID1, &Lidar))
  {
    // ok we got valid data
    // Here we utilized the Union
    printf("Dist:%u Strength:%u \n", \
           Lidar.lidar.Dist, \
           Lidar.lidar.Strength);
  }
}

CMakeLists.txt:
add_executable(tf_series tf_series.c)

Pull in our pico_stdlib which pulls in commonly used features, also add hardware uart because we are

going to use uart port
target_link_libraries(tf_series pico_stdlib hardware_uart)

enable/diable usb output, and uart output

pico_enable_stdio_usb(tf_series 1) # 1 means enable and 0 means disable
pico_enable_stdio_uart(tf_series 1)

create map/bin/hex file etc.

pico_add_extra_outputs(tf_series)

add url via pico_set_program_url

example_auto_set_url(tf_series)

上一篇:主流激光雷达分类及原理


下一篇:索尼开发新传感器为激光雷达提供助力,用于自动驾驶和其他应用