基于 STM32 的自動泊車系統 -智能小車 - 物聯網單片機(含代碼)
大家好,今天給大家介紹基于 STM32 的自動泊車系統
1 背景
目前我們所能見到的汽車企業大多數都控制在 L2 級半自動駕駛, 其中包括半自動泊車系統: 傳感器技術的組成配合下收集精確的環境信息實現“泊車路徑規劃” 、 系統進行“車輛控制” 等功能, 在部分自動泊車(高級泊車輔助 APA)系統的輔助下駕駛員可以在監控下實現泊車動作。 現實中, 車輛激增帶來的停車問題變得更加復雜, 大城市停車空間有限, 將汽車駛入各式各樣的停車位置是每個駕駛員一項必備的技能。
與之相隨而來的交通壓力、 復雜多樣的停車環境、 有限苛刻的停車空間, 停車難成為眾多駕駛員的一大難題。 泊車過程中出現的輕微碰撞以及剮蹭事件的頻繁發生, 市場需求的增長, 環境檢測基礎的相對成熟, 推進了自動泊車系統研究的技術發展。
2 設計概要
自動泊車系統(Automated Parking System,簡稱 APS)是一項屬于無人駕駛的重要技術,隨著車輛的激增, 汽車自動駕駛技術的不斷創新與發展, 自動泊車系統尚未普及, 為降低當下人工停車的難度, 設計了一種基于 STM32F103ZET6 實現自動倒車入庫和側方位停車的智能化小車系統。
該自動泊車系統利用紅外光感 HJ-IR2 傳感器、 超聲波 HC-SR04 模塊、 循跡 TCRT5000模塊、 標準的 IEEE 802.11nd 的 WIFI 模塊組成進行環境檢測, 實現了障礙物識別, 并將采集到的數據傳送到處理器, 處理器將數據轉換為電信號驅動小車的控制 L298N 驅動模塊, 這些模塊在 Keil uVsion5 編譯環境下整合到一起, 在路徑規劃下對小車進行速度控制和轉向控制。
系統根據停車位識別在模擬停車環境下控制小車進行入庫操作, 滿足了在不同的停車環境下進行智能化自動泊車, 此系統屬于嵌入式系統兼容于多數汽車實現側方位泊車和倒車入庫并自行細微調整, 實現更穩定的入庫停車。
3 硬件選型
3.1 主控 -STM32
意法半導體公司中的 STM32 系列芯片
3.2電機驅動
為了更真實模擬汽車運作狀態, 本設計安裝了四個電機, 如下圖所示。 本設計通過 PWM 占空比來調節直流電機的轉速, 并通過控制前后輪的不同速度完成小車的轉向。
電機用到了主控板的 8 個 IO 口, 通過對電機的高低電平控制使之正反轉, 電機分有正負極, 前進時: 先將正極的電平置 1, 負極復位 0; 后退則正極復位 0, 負極置 1; 停止則都復位 0。
電機與芯片管腳配置表
小車由于左右兩邊各用一個驅動, 所以 A 和 C 兩個電機只需要 C 電機控制, B 和 D電機只需 B 控制, 這里將 D 電機控制腳當電機使能: 將 DUP 和 DDOWN 的電平置 1。
3.3紅外遙控設計
學長設計的系統采用紅外遙控來實現對小車的初步控制, 紅外線遙控是目前使用最廣泛的一種通信和遙控手段, 具有體積小、 功耗低、 功能強、 成本低的優點。 通用紅外遙控系統由發射和接收兩大部分組成, 應用編/解碼專用集成電路芯片來進行控制操作, 發射部分包括鍵盤、 編碼調制、 LED、 紅外發送器; 接收部分包括光、 電轉換放大器、 解調、 解碼電路。
紅外遙控器
紅外接收及解碼
相關技術原理:
- 引導碼: MCU 檢測到正確的引導碼之后確認接收后面的數據, 以此來保證數據的穩定性和正確性,
- 客戶碼: 區分不同紅外遙控設備
- 操作碼: 客戶操作時產生的編碼, 通過操作的不同產生不同的碼值, 等待紅外接收頭接收。
- 解碼: 芯片通過接收到的電平信號, 解析操作碼的碼值, MCU 在根據碼值做出相應動作。
根據遙控器提供的鍵碼, 優先滿足小車的基本運動, 前進、 后退、 左轉、 右轉、 以及停止, 設計算法, 短按則為 200MS 運作, 長按則持續運行。 預留其他按鈕進入自動駕駛狀態, 即: 循跡模式、 避障模式、 超聲波模式、 攝像頭模式、 側方位自動泊車, 倒車入庫自動泊車等。
3.4 傳感器部分
3.4.1 循跡模塊
遵循既有的道路現狀, 給定小車相關的循跡算法, 基于一個三路循跡和兩個二路循跡的循跡模塊, 使得小車自動行駛在路勁規劃下, 稱為循跡技術。
3.4.2 紅外避障模塊
紅外光電傳感器(HJ-IR2), 發射出探測的脈沖, 當在一定距離中探測到物體會重新輸入到 MCU 中進行處理, 它相當于一個紅外開關, 檢測到障礙物輸出低電平, 未檢測到則反之。 在得知在停車過程中遇到的障礙物可以依據此對小車進行控制避免碰撞, 此為避障功能。
接收管接收到信號之后, 經集成電路進行放大, 會點亮模塊的 LED 燈管, 并同時輸出給 MCU 一個低電平信號。
3.4.3 超聲波模塊
HC-SR04 超聲波測距可提供 2cm-40cm 的非接觸式距離感測功能測距精度可達高到3mm; 模塊包括超聲波發射器、 接收器與控制電路。 本設計利用超聲波傳感器來達到對自動泊車中精細調整。
小車在進入自動泊車模式后, 環境檢測部分會通過超聲波收集左右部掐障礙物的具體位置, 在側方位泊車中可以利用檢測前后車輛的停車距離,倒車入庫泊車中可以檢測左右車輛的精準距離, 實現更完美的泊車路徑規劃。 超聲波模塊如圖
3.4.4 WIFI 視頻模塊
設計模擬倒車途中的后視攝像頭, 將倒車時的情景展示在與上位機的屏幕當中,模擬出更真實的停車環境, 實時監控倒車時的情況, 并通過 WIFI 模塊, 在上位機編寫好指定代碼傳送給小車上的 WIFI 模塊, WIFI 模塊中的芯片進行解碼并發送電信號給 MCU進行控制, MCU 根據 WIFI 模塊中的信號對小車進行控制。
PC控制軟件
軟件中的界面基本滿足對小車的基本控制, 附帶有打開攝像頭的指令, 在設置中也可以按照需求編寫新指令發送給主控芯片。 操作界面如下圖所示
這里的設計需要注意, 同時開啟數據的收發, 根據收到的 WIFI 信號進行判斷, 串口 WIFI 解碼代碼如下:
unsigned char rec_data; if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART3, USART_IT_RXNE); /* Read one byte from the receive data register */ rec_data = USART_ReceiveData(USART3); if(start!=0&&rec_data!=0xff) //如果已收到包頭并且當前收到的不是包尾 {
buf[start-1]=rec_data; //緩存數據 start++;
} else if(start!=0&&rec_data==0xff)//如果收到包尾 {
mode[0]=buf[0]; //給狀態存儲數組賦值 mode[1]=buf[1];
mode[2]=buf[2];
start=0;
mode1=1; //指示主函數循環檢測一次 } else if(rec_data==0xff&&start==0) //如果收到的是包頭 start++;
}
4 小車成品展示
攝像頭則安裝在車尾處, 可以觀察倒車時后視的環境, 也適用于作為圖像處理的后續功能推進, WIFI 模塊在開發板的下方, 不影響信號的前提下也得到了合理的空間放置。
5 泊車算法設計
常見的泊車方式有: 側方位泊車和倒車入庫泊車, 本設計根據兩種泊車方式設計了不同的算法。
5.1 側方位泊車
側方位停車位的設置主要是為了道路的寬度而設置, 機動車駕駛證考試中的科目二就有一項側方位停車法。 本設計由科目二駕駛中的側方停車為標準, 側方位泊車如圖所示。
根據停車的不同場景, 本設計通過收集的環境信息進行了不同的處理, 并作出不同的控制電信號。
如果未掃描到障礙物和相鄰小車, 系統主要通過循跡模塊對停車線反射的強度不同來定位停車位的具體位置。 具體算法邏輯如流程圖所示:
算法步驟:
- 1、 按下遙控器按鈕平行泊車模式, 開始檢測周圍環境信息, 如果超聲波反射回來的距離小于 10CM 則判斷為障礙物, 大于 10CM 則判斷為無障礙物。
- 2、 減速后退直到超聲波判斷距離大于 10CM 且紅外避障無感應。
- 3、 紅外避障有感應則繼續后退, 重復(1)(2)步驟。
- 4、 左循跡模塊感應到停車線, 系統收集到此時車輛左轉角度, 然后繼續左轉。
- 5、 右循跡模塊感應到停車線, 系統收集到此時車輛位置信息, 由于小車左轉角度還不足, 系統此時再給予一個 200MS 的左轉信號。
- 6、 車輛左轉角度已經足夠, 停車時的車輛速度不能過快, 修改高電平的占比, 降低速度, 給出一個持續前進的電信號
- 7、 中循跡模塊感應到邊緣停車線, 小車停止。
- 8、 開始擺正車身, 根據左轉的角度, 給出相同延時右轉信號擺正車身
- 9、 右轉進行時, 對中循跡模塊進行判定, 如果收集到電信號, 對小車進行后退調整,然后完成整個系統泊車操作。
關鍵代碼
if(LL_DATA == BLACK_AREA) { CarStop(); delay_ms(18000); auto_flag = 1; } CarRight(); } else if (auto_flag == 1) { if(RR_DATA == BLACK_AREA) { CarStop(); delay_ms(18000); CarRight(); delay_ms(6000); CarStop(); delay_ms(18000); auto_flag = 2; } CarRight(); } else if(auto_flag == 2) { SPEED_DUTY = 10; if(SEARCH_M_DATA == BLACK_AREA) { CarStop(); delay_ms(18000); CarBack(); delay_ms(6000); back_time = 0; back_flag = 0; auto_flag = 3; } CarGo(); } else if(auto_flag == 3) { SPEED_DUTY = 30; if(back_time <= 600) { CarLeft(); if(SEARCH_M_DATA == BLACK_AREA) { back_flag = 1; } if(back_time == 599)auto_flag = 4; } } else if (auto_flag == 4) { if(back_flag == 0)sensor_flag = 0; else if(back_flag == 1) { SPEED_DUTY = 20; CarBack(); delay_ms(4000); CarStop(); sensor_flag = 0; } }
5.2 倒車入庫
倒車入庫是多數停車場中的停車建設, 停停車場都有較為規范的停車線規劃和停車建設, 對于線條的感應也更容易, 倒車入庫示意圖如圖所示:
算法設計
算法流程:
- 1、 按下遙控器按鈕垂直泊車模式, 開始檢測周圍環境信息, 如果超聲波反射回來的距離小于 10CM 則判斷為障礙物, 大于 10CM 則判斷為無障礙物。
- 2、 減速后退直到超聲波判斷距離大于 10CM, 且紅外避障未感應到障礙物, 開始左轉
- 3、 左循跡模塊感應到停車線, 系統收集到此時車輛左轉角度, 然后繼續左轉
- 4、 右循跡模塊感應到停車線, 系統收集到此時車輛位置信息,
- 5、 車輛左轉角度已經足夠,調整車身, 左轉至車身垂直。
- 6、 根據車身調整位置, 三路循跡在同一條直線上, 給出前進信號。
- 7、 倒車入庫完成。
void AUTO_Vertical(void) { if (auto_flag == 0 ) { if(obstacle_flag == 0) { if(distance_cm < 15 ) { SPEED_DUTY = 10; CarGo(); return; } else if(distance_cm >= 15 ) { CarStop(); obstacle_flag = 1; } } if( obstacle_flag == 1) { SPEED_DUTY = 30; CarRight(); if(LL_DATA == BLACK_AREA) { CarStop(); delay_ms(18000); auto_flag = 1; } } } else if (auto_flag == 1) { if(SEARCH_L_DATA == BLACK_AREA) { CarStop(); delay_ms(18000); auto_flag = 2; } CarRight(); } else if(auto_flag == 2) { SPEED_DUTY = 10; CarGo(); if(SEARCH_M_DATA == BLACK_AREA) { CarStop(); delay_ms(18000); CarBack(); delay_ms(8000); auto_flag = 3; back_time = 0; } } else if(auto_flag == 3) { SPEED_DUTY = 30; if(back_time >= 12)auto_flag = 4; if(back_time <= 14) { CarRight(); } } else if(auto_flag == 4) { if(SEARCH_M_DATA == BLACK_AREA) { CarStop(); delay_ms(18000); CarBack(); delay_ms(6000); sensor_flag = 0; } SPEED_DUTY = 10; CarGo(); } }
6 測試效果
優先模擬的周圍無障礙物的情形, 會通過判斷停車線然后根據算法步驟將車停進去車位。 經過多次測試, 小車多次穩定的停入車位, 但若控制者將車駛在與停車位平行的位置, 會導致停車緩慢且容易出錯, 車位可供停車的范圍需對小車的位置有限制。 運行完側方位泊車之后小車的位置如圖
- 贊