眾所周知,樹莓派是一個基于ARM微處理器的開發平臺。憑借其強大的計算能力,它在廣大電子愛好者中經常會創造出奇跡。為了更好地了解樹莓派及其工作原理,讓我們嘗試使用樹莓派制作一個巡線機器人。
如果你對機器人感興趣,那么你應該非常熟悉“巡線機器人”這個名稱。這種機器人只需使用一對傳感器和馬達就能沿著線行走。使用樹莓派制造這樣一個機器人,會讓我們打開更大的想象空間。
尋線機器人的原理
尋線機器人能夠在紅外傳感器的幫助下跟蹤線條。紅外線傳感器具有紅外線發射器和紅外線接收器,其中,紅外線發射器(紅外LED)主要發射光,它發射出的紅外線只有在被反射時才會返回。接收器(光電二極管)則等待接收返回后的紅外光。然而,不是所有的表面都能反射紅外線,只有白色的表面才能完全反射紅外線,而黑色的表面會吸收紅外光。
使用這樣的兩個紅外傳感器來隨時檢查機器人是否處于軌道上,如果機器人偏離軌道,我們就通過兩個電機來校正它。電機應該是雙向旋轉的,而且需要的工作電流較大,因此,我們需要額外使用電機驅動模塊,如L293D。機器人還需要一個像樹莓派(Raspberry Pi)這樣的主控大腦,它會根據紅外傳線傳感器模塊的數值來指示電機工作。下面是一個簡化的控制原理圖。
兩個紅外傳感器被放置在軌道線的兩側。如果沒有傳感器檢測到黑線,樹莓派將命令電機向前移動,如下所示:
如果左邊的傳感器檢測到黑線,那么樹莓派就會命令機器人,通過單獨旋轉右邊的輪子,使機器人向左轉。
如果右邊的傳感器檢測到黑線,那么樹莓派就會命令機器人,通過單獨旋轉左邊的輪子,使機器人向右轉。
如果兩個傳感器都檢測到黑線,機器人就會停止。
這樣,機器人就能夠在不脫離軌道的情況下沿著軌道線一直前進。下面讓我們看看電路和代碼。
樹莓派尋線機器人電路圖
在這個電路中,包含了兩個紅外線傳感器模塊和一對連接到樹莓派的直流電機。整個電路由一個移動電源供電(在電路中用電池來表示)。同時,由于樹莓派電路板上并沒有提供針腳的描述,我們需要用下面的圖片來驗證每一個引腳的接口定義。圖片是基于樹莓派2B的,如果你采用樹莓派3B,也可以查閱: 樹莓派3的外圍I/O數據接口
如上圖所示,左上角的引腳是+5V引腳,我們使用這個+5V引腳給紅外傳感器供電,如圖所示(紅色線)。然后,我們用黑色線將GND引腳連接到紅外線傳感器和電機驅動模塊的GND。黃線分別將傳感器1和2的輸出引腳與GPIO引腳2和3連接起來。同時,要驅動電機,我們需要連接L293D電機驅動板的四個引腳(A,B,A,B)。這四個引腳分別與樹莓派的GPIO14,4,17和18連接。電機與L293D電機驅動模塊連接,驅動模塊使用電池供電。一定要將電池的負極與樹莓派的接地連接起來,這樣才能保證電路的正常工作。
樹莓派編程
首先需要導入GPIO,下面的函數是對樹莓派的GPIO引腳進行編程。我們還將“GPIO”重命名為“IO”,所以在程序中,每當我們想要引用GPIO引腳時,我們都會使用“IO”這個詞。
import RPi.GPIO as IO
有時,當我們試圖使用某個GPIO引腳時,可能它正在執行一些其他功能。在這種情況下,當我們執行程序時會收到警告。下面的命令是告訴樹莓派忽略警告繼續執行程序。
IO.setwarnings(False)
我們可以參考樹莓派的GPIO引腳定義,無論是采用電路板上的引腳號碼或采用引腳的功能號碼,比如,電路板上的“PIN 29”是“GPIO5”。所以在這里,我們要用下面的代碼告訴樹莓派具體用的是“29”還是“5”來表示引腳號。
IO.setmode (IO.BCM)
我們前面說到,電路中將設置6個引腳作為輸入/輸出引腳。前兩個引腳是讀取紅外線傳感器數據的輸入引腳。后四個是輸出引腳,前兩個用于控制右電機,后兩個用于控制左電機。
IO.setup(2,IO.IN) #GPIO 2 -> Left IR out
IO.setup(3,IO.IN) #GPIO 3 -> Right IR out
IO.setup(4,IO.OUT) #GPIO 4 -> Motor 1 terminal A
IO.setup(14,IO.OUT) #GPIO 14 -> Motor 1 terminal B
IO.setup(17,IO.OUT) #GPIO 17 -> Motor Left terminal A
IO.setup(18,IO.OUT) #GPIO 18 -> Motor Left terminal B
紅外傳感器如果檢測到白色的面,將輸出“True”,所以只要兩個傳感器的狀態都是“True”,機器人就可以繼續前進。
if(IO.input(2)==True and IO.input(3)==True): #both white move forward
IO.output(4,True) #1A+
IO.output(14,False) #1B-
IO.output(17,True) #2A+
IO.output(18,False) #2B-
如果右邊的紅外傳感器檢測到黑線,機器人將執行右轉動作。當條件滿足時,停止右電機,單獨旋轉左電機,如下面的代碼所示:
elif(IO.input(2)==False and IO.input(3)==True): #turn right
IO.output(4,True) #1A+
IO.output(14,True) #1B-
IO.output(17,True) #2A+
IO.output(18,False) #2B-
如果左紅外傳感器檢測到黑線,機器人將執行左轉動作。當條件滿足時,停止左電機,單獨旋轉右電機,如下面的代碼所示:
elif(IO.input(2)==True and IO.input(3)==False): #turn left
IO.output(4,True) #1A+
IO.output(14,False) #1B-
IO.output(17,True) #2A+
IO.output(18,True) #2B-
如果兩個傳感器都檢測到黑線,這意味著機器人執行停止動作。這可以通過設置電機的兩個端子都為“True”來實現,如下面的代碼所示:
else: #stay still
IO.output(4,True) #1A+
IO.output(14,True) #1B-
IO.output(17,True) #2A+
IO.output(18,True) #2B-
完成變成后,我們可以在白色的瓷磚地面,用黑色膠帶粘貼出我們想要的軌道線形狀,這樣就可以開始享受機器人巡線的樂趣了。下面是完整的Python代碼,將其保存到樹莓派上,在樹莓派命令窗口中執行代碼即可。
import RPi.GPIO as IO
import time
IO.setwarnings(False)
IO.setmode(IO.BCM)
IO.setup(2,IO.IN) #GPIO 2 -> Left IR out
IO.setup(3,IO.IN) #GPIO 3 -> Right IR out
IO.setup(4,IO.OUT) #GPIO 4 -> Motor 1 terminal A
IO.setup(14,IO.OUT) #GPIO 14 -> Motor 1 terminal B
IO.setup(17,IO.OUT) #GPIO 17 -> Motor Left terminal A
IO.setup(18,IO.OUT) #GPIO 18 -> Motor Left terminal B
while 1:
if(IO.input(2)==True and IO.input(3)==True): #both while move forward
IO.output(4,True) #1A+
IO.output(14,False) #1B-
IO.output(17,True) #2A+
IO.output(18,False) #2B-
elif(IO.input(2)==False and IO.input(3)==True): #turn right
IO.output(4,True) #1A+
IO.output(14,True) #1B-
IO.output(17,True) #2A+
IO.output(18,False) #2B-
elif(IO.input(2)==True and IO.input(3)==False): #turn left
IO.output(4,True) #1A+
IO.output(14,False) #1B-
IO.output(17,True) #2A+
IO.output(18,True) #2B-
else: #stay still
IO.output(4,True) #1A+
IO.output(14,True) #1B-
IO.output(17,True) #2A+
IO.output(18,True) #2B-
-
ARM
+關注
關注
134文章
9097瀏覽量
367585 -
巡線機器人
+關注
關注
0文章
14瀏覽量
6430 -
樹莓派
+關注
關注
116文章
1707瀏覽量
105648
發布評論請先 登錄
相關推薦
評論