TF 系列单点 LiDAR 与 Raspberry Pi Pico 连接
2021/7/19 11:34:53
本文主要是介绍TF 系列单点 LiDAR 与 Raspberry Pi Pico 连接,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录
- 前言
- Pico控制板管脚协议
- 接线图:
- TF系列默认UART通讯参数:
- 电缆和连接器选择:
- Pico 控制器的 C 代码:
- UART 端口引脚初始化:
- Pull in our pico_stdlib which pulls in commonly used features, also add hardware uart because we are
- enable/diable usb output, and uart output
- create map/bin/hex file etc.
- add url via pico_set_program_url
前言
本文档英文版本请参考下面链接
本文介绍了如何将 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)
这篇关于TF 系列单点 LiDAR 与 Raspberry Pi Pico 连接的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-15聊聊用LangChain4J构建聊天机器人的那些事儿
- 2024-11-15LangChain 和 LlamaIndex 在检索增强生成(RAG)中的大比拼:全面对比评测
- 2024-11-15平台工程不只是配置管理:超越CFEngine的方法
- 2024-11-152023年KubeCon芝加哥大会精华回顾
- 2024-11-15我花了3小时大致了解了ClickHouse
- 2024-11-15在使用平台私钥进行解密时提示 "私钥解密失败" 错误信息是什么原因?-icode9专业技术文章分享
- 2024-11-15Layui框架有哪些方式引入?-icode9专业技术文章分享
- 2024-11-15Layui框架中有哪些减少对全局环境的污染方法?-icode9专业技术文章分享
- 2024-11-15laydate怎么关闭自动的日期格式校验功能?-icode9专业技术文章分享
- 2024-11-15laydate怎么取消初始日期校验?-icode9专业技术文章分享