目录:
- 概述
- 参数
- 引脚说明
- 通信协议
-
- (1)串口通信参数
- (2)模块输出格式
- (3)输入:命令字节由外部控制器发送至GY-53L1 模块(十六进制)
- 使用
- 程序
-
- 串口中断服务函数|接收正确的数据包
- 数据处理函数
- 发送命令字节函数
概述
GY-53L1是-款低成本传感器模块。工作电压3-5v,功耗小,体积小,安装方便。
其工作原理如下: 此模块,有读取数据的方法,即 (TTL电平) ,串口波特率有,可配置,连续,询问输出两种方式,可掉电保存设置。模块还可以设置单独的传感器芯片工作模式, GY-53-L1X VL53L作为一个简单的传感器模块,MCU不参与数据处理。 模块增加了设置开关量输出模式,使用上位机设置后,
参数
名称 | 参数 |
---|---|
测量范围 | 5cm-4m |
相应频率 | 22ms(最高) |
工作电压 | 3-5V |
工作温度 | -20~80℃ |
传感器芯片 | VL53L1X |
引脚说明
引脚 | 功能 |
---|---|
Pin1 | VCC 电源 (3v-5v) |
Pin2 | GND 电源地 |
Pin3 | TX 串口USART_TX(TTL 电平) |
Pin4 | RX 串口USART_RX(TTL 电平) |
Pin5 | PWM / OUT 距离转换PWM 正式输出,或开关量输出 |
Pin6 | PS 串口/芯片IIC 模式转换(默认串口) |
Pin7 | XSHUT 芯片引脚 |
Pin8 | GPIO1 芯片引脚 |
Pin9 | SDA 芯片SDA |
Pin10 | SCL 芯片SCL |
Pin11 | GND 电源地 |
Pin12 | VCC 电源 (3v-5v) |
-
-
串口 UART 模式,Pin3 为TX, Pin4 为RX, TTL 电平,PWM 输出工作或开关量输出工作。
-
IIC 模式,用户可以自己操作芯片,模块自带MCU 芯片操作不正确,PWM 输出不工作。
-
通信协议
串口协议: 当 GY-53L1 模块硬件ps=1 时候使用
(1)串口通信参数
(默认波特率9600bps,可通过软件设置) 波特率:9600 bps 校验位:N 数据位:8 停止位:1 波特率:115200 bps 校验位:N 数据位:8 停止位:1
(2)模块输出格式
每帧包含8-13 个字节(十六进制):
字节 | 数值 | 功能 |
---|---|---|
Byte0 | 0x5A | 帧头标志 |
.Byte1 | 0x5A | 帧头标志 |
Byte2 | 0x15 | 本帧数据类型 |
Byte3 | 0x03 | 数据量 |
Byte4 | 0x00~0xFF | 数据前高8 位 |
Byte5 | 0x00~0xFF | 数据前低8 位 |
Byte6 | 0x00~0xFF | 模块测量模式 |
Byte7 | 0x00~0xFF | 验证和(前面的数据累加和,只留下8 位) |
- Byte6 含义说明
Byte6 | Byte6 | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | vit1 | bit0 |
---|---|---|---|---|---|---|---|---|---|
默认 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
- : 0:表示距离值可靠; 1:表示周围环境光的影响; 2.返回信号弱; 四:表示超过测量范围; 五、表示硬件故障; 7:表示周围环境有干扰噪声; 8:内部算法的溢出或溢出; 14:无效测量。
- : 0:55ms;1:110ms;(默认) 2:200ms; 3:300ms;
- : 1:短距离模式,测距量程为40~1300 mm, ± 25mm; 2:中距离模式,测距量程为40~3000 mm, ± 25mm;(默认) 3:长距离模式,测距量程为40~4000 mm, ± 25mm;
数据计算方法: 距离计算方法:Distance= (Byte4<<8) | Byte5 单位mm//数据高位左移八位|低八位 模块返回状态:RangeStatus= (Byte6>>4)&0x0f;(模块放回当前状态) 测量时间:Time=(Byte6>>2)&0x03; 测量模式:Mode=Byte6&0x03;
例:一帧数据
< 5A- 5A- 15- 03- 0A- 20- 06- FC >
Distance =(0x0A<<8)|0x20=2592 mm(距离值2.592 m)
RangeStatus=(0x06>>4)&0x0f=0;(距离值可靠)
Time=(0x06>>2)&0x0f=1; (测量时间为110ms)
Mode= 0x06&0x03=2; (测量模式为中距离模式,量程为50~4000mm)
(3)输入:命令字节,由外部控制器发送至GY-53L1 模块(十六进制)
普通串口命令指令:命令格式: ①输出模式设置指令: 0xA5+0x45+0xEA ---------------连续输出距离数据 0xA5+0x15+0xBA ---------------查询输出距离数据 ②保存配置指令: 0xA5+0x25+0xCA ---------------掉电保存当前配置;包括波特率(重新上电起效)、测量模 式、测量时间、输出模式设置 ③测量模式设置指令: 0xA5+0x51+0xF6 ---------------短距离测量模式 0xA5+0x52+0xF7 ---------------中距离测量模式(默认) 0xA5+0x53+0xF8 ---------------长距离测量模式 ④模块测量时间配置: 0xA5+0x61+0x06 ---------------测量时间110ms(默认) 0xA5+0x62+0x07 ---------------测量时间200ms 0xA5+0x63+0x08 ---------------测量时间300ms 0xA5+0x64+0x09 ---------------测量时间55ms ⑤波特率配置: 0xA5+0xAE+0x53 ---------------9600(默认) 0xA5+0xAF+0x54 ---------------115200
使用
该模块为串口和芯片 IIC 输出模块,模块默认为串口模式。 串口模式(默认):PS 引脚拉高,模块上电,默认配置为波特率9600、中距离测量、连续输出模式;使用该模块配套的上位机可方便的对模块进行相应的设置;上位机使用前请先选择好端口和波特率,然后再点击“打开串口”按钮,此时,上位机将显示对应的数据,点击“帮助”按钮,在上位机下方状态栏将显示具体按钮用法。
- 注意:
程序
- memcpy指的是c和c++使用的内存拷贝函数,memcpy函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中。
串口中断服务函数|接收正确数据包
void USART1_IRQHandler(void)
{
static uint8_t i=0,rebuf[20]={
0};
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//判断接收标志
{
rebuf[i++]=USART_ReceiveData(USART1);//读取串口数据,同时清接收标志
if (rebuf[0]!=0x5a)//帧头不对
i=0;
if ((i==2)&&(rebuf[1]!=0x5a))//帧头不对
i=0;
if(i>3)//i等于4时,已经接收到【数据量字节rebuf[3]=0x03】
{
if(i!=(rebuf[3]+5))//判断是否接收一帧数据完毕
return;
switch(rebuf[2])//接收完毕后处理【本帧数据类型 Byte2= 0x15】
{
case 0x15:
if(!Receive_ok)//当数据处理完成后才接收新的数据
{
memcpy(re_Buf_Data,rebuf,8);//拷贝接收到的数据
Receive_ok=1;//接收完成标志
}
break;
}
i=0;//缓存清0
}
}
}
数据处理函数
if(Receive_ok)//串口接收完毕
{
for(sum=0,i=0;i<(re_Buf_Data[3]+4);i++)//rgb_data[3]=3
sum+=re_Buf_Data[i];
if(sum==re_Buf_Data[i])//校验和判断
{
distance=re_Buf_Data[4]<<8|re_Buf_Data[5];
RangeStatus=(re_Buf_Data[6]>>4)&0x0f;
Time=(re_Buf_Data[6]>>2)&0x03;
Mode=re_Buf_Data[6]&0x03;
send_3out(&re_Buf_Data[4],3,0x15);//上传给上位机
}
Receive_ok=0;//处理数据完毕标志
}
发送命令字节函数
void send_com(u8 data)
{
u8 bytes[3]={
0};
bytes[0]=0xa5;
bytes[1]=data;//功能字节
USART_Send(bytes,3);//发送帧头、功能字节、校验和
}
//发送多字节数据+校验和
void USART_Send(uint8_t *Buffer, uint8_t Length)
{
uint8_t i=0;
while(i<Length)
{
if(i<(Length-1))
Buffer[Length-1]+=Buffer[i];//累加Length-1前的数据
USART1_send_byte(Buffer[i++]);
}
}