目录
前言
本文档英文版本请参考下面链接
本文介绍了如何将 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的引脚排列(放大图片看细节):
根据 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 并使用单独电源的连接图如下:
有关 LiDAR 电流额定值和您的供电能力的确切详细信息,请参阅它们各自的数据表。
TF系列默认UART通讯参数:
根据TF系列激光雷达的规格书,UART的通讯参数如下:
代码脚本中的UART通信就是根据这些信息建立起来
电缆和连接器选择:
所有 Benewake 单点 LiDAR 都有 4 针或 7 针(用于 TF03)Molex 连接器,因此所需的匹配连接器为 JST 1.25mm。 您可以根据您拥有的 LiDAR 选择 4 针或 7 针。 在控制器端,如果您使用面包板,则可以根据用户端选择公杜邦连接器或任何其他合适的连接器。 示例电缆之一如下所示:
数据格式
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)