【學習筆記】GY-53L1x激光測距傳感器模塊入門資料

概述

在這裏插入圖片描述
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++]);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章