在这里插入图片描述

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十一:360°旋转扫描激光雷达测距传感器模块 ROS机器人建图导航定位 ROS小车导航路径规划避障(EAI YDLIDAR X4)

在这里插入图片描述
在这里插入图片描述

激光雷达YDLIDAR X4的系统设置了 3 种工作模式:空闲模式、扫描模式、停机模式:

➢ 空闲模式:X4 上电时,默认为空闲模式,空闲模式时,X4 的测距单元不工作,激光器不亮。
➢ 扫描模式:当 X4 进入扫描模式时,测距单元点亮激光器,开始工作,不断得对外部环境进行激光采样,并经过后台处理后实时输出。
➢ 停机模式:当 X4 运行有错时,如开启扫描时,激光器不亮,电机不转等状况,X4 会自动关闭测距单元,并反馈错误代码。

工作流程

在这里插入图片描述
激光雷达YDLIDAR X4 系统通信机制
X4 是通过串口来和外部设备进行命令和数据的交互。当外部设备发送一个系统命令至X4,X4 解析系统命令,会返回相应的应答报文,并根据命令内容,来切换相应的工作状态,外部系统根据报文内容,解析报文,便可获取应答数据。

在这里插入图片描述

激光雷达YDLIDAR X4 的系统命令
外部系统通过发送相关的系统命令,便可设置 X4 相应的工作状态,获取相应的数据。X4的系统命令统一为 2 个字节,其中起始字节统一为 0xA5,第二个字节为命令内容。X4 对外发布的系统命令如下:

在这里插入图片描述

激光雷达YDLIDAR X4 的系统报文
系统报文时系统根据接收的系统命令反馈的应答报文,不同的系统命令,系统报文的应答模式和应答内容也不一样,其中应答模式有三种:无应答、单次应答、持续应答。
无应答表示系统不反馈任何报文;单次应答表示系统的报文长度是有限的,应答一次即结束;持续应答表示系统的报文长度是无限长的,需要持续发送数据,如进入扫描模式时。
单次应答和持续应答的报文采用同一个数据协议,其协议内容为:起始标志、应答长度、应答模式、类型码和应答内容,通过串口 16 进制输出。

在这里插入图片描述

➢ 起始标志:X4 的报文标志统一为 0xA55A;
➢ 应答长度:应答长度表示的是应答内容的长度,但当应答模式为持续应答时,长度应为无限大,因此该值失效;
➢ 应答模式:该位只有 2bits,表示本次报文是单次应答或持续应答,其取值和对应的模式如下:

在这里插入图片描述

➢ 类型码:不同的系统命令,对应不同的类型码;
➢ 应答内容:不同的系统命令,反馈不同的数据内容,其数据协议也不同。
注 1:X4 的数据通信采用的是小端模式,低位在前。
注 2:应答报文中,第 6 个字节的低 6 位属于应答长度,高 2 位属于应答模式。

激光雷达YDLIDAR X4 的数据协议
不同的系统命令,有着不同报文的报文内容。而不同类型码的报文中,其应答内容的数据协议也不尽相同。因此,用户需要根据相应的数据协议,来解析应答内容中的数据,如点云数据、设备信息等。

扫描命令 [A5 60]
当外部设备向 X4 发送扫描命令时,X4 会进入扫描模式,并反馈点云数据。其应答报文为:

在这里插入图片描述
其中第 6 个字节高 2 为 01,因此应答模式取值为 0x1,为持续应答,忽略应答长度,类型码为 0x81;应答内容为系统扫描的点云数据,其按照以下数据结构,以 16 进制向串口发送至外部设备。扫描命令应答内容数据结构描述:

在这里插入图片描述
激光雷达YDLIDAR X4 的功耗控制
X4 的对外接口中,提供了电机的相关控制接口(M_EN,M_SCTP)和功耗的控制接口(DEV_EN),用户可设置该三个控制信号来控制设备的功耗。

待机控制
为了方便用户快速使用,X4 控制信号的默认值(请参考数据手册)没有实现最低功耗,因此,当用户需要调试出最低功耗的待机状态,需要进一步对 M_EN、DEV_EN 进行如下调控:
M_EN = 0V,DEV_EN = 0V。
以此便关闭了电机的使能和测距使能,整个系统便处于最低功耗的待机状态。

速度控制
同时,用户可以根据实际需要,改变扫描频率来满足需求。通过改变 M_SCTP 管脚输入电压,或改变输入的 PWM 信号的占空比,来调控电机转速(具体控制方法,请参考数据手册)。

在这里插入图片描述
使用Arduino来尝试一下激光雷达的串口通信,实验参考接线示意图

在这里插入图片描述

在这里插入图片描述

激光雷达YDLIDAR X4底部有一个P8排插,需要配套PH2.0-P8公头排线

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
下载安装激光雷达RPLIDAR 的 Arduino 驱动库

https://github.com/robopeak/rplidar_arduino

在这里插入图片描述

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十一:360°旋转扫描激光雷达测距传感器 ROS机器人建图导航定位 ROS小车导航路径规划避障模块(EAI YDLIDAR X4)
项目之一:从 RPLIDAR 获取数据的简单通用方法(您可以基于此模板自由添加您的应用程序代码)
实验接线:
1、将 RPLIDAR 的串行端口 (RX/TX/GND) 连接到您的 Arduino 板(引脚 0 和引脚 1)
2、将 RPLIDAR 的电机控制引脚连接到 Arduino 板引脚 3

Arduino实验开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百二十一:360°旋转扫描激光雷达测距传感器 ROS机器人建图导航定位 ROS小车导航路径规划避障模块(EAI YDLIDAR X4)
  项目之一:从 RPLIDAR 获取数据的简单通用方法(您可以基于此模板自由添加您的应用程序代码)
  实验接线:
  1、将 RPLIDAR 的串行端口 (RX/TX/GND) 连接到您的 Arduino 板(引脚 0 和引脚 1)
  2、将 RPLIDAR 的电机控制引脚连接到 Arduino 板引脚 3
*/

//  RPLIDAR 驱动程序库
#include <RPLidar.h>

//您需要创建驱动程序实例
RPLidar lidar;

#define RPLIDAR_MOTOR 3 //用于控制 RPLIDAR 电机速度的 PWM 引脚
//此引脚应与 RPLIDAR 的 MOTOCTRL 信号连接


void setup() {
  // 将 RPLIDAR 驱动程序绑定到 arduino 硬件串行
  lidar.begin(Serial);

  // 设置引脚模式
  pinMode(RPLIDAR_MOTOR, OUTPUT);
}

void loop() {
  if (IS_OK(lidar.waitPoint())) {
    float distance = lidar.getCurrentPoint().distance; //以毫米为单位的距离值
    float angle    = lidar.getCurrentPoint().angle; //以度为单位的角度值
    bool  startBit = lidar.getCurrentPoint().startBit; //起始位,此点是否属于新扫描
    byte  quality  = lidar.getCurrentPoint().quality; //电流测量的质量

    //在这里执行数据处理...


  } else {
    analogWrite(RPLIDAR_MOTOR, 0); //停止 rplidar 电机

    // 尝试检测RPLIDAR...
    rplidar_response_device_info_t info;
    if (IS_OK(lidar.getDeviceInfo(info, 100))) {
      // 检测到...
      lidar.startScan();

      // 启动电机以最大允许速度旋转
      analogWrite(RPLIDAR_MOTOR, 255);
      delay(1000);
    }
  }
}

实验场景图

在这里插入图片描述

在这里插入图片描述

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐