生活随笔
收集整理的這篇文章主要介紹了
树莓派小车————避障篇
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
避障模塊的功能就是讓小車能夠檢測到障礙物并且可以正確的避開障礙物。當然避障的方式有很多種。我選擇的是超聲波結合紅外傳感器來避障。
- 為什么要用超聲波傳感器結合紅外傳感器?
因為硬件原因,沒有舵機,原本超聲波可以安裝在舵機上,通過舵機轉動,讓超聲波檢測周圍障礙物,我們可以設置舵機轉動的角度,最大程度減少超聲波檢測的盲區。我在設計的時候提前沒有想到要舵機,所以后來也來不及了。
我的超聲波傳感器固定在了小車的正前方,只能檢測到正前方的障礙物,左右兩邊的障礙物超聲波無法檢測,所以我只能在左前和右前兩個位置安裝了兩個紅外避障傳感器來檢測障礙物。 - 避障方案還存在的不足?
1.雖然用紅外傳感器檢測了左右的障礙物,但是超聲波依然存在盲區,高于和低于超聲波檢測位置的障礙物無法檢測到。
2.小車后方的障礙物沒有檢測的裝置
3.紅外傳感器在強光下無法正常工作 - 如何完善避障方案?
如果你想設計更加完善的避障方案,需要做如下工作:
1.增加舵機
2.小車后方增加超聲波傳感器或者紅外傳感器
接下來講解避障電路和原理 - 電路連接:
(1)超聲波的電路連接:超聲波共有4個引腳,VCC、GND、Trig、Echo。
Trig是發送端,發出超聲波,Echo是接收端,接收超聲波。電路連接圖如下:
如上圖所示,VCC接了2號引腳(+5V),GND接了39號引腳(GND),Trig和Echo分別接了35和37號引腳(GPIO),還是一樣,你自己在設計的時候可以選擇正確的任何引腳。
(2)紅外避障傳感器的電路連接:紅外避障傳感器共有三個引腳,VCC、GND、OUT。電路連接圖如下:
如圖中所示,兩個傳感器的VCC都接樹莓派的4號引腳(+5V),GND都接樹莓派的34號引腳(GND),OUT分別接了36號和40號引腳(GPIO口)。還是一樣,你自己可以選擇引腳來設計。 - 避障原理:
(1)超聲波測距原理:
超聲波傳感器包括發射端(Trig)和接收端(Echo),使用IO口Trig觸發測距,給在至少10us的高電平信號下會模塊會自動發射方波,發出信號的同時接收端會輸出高電平,等到接收到反射回來的信號時,Echo就會跳轉為低電平。通過超聲波的工作原理可知:從Trig=1到Echo=0的時間,就是超聲波從發射到返回的時間,因此:障礙物的距離=Echo高電平持續的時間*聲速/2。
(2)紅外避障傳感器:紅外傳感器檢測到障礙物時狀態為False,兩個燈亮,沒有檢測到時為True,一個燈亮。 - 設計方案圖解:
- 代碼:
import RPi
.GPIO
as GPIO
import time
Trig
=35
Echo
=37
L_Senso
=40
R_Senso
=36def init():GPIO
.setwarnings
(False)GPIO
.setmode
(GPIO
.BOARD
)GPIO
.setup
(Trig
,GPIO
.OUT
) GPIO
.setup
(Echo
,GPIO
.IN
) GPIO
.setup
(L_Senso
,GPIO
.IN
)GPIO
.setup
(R_Senso
,GPIO
.IN
)
def get_distance():GPIO
.output
(Trig
,GPIO
.HIGH
) time
.sleep
(0.00015) GPIO
.output
(Trig
,GPIO
.LOW
)while GPIO
.input(Echo
)!=GPIO
.HIGH
: passt1
=time
.time
() while GPIO
.input(Echo
)==GPIO
.HIGH
: passt2
=time
.time
() distance
=(t2
-t1
)*340*100/2 return distance
def bizhang():safe_dis
=40 while True:barrier_dis
=get_distance
() if (barrier_dis
< safe_dis
) == True:while (barrier_dis
< safe_dis
) == True:L_S
=GPIO
.input(L_Senso
)R_S
=GPIO
.input(R_Senso
) if L_S
== False and R_S
== True:print "左有障礙物先后退再右轉"turn_back
(18,0.5)turn_right
(18,0.2)if L_S
== True and R_S
== False:print "右有障礙物先后退再左轉"turn_back
(18,0.5)turn_left
(18,0.2)if L_S
==False and R_S
== False:print "兩邊都有障礙物后退"turn_back
(18,0.5)L_S
=GPIO
.input(L_Senso
)R_S
=GPIO
.input(R_Senso
)if L_S
== True and R_S
== True:print "右轉"turn_right
(18,0.2)if L_S
== False and R_S
== True:print "右轉"turn_right
(18,0.2)if L_S
== True and R_S
== False:print "左轉"turn_left
(18,0.2)if L_S
== False and R_S
== False:print "后退"turn_back
(18,0.5)if L_S
== True and R_S
== True:print "兩邊都沒有障礙物,后退再右轉"turn_back
(18,0.5)turn_right
(18,0.2)print barrier_dis
,'cm'print ''barrier_dis
=get_distance
()else:L_S
=GPIO
.input(L_Senso
)R_S
=GPIO
.input(R_Senso
) if L_S
== True and R_S
== True:print "前方40cm內沒有障礙物,且左前和右前方沒有障礙物,前進"turn_up
(18,0)if L_S
== False and R_S
== True:print "前方40cm內沒有障礙物,左前有障礙物,右前方沒有障礙物,后退右轉"turn_back
(18,0.5)turn_right
(18,0.2)if L_S
== True and R_S
== False:print "前方40cm內沒有障礙物,右前有障礙物,左前方沒有障礙物,后退右轉"turn_back
(18,0.5)turn_left
(18,0.2)if L_S
== False and R_S
== False:print "前方40cm內沒有障礙物,左前,右前方都有障礙物,后退"turn_back
(18,0.5)L_S
=GPIO
.input(L_Senso
)R_S
=GPIO
.input(R_Senso
)if L_S
== True and R_S
== True:print "右轉"turn_right
(18,0.2)if L_S
== False and R_S
== True:print "右轉"turn_right
(18,0.2)if L_S
== True and R_S
== False:print "左轉"turn_left
(18,0.2)if L_S
== False and R_S
== False:print "后退"turn_back
(18,0.5)print barrier_dis
,'cm'print ''
- 注:
(1)你在測試運行時,需要添加基本運動的代碼。
(2)我的避障的處理代碼只能作為參考,寫的不是很簡潔??梢詤⒖疾糠衷?#xff0c;你自己需要設計符合你自己情況的避障代碼。
總結
以上是生活随笔為你收集整理的树莓派小车————避障篇的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。