循跡避障車教程需要材料:直流電機4只 小車底盤2個
車輪4個
超聲波模塊1個
紅外探測模塊2個
L298N電機驅動模塊1個
杜邦線若干
1.5V電池8節(12V電源)
萬能板一個
Arduino開發板一個
M3螺絲螺母若干
原理講解1.小車前進后退轉彎原理其輸入輸出對應真值表如下(以LN1,LN2,OUT1,OUT2為例):
模塊中ENA,ENB分別為兩個電機的調速口,在Arduino中接PWM數字口,利用PWM調節速度(如果不需要此功能直接接到5V電源)。 試驗中,我將左側兩個電機并聯到OUT1,OUT2口,右側兩個電機并聯到OUT3,OUT4口。以一個方向為參考方向(即正向),電機極性一定要清楚,OUT1,OUT3接正向,OUT2,OUT4接反向。下面是電機輸出結果表
2.循跡原理 其工作方式是白色紅外發光管發射紅外光,經過反射被黑色接收管接收,接收到了返回高電平,否則低電平。原理:
由于黑色具有吸收光線的作用,當小車到達黑色部分時,其發射光被吸收,返回低電平,達到檢測路徑的功能。
此時,小車的位置相對于軌跡來說,偏右,我們應該左轉矯正位置。同理,偏左應該右轉
當兩面探頭都不在,或都在軌跡上,那么前進。
3.超聲波避障原理知識1 超聲波
超聲波是一種頻率高于20000赫茲的聲波,它的方向性好,穿透能力強,易于獲得較集中的聲能,可以在介質中傳播,可用于測距、測速、清洗、焊接、碎石、殺菌消毒等。在醫學、軍事、工業、農業上有很多的應用。超聲波因其頻率下限大于人的聽覺上限而得名。超聲波在空氣中傳播速度約340米/秒,隨著溫度的變化,傳播速度有所變化。
知識2 超聲波測速原理
超聲波測速是利用超聲波發射管發射超聲波同時開始計時,收到發射回波后產生一個信號,將發射和接收到回波的時間乘以超聲波在介質中的傳播速度除以2就是超聲波發射到物體的距離。利用超聲波模塊完成測速。
2.1 HC-SR04超聲模塊
HC-SR04有單片機STC11、升壓ICMAX232及運算放大器TL074構成,HC-SR04超聲波測距模塊可提供2cm-400cm的非接觸式距離感測功能,測距精度可高達3mm;模塊包括超聲波發射器、接收器與控制器。超聲波測速儀每隔一相等時間,發出一超聲脈沖信號,每隔一段時間接收到物體反射回的該超聲脈沖信號,根據發出和接收到的信號間的時間間隔差和聲速,測出被測物體的距離。
基本工作原理:
采用IO口TGIG觸發測距,給至少10us的高電平信號;
模塊自動發送8個40KHz的方波,自動檢測是否有信號返回;
有信號返回,通過IO口ECHO輸出一個高電平,高電平持續的時間就是超聲波從發射到返回的時間。測試距離=(高電平時間*聲速(340m/s))/2.
參數的設置
時序圖的說明
以上時序圖表明你在只需要提供一個10us以上脈沖觸發信號,該模塊內部將發出8個40KHz周期電平并檢測回波。一旦檢測到有回波信號則輸出回響信號。回響信號的脈沖寬度與所測的距離成正比。由此通過發射信號到收到的回響信號時間間隔可以計算得到距離。公式:us/58=厘米;或是:距離=高電平時間*聲速(340m/s)/2;建議測量周期為60ms以上,以防止發射信號對回響信號的影響。
注:1、此模塊不宜帶電連接,若要帶電連接,則先讓模塊的GND端先連接,否則會影響模塊的正常工作。
2、測距時,被測物體的面積不少于0.5平方米且平面盡量要求平整,否則影響測量的結果。
1.3原理圖及模塊實物
單片機超聲模塊說明(HC-SR04)
避障原理:利用測車子正前方障礙的距離,設定一個值,當距離小于這個值時,車子后退,或者轉彎。具體程序代碼
int IN1=7;
int IN2=8;
const int TrigPin = 13;
const int EchoPin = 12;
int ENA=5;//左直流電機
int IN3=9;
int IN4=10;
int ENB=6;//右直流電機
int IR_right=2;//定義右紅外傳感器引腳
int IR_left=3;//定義左紅外傳感器引腳
int IR_middle_1=A2;
int IR_middle_2=A3;//定義中間紅外傳感器引腳
int c;//用于保存超聲波測出的距離
void forward()//前進
{
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(ENA,45);
digitalWrite(IN4,LOW);
digitalWrite(IN3,HIGH);
analogWrite(ENB,45);
}
void backward()//后退
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
analogWrite(ENA,100);
digitalWrite(IN4,HIGH);
digitalWrite(IN3,LOW);
analogWrite(ENB,100);
}
void left()//左轉
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
analogWrite(ENA,100);
digitalWrite(IN4,LOW);
digitalWrite(IN3,HIGH);
analogWrite(ENB,100);
}
void right()//右轉
{
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(ENA,100);
digitalWrite(35,HIGH);
digitalWrite(36,LOW);
analogWrite(ENB,100);
}
void stopp()//停止
{
digitalWrite(IN1,HIGH);
digitalWrite(IN2,HIGH);
digitalWrite(IN3,HIGH);
digitalWrite(IN4,HIGH);
analogWrite(ENA,100);
analogWrite(ENB,100);
}
void setup() {
Serial.begin(9600);
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
pinMode(ENA,OUTPUT);
pinMode(ENB,OUTPUT);
stopp();
pinMode(IR_right,INPUT);
pinMode(IR_left,INPUT);
pinMode(IR_middle_1,INPUT);
pinMode(IR_middle_2,INPUT);
}
void loop(){
digitalWrite(TrigPin, LOW); //低高低電平發一個短時間脈沖去TrigPin
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
delay(20); //消除信號干擾
c = pulseIn(EchoPin, HIGH) / 58.0; //將回波時間換算成cm
c = (int(c * 100.0)) / 100.0; //保留兩位小數
/*如果前方距離小于二十厘米,即前方有障礙,
* 那么后退一步,轉個方向
*/
if(c<20){
backward();
delay(100);//自己去調試距離,下同
right();
delay(100);
}
int Right=digitalRead(IR_right);
int Left=digitalRead(IR_left);
//如果中間為高電平,左、右為低電平
//說明小車沒有偏離軌道
if((Middle_1==HIGH || Middle_2==HIGH)&&( Right==LOW && Left==LOW)){
forward();
}
//如果右邊為高電平,中間、左為低電平
//說明小車偏右
else if((Middle_1==LOW && Middle_2==LOW) && Right==HIGH && Left==LOW){
right();//小車左轉
}
//如果左邊為高電平,中間、右為低電平
//說明小車偏左
else if((Middle_1==LOW && Middle_2==LOW) &&Right==LOW && Left==HIGH){
left();//小車右轉
}
//小車的3紅外傳感器距離可能導致3傳感器都為低電平或者沒檢測到黑線3傳感器都為高電平
//小車默認前進
else{
forward();
}
}
|