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

變形樂(lè)高玩具變形和樹莓派一起玩出樂(lè)高機(jī)器人!
樹莓派打造視頻監(jiān)控機(jī)器人Verybot
有關(guān)樹莓派制作機(jī)器人平臺(tái)的探索
請(qǐng)教利用樹莓派制作六足機(jī)器人的問(wèn)題
樹莓派語(yǔ)音識(shí)別機(jī)器人(下)
請(qǐng)問(wèn)一下怎樣去設(shè)計(jì)一種基于PID算法的巡線機(jī)器人?
如何使用樹莓派開發(fā)智能機(jī)器人控制系統(tǒng)
用Arduino和L298制作帶有避障機(jī)器人的巡線器

巡線機(jī)器人電路圖 巡線機(jī)器人的工作原理和應(yīng)用領(lǐng)域

能夠精準(zhǔn)定位的樹莓派機(jī)器人!

評(píng)論