目錄:
概述
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++]);
}
}