目录:
概述
GY-53L1是-款低成本数字红外测距传感器模块。工作电压3-5v,功耗小,体积小,安装方便。
其工作原理是:红外LED发光,照射到被测物体后,返回光经过MCU接收,MCU计算出时间差,得到距离直接输出距离值。
此模块,有两种方式读取数据,即串口UART (TTL电平) +PWM (开关量)或者芯片IIC模式,串口的波特率有9600bps与115200bps,可配置,有连续,询问输出两种方式,可掉电保存设置。模块另外可以设置单独传感器芯片工作模式, GY-53-L1X VL53L1作为简单传感器模块,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) |
-
注意:PS 硬件选择模块工作模式
-
ps=1(默认高电平) 串口 UART 模式,Pin3 为TX, Pin4 为RX, TTL 电平,PWM 输出工作或者开关量输出工作。
-
ps=0(接GND 时) 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 |
- bit7~bit4:
模块返回的当前状态。值:0~14。
0:表示距离值可靠;
1:表示周围环境光影响;
2:表示返回的信号弱;
4:表示超出测量量程;
5:表示硬件故障;
7:表示周围环境有干扰噪声;
8:内部算法的溢出或溢出;
14:无效测量。 - bit3~bit2 :
表示模块测量时间,该值越大,测距效果越好。
0:55ms;
1:110ms;(默认)
2:200ms;
3:300ms; - bit1~bit0:
表示测量模式,该值越小,抗周围环境干扰越好。
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+command+sum【帧头+功能字节+校验和】
①输出模式设置指令:
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、中距离测量、连续输出模式;使用该模块配套的上位机可方便的对模块进行相应的设置;上位机使用前请先选择好端口和波特率,然后再点击“打开串口”按钮,此时,上位机将显示对应的数据,点击“帮助”按钮,在上位机下方状态栏将显示具体按钮用法。
- 注意:对模块进行查询模式时,发送的指令的周期需大于模块当前测量时间。如当前模块测量时间为110ms,则查询指令的周期需大于110ms。
程序
- 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++]);
}
}