STM32 HAL庫快速實戰【十一】《紅外傳感器的使用及巡線循跡》--基於黑龍江科技大學機電工業機器人實訓


系列目錄

點擊查看

模塊介紹

image

TCRT5000光電傳感器模塊是基於TCRT5000紅外光電傳感器設計的一款紅外反射式光電開關。傳感器采用高發射功率紅外光電二極管和高靈敏度光電晶體管組成,輸出信號經施密特電路整形,穩定可靠。
傳感器的紅外發射二極管不斷發射紅外線,當發射出的紅外線沒有被反射回來或被反射回來但強度不夠大時,光敏三極管一直處於關斷狀態,此時模塊輸出端(引腳1)為低電平,指示二極管一直處於熄滅狀態;被檢測物體出現在檢測范圍內時,紅外線被反射回來且強度足夠大,光敏三極管飽和,此時模塊的輸出端為高電平,指示二極管被點亮
————————————————
版權聲明:本文為CSDN博主「小劉和C/C++」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/wlswls1711/article/details/103113626

當檢測到黑線時,D1 D2輸出高電平,否則輸出低電平。通過讀取電平值,即可知道當前狀態。

接線

通過PH2.0接口接到SA4,SD4接口上。
image
D1對應了PB1,D2對應了PA3。

CubeMX配置

復制上一節工程。添加PA3,PB1為GPIO_Input,浮空,標簽設置為D2,D1。

點擊查看配置圖片

image

編寫代碼

打開sensor.h
添加循跡狀態定義和GPIO讀取值定義,循跡任務聲明

#define D1() HAL_GPIO_ReadPin(D1_GPIO_Port,D1_Pin)
#define D2() HAL_GPIO_ReadPin(D2_GPIO_Port,D2_Pin)
#define XJ_ON 0
#define XJ_OFF 1
int xunji_task(void);

然后打開sensor.c,編寫循跡代碼
對於簡單的巡線,當機器人在線上時,兩路紅外返回值都為0,機器人直線前進;
當需要左拐時,右邊紅外會越界,也就是檢測不到黑線,所以返回值為1,此時調整機器人轉向直至右邊紅外入界,繼續直線前進。
當需要右拐時,左邊紅外會越界,也就是檢測不到黑線,所以返回值為1,此時調整機器人轉向直至右邊紅外入界,繼續直線前進。
當兩邊都檢測不到黑線時,要么巡線結束,要么機器人完全出界。對於第一種情況,應該使機器人完全停下。對於第二種情況,不允許出現。解決這種情況可以有多種調節方法:

  1. 提高檢測時間分辨率,即減少檢測間隔,在檢測到越界后立馬轉向
  2. 提高轉向速度,避免轉向太慢導致的出界
  3. 原地旋轉替換差速前進,轉到黑線上后在繼續前進
  4. 出界后,編寫算法,根據前后狀態,自動嘗試返回黑線上

有了基本邏輯,我們很容易就能編寫出代碼。
代碼如下

int xunji_task(void) {
	static uint32_t systick_ms_bak = 0;
	int speed = 500;
	int millis=HAL_GetTick();//獲取系統時間
	if(millis - systick_ms_bak < 50) return 1; //檢測間隔,在這里修改分辨率
	systick_ms_bak = HAL_GetTick();
	
	if((D2() == XJ_OFF) && (D1() == XJ_ON)) { //D2出界,需要左轉
		motor_set(-speed-300, speed+300); //原地左轉,在這里修改轉向速度
	} else if((D2() == XJ_ON) && (D1() == XJ_ON)) {//直線行駛
		motor_set(speed, speed);
	} else if((D2() == XJ_ON) && (D1() == XJ_OFF)) {//D1出界,需要右轉		
		motor_set(speed+300,-speed-300); //原地右轉,在這里修改轉向速度
	} else if((D2() == XJ_OFF) && (D1() == XJ_OFF)){//出界或者結束
		motor_set(0,0);//這里只寫了結束的代碼,如果誤判出界,修改時間和速度基本能解決
		return 0;
	}
	return 1;
}

然后再main中添加對應任務

case 'J':while(xunji_task());break;

燒錄后如果出現初始原地打轉的情況,則可能是DJ1和DJ2對應關系反了,
修改下

#define D1() HAL_GPIO_ReadPin(D1_GPIO_Port,D1_Pin)
#define D2() HAL_GPIO_ReadPin(D2_GPIO_Port,D2_Pin)

#define D2() HAL_GPIO_ReadPin(D1_GPIO_Port,D1_Pin)
#define D1() HAL_GPIO_ReadPin(D2_GPIO_Port,D2_Pin)

或者反裝循跡模塊
或者修改控制邏輯

工程源碼

國內用戶請使用gitee克隆或是使用代理訪問Github
https://github.com/USTHzhanglu/stm32-hal/tree/main/trct5000


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM