|
本帖最后由 墨染宸星 于 2019-12-2 12:41 編輯
最近STM32剛剛?cè)腴T,用ZET6和超聲波模塊做了一個避障小車,希望對初學者能有幫助;
大體思路如下:
利用定時器判斷超聲波的發(fā)出到接收的時間,然后通過公式計算得到距離,再在主函數(shù)里進行數(shù)據(jù)分析,控制電機進行轉(zhuǎn)彎,實現(xiàn)避障的功能。
也可以再加上屏幕,用來顯示測得的距離。
這里我們用的是HC-SR04模塊,此模塊性能穩(wěn)定,測度距離精確,模塊高精度,盲區(qū)小。采用IO口TRIG觸發(fā)測距,給至少10us的高電平信號;模塊自動發(fā)送8個40khz的方波,自動檢測是否有信號返回;有信號返回,通過IO口ECHO輸出一個高電平,高電平持續(xù)的時間就是超聲波從發(fā)射到返回的時間。測試距離=(高電平時間*聲速(340M/S))/2;本模塊使用方法簡單,一個控制口發(fā)一個10US以上的高電平,就可以在接收口等待高電平輸出。一有輸出就可以開定時器計時,當此口變?yōu)榈碗娖綍r就可以讀定時器的值,此時就為此次測距的時間,方可算出距離。如此不斷的周期測,即可以達到你移動測量的值
小車設計思路:
3個超聲波分別安裝在正前方左邊和右邊各一個,具體情況見下圖:
在主函數(shù)里調(diào)用測距函數(shù),分別計算出障礙物離小車前方、左邊、右邊的距離lenth1、lenth2、lenth3,如果前方距離大于20cm并且左邊和右邊的距離大于10厘米則前進(GO)負責判斷左邊和右邊的距離。如果左邊距離小于10cm(lenth2<10),則右轉(zhuǎn)(YOU)。如果右邊的距離小于10cm(lenth3<10),則左轉(zhuǎn)(ZUO)。其它情況下則是:后退——>延時500ms——>左拐——>延時200ms。值得注意的是:小車在超聲波測距時要保證小車處于靜止狀態(tài)為了避免小車在測距時小車依舊在運動從而增加誤差。同時利用PWM調(diào)速盡量讓小車速度慢下來,來減小誤差
主要代碼如下
#include <hcsr04.h>
#include <motor.h>
#include <delay.h>
#include <stm32f10x.h>
#include <usart.h>
#include <key.h>
#include <lcd.h>
void Car_Turn(float length1,float length2);
int main()
{
delay_init();//延時初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
MotorDriver_Init();//電機初始化
uart_init(9600);
KEY_Init();
LCD_Init();
HC_SR04_1_Init();
POINT_COLOR=RED;//設置字體為紅色
LCD_ShowString(10,70,200,16,16,"Please press wake_up to");
LCD_ShowString(10,90,200,16,16,"start the little car");
while(KEY_Scan(0) != WKUP_PRES);
LCD_Clear(WHITE);
LCD_ShowString(60,70,200,16,16,"IS WORKING...");
//TIM3_Int_Init(1999,7199);
while(1)
{
float length1 = Senor_Using_1();//超聲波模塊測的距離
float length2 = Senor_Using_2();
Car_Turn(length1,length2);
//printf("\n\t%f\t\n",length1);
//printf("\n\t%f\t\n",length2);
//LCD_ShowString(60,70,200,16,16,"distance: cm");
//LCD_ShowNum(80,70,length1,16,16);
if(KEY_Scan(0) == KEY0_PRES)
{
MotorDriver_L_Turn_Stop();
MotorDriver_R_Turn_Stop();
break;
}
delay_ms(50);
}
}
void Car_Turn(float length1,float length2)
{
if(length1 > 30&&length2 > 30)//前進
{
MotorDriver_L_Turn_Forward();
MotorDriver_R_Turn_Forward();
}else if(length1 <= 30&&length2 > 30)//右轉(zhuǎn)
{
MotorDriver_L_Turn_Forward();
MotorDriver_R_Turn_Reverse();
}
else if(length1 > 30&&length2 <= 30)//左轉(zhuǎn)
{
MotorDriver_R_Turn_Forward();
MotorDriver_L_Turn_Reverse();
}
else if(length1 <= 30&&length2 <= 30)//后退+左轉(zhuǎn)
{
MotorDriver_R_Turn_Reverse();
MotorDriver_L_Turn_Reverse();
delay_ms(150);
MotorDriver_R_Turn_Forward();
MotorDriver_L_Turn_Reverse();
delay_ms(150);
}
}
|
-
-
-
避障小車.7z
2019-11-26 14:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
229.61 KB, 下載次數(shù): 81, 下載積分: 黑幣 -5
評分
-
查看全部評分
|