本文档英文版本请参考下面链接
本文介绍了如何将 Benewake 单点 LiDAR 与 Raspberry Pi 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的通讯参数如下:
代码脚本中的UART通信就是根据这些信息建立起来
所有 Benewake 单点 LiDAR 都有 4 针或 7 针(用于 TF03)Molex 连接器,因此所需的匹配连接器为 JST 1.25mm。 您可以根据您拥有的 LiDAR 选择 4 针或 7 针。 在控制器端,如果您使用面包板,则可以根据用户端选择公杜邦连接器或任何其他合适的连接器。 示例电缆之一如下所示:
数据格式
在本节中,我们将讨论用于从 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
如上所述,有两个串行端口(端口 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)
going to use uart port
target_link_libraries(tf_series pico_stdlib hardware_uart)
pico_enable_stdio_usb(tf_series 1) # 1 means enable and 0 means disable
pico_enable_stdio_uart(tf_series 1)
pico_add_extra_outputs(tf_series)
example_auto_set_url(tf_series)