避障機器人是一種智能設備,它可以自動感知前方障礙物,并通過轉(zhuǎn)向另一個方向來避開它們。這種設計允許機器人通過避免碰撞在未知環(huán)境中導航,這是任何自主移動機器人的主要要求。避障機器人的應用范圍不受限制,現(xiàn)在大多數(shù)軍事組織都在使用它,這有助于執(zhí)行許多士兵無法完成的危險工作。
這次我們將使用超聲波傳感器和 Arduino 構建一個避障機器人。這里使用超聲波傳感器通過計算機器人與障礙物之間的距離來感知路徑中的障礙物。如果機器人發(fā)現(xiàn)任何障礙物,它會改變方向并繼續(xù)移動。
如何使用超聲波傳感器構建避障機器人
在構建機器人之前,了解超聲波傳感器的工作原理非常重要,因為該傳感器將在檢測障礙物方面發(fā)揮重要作用。超聲波傳感器工作的基本原理是記下傳感器發(fā)射超聲波束和撞擊表面后接收超聲波束所花費的時間。然后進一步使用公式計算距離。在這個項目中,使用了廣泛使用的HC-SR04 超聲波傳感器。
因此,HC-SR04 的 Trig 引腳被設為高電平至少 10 us。一個聲束以 8 個 40KHz 的脈沖傳輸。
信號然后撞擊表面并返回并由 HC-SR04 的接收器 Echo 引腳捕獲。Echo 引腳在發(fā)送高電平時已經(jīng)變?yōu)楦唠娖健?/p>
光束返回所需的時間保存在變量中,并使用如下適當?shù)挠嬎戕D(zhuǎn)換為距離
距離 = (時間 x 空氣中的聲速 (343 m/s))/2
這個避障機器人的組件很容易找到。為了制作底盤,可以使用任何玩具底盤,也可以定制。
所需組件
Arduino NANO 或 Uno(任何版本)
HC-SR04 超聲波傳感器
LM298N 電機驅(qū)動模塊
5V直流電機
電池
輪子
機殼
跳線
電路原理圖
該項目的完整電路圖如下所示,您可以看到它使用了 Arduino nano。但是我們也可以使用具有相同電路(遵循相同引腳)和代碼的 Arduino UNO 構建一個避障機器人。
一旦電路準備好,我們必須通過將電路組裝在機器人底盤頂部來構建我們的避障車,如下所示。
使用 Arduino 的避障機器人 - 代碼
該項目的最后給出了帶有演示視頻的完整程序。該程序?qū)ㄔO置 HC-SR04 模塊并將信號輸出到電機引腳以相應地移動電機方向。此項目中不會使用任何庫。
首先在程序中定義HC-SR04的觸發(fā)和回波引腳。在這個項目中,觸發(fā)引腳連接到 GPIO9,回聲引腳連接到 Arduino NANO 的 GPIO10。
?
int trigPin = 9; // HC-SR04 的觸發(fā)引腳 int echoPin = 10; // HC-SR04的回聲引腳
?
定義 LM298N 電機驅(qū)動模塊的輸入引腳。LM298N 有 4 個數(shù)據(jù)輸入引腳,用于控制與其連接的電機的方向。
?
int revleft4 = 4; //左電機反向運動 int fwdleft5 = 5; //左電機的ForWarD運動 int revright6 = 6; //右電機反向運動 int fwdright7 = 7; //右電機ForWarD運動
?
在setup()函數(shù)中,定義使用的 GPIO 引腳的數(shù)據(jù)方向。四個 Motor 引腳和 Trig 引腳設置為 OUTPUT,Echo 引腳設置為 Input。
?
pinMode(revleft4,輸出);// 將電機引腳設置為輸出 pinMode(fwdleft5, OUTPUT); pinMode(revright6,輸出); pinMode(fwdright7,輸出); pinMode(trigPin,輸出);// 將觸發(fā)引腳設置為輸出 pinMode(echoPin, INPUT); //將回波引腳設置為輸入以捕獲反射波
?
在loop()函數(shù)中,獲取到 HC-SR04的距離并根據(jù)距離移動電機方向。距離將顯示機器人前方的物體距離。距離是通過將一束超聲波發(fā)射到 10 微秒并在 10 微秒后接收它來獲取的。
?
數(shù)字寫入(trigPin,低); 延遲微秒(2); digitalWrite(trigPin, HIGH); // 發(fā)送波形 10 us delayMicroseconds(10); 持續(xù)時間=脈沖輸入(回聲針,高);// 接收反射波 距離 = 持續(xù)時間 / 58.2; // 轉(zhuǎn)換為距離 延遲(10);
?
如果距離大于定義的距離,則表示其路徑中沒有障礙物,它將向前移動。
?
if (距離 > 19) { digitalWrite(fwdright7, HIGH); // 前進 digitalWrite(revright6, LOW); 數(shù)字寫入(fwdleft5,高); 數(shù)字寫入(revleft4,低); }
?
如果距離小于定義的避障距離,則表示前方有障礙物。所以在這種情況下,機器人會停一會,然后向后移動,然后再停一會,然后轉(zhuǎn)向另一個方向。
?
if (距離 < 18) { digitalWrite(fwdright7, LOW); //停止 digitalWrite(revright6, LOW); 數(shù)字寫入(fwdleft5,低); 數(shù)字寫入(revleft4,低); 延遲(500); 數(shù)字寫入(fwdright7,低);//movebackword digitalWrite(revright6, HIGH); 數(shù)字寫入(fwdleft5,低); 數(shù)字寫入(revleft4,高); 延遲(500); 數(shù)字寫入(fwdright7,低);//停止 digitalWrite(revright6, LOW); 數(shù)字寫入(fwdleft5,低); 數(shù)字寫入(revleft4,低); 延遲(100); 數(shù)字寫入(fwdright7,高); 數(shù)字寫入(revright6,低); 數(shù)字寫入(revleft4,低); 數(shù)字寫入(fwdleft5,低); 延遲(500); }
?
這就是機器人如何避開路徑上的障礙物而不會卡在任何地方的方法。
int revright6 = 6; //右電機反向運動
int fwdright7 = 7; //右電機ForWarD運動
持續(xù)時間長,距離遠;
無效設置(){
延遲(隨機(500,2000));// 隨機時間延遲
Serial.begin(9600);
pinMode(revleft4,輸出);// 將電機引腳設置為輸出
pinMode(fwdleft5, OUTPUT);
pinMode(revright6,輸出);
pinMode(fwdright7,輸出);
pinMode(trigPin,輸出);// 將觸發(fā)引腳設置為輸出
pinMode(echoPin, INPUT); //將回波引腳設置為輸入以捕獲反射波
}
無效循環(huán)(){
數(shù)字寫入(trigPin,低);
延遲微秒(2);
digitalWrite(trigPin, HIGH); // 發(fā)送波形 10 us
delayMicroseconds(10);
持續(xù)時間=脈沖輸入(回聲針,高);// 接收反射波
距離 = 持續(xù)時間 / 58.2; // 轉(zhuǎn)換為距離
延遲(10);
// 如果你的機器人沒有得到正確的運動,那么改變引腳號
if (distance > 19)
{
digitalWrite(fwdright7, HIGH); // 前進
digitalWrite(revright6, LOW);
數(shù)字寫入(fwdleft5,高);
數(shù)字寫入(revleft4,低);
}
if (距離 < 18)
{
digitalWrite(fwdright7, LOW); //停止
digitalWrite(revright6, LOW);
數(shù)字寫入(fwdleft5,低);
數(shù)字寫入(revleft4,低);
延遲(500);
數(shù)字寫入(fwdright7,低);//movebackword
digitalWrite(revright6, HIGH);
數(shù)字寫入(fwdleft5,低);
數(shù)字寫入(revleft4,高);
延遲(500);
數(shù)字寫入(fwdright7,低);//停止
digitalWrite(revright6, LOW);
數(shù)字寫入(fwdleft5,低);
數(shù)字寫入(revleft4,低);
延遲(100);
數(shù)字寫入(fwdright7,高);
數(shù)字寫入(revright6,低);
數(shù)字寫入(revleft4,低);
數(shù)字寫入(fwdleft5,低);
延遲(500);
}
}
評論
查看更多