我編程實(shí)現(xiàn)的一個(gè)自主機(jī)器人(自主者,非遙控也),能夠識(shí)別并規(guī)避障礙。她擁有全封閉的底盤并使用差速轉(zhuǎn)向(原文為“tank steering”,坦克的駕駛方式),這種轉(zhuǎn)向方式使用兩臺(tái)分開控制的電動(dòng)機(jī)分別驅(qū)動(dòng)兩個(gè)主動(dòng)輪(一機(jī)一輪)
控制信號(hào)來自其自身攜帶的Arduino微型控制器(在國內(nèi)用單片機(jī)如PIC、AVR,或者Arm處理器都可以很好地替代),另外有一個(gè)舵機(jī)用于Makey頭部的轉(zhuǎn)動(dòng)。Makey的頭部裝有一個(gè)超聲波探頭,她會(huì)持續(xù)的左右搖頭,以得到不同方向上的距離信息,并進(jìn)行存儲(chǔ)和處理
1???工具和材料
● (使用的工具與零部件列表這里沒翻,畢竟相當(dāng)一部分東西買原版都不太現(xiàn)實(shí)也沒有必要--國內(nèi)的家伙事兒差不多的也能土法上馬,有興趣的童鞋請(qǐng)參考原文)
2???制作機(jī)身
● 機(jī)身由兩片鋁合金薄板制成,涉及的加工方法有切割、鉆孔和折彎。你可以一次一片的加工,或者兩片一起做以減少占用加工設(shè)備的機(jī)時(shí)。成品見2.5
● 注意:切割金屬時(shí)務(wù)必佩戴防護(hù)眼鏡
2.1???切割
● 用帶鋸機(jī)把鋁合金片切成圖紙的形狀,切割的邊緣一定要在線外
● 提示:切割內(nèi)角時(shí),先切出一個(gè)大概的弧形曲線,然后從兩個(gè)方向直線進(jìn)刀以得到直角
2.2???打孔
● 用沖子和小錘子在圖上有十字線的17處沖出定位孔,為下一步的鉆孔做準(zhǔn)備。另外要在圖上長方形的孔的四個(gè)角上沖透
● 按照?qǐng)D上標(biāo)十字線處的尺寸鉆孔,要首先取下貼上去的圖紙(不過別扔了),用鉆頭對(duì)準(zhǔn)前面留下的沖痕開鉆可以使鉆孔更精確
● 把金屬牢固的夾在廢木頭板上或者隨便什么墊子上,這樣可以得到更平滑的孔而不會(huì)導(dǎo)致薄金屬板在鉆孔處扭曲變形
● 為了掏成方形孔而鉆圓形孔時(shí),你可能需要調(diào)整鉆孔的直徑以使圓孔邊緣與長方形的邊相切
2.3???挖槽
● 用沖剪完成對(duì)長方形孔的加工,如果你愿意的話可以把前面揭下來的圖再貼回去,以便容易知道長方形的邊界在哪。最后把邊緣磨平
● 用手工打磨工具去掉金屬邊緣的毛刺。給小孔磨邊的方法為:把大鉆頭的尖端插進(jìn)小孔,然后手工轉(zhuǎn)幾下
沖剪是長成這樣滴:
2.1-2.3都是跟合金板過不去的活兒,原作者的辦法基本是土法上馬,與美帝的高科技風(fēng)格嚴(yán)重不符。柚子在大學(xué)折騰機(jī)器人那會(huì)兒去交大觀摩,他們有加工中心,只要把CAD圖畫出來發(fā)過去,那邊用等離子切割機(jī)就給“打印”出來了,鉆啊、掏異形啊這種活兒根本不存在。更神奇的是切完的邊不用磨,基本不扎手。另外我們用土法掏方形孔的時(shí)候是先鉆大孔,把帶鋸拆開一頭套進(jìn)去然后慢慢鋸,得到的孔要多丑有多丑,然后還得上鐵砧拿小錘砸平
2.4???彎板
● 把底板的折彎圖用雙面膠貼到鋁板的另一面,對(duì)準(zhǔn)圓洞方洞的位置,別貼歪了
● 把鋁片貼折彎圖的一面向上塞進(jìn)彎板機(jī)里,在所有標(biāo)示折彎的部位折90度
● 每個(gè)長邊上的兩個(gè)突出部要先折,然后再折機(jī)身的邊。(順序反了就塞不進(jìn)去了)
● 折彎后要緩慢釋放,測(cè)量,確認(rèn)每一處折彎都要是直角
2.5???制作頂板
● 重復(fù)2.1-2.4步驟,加工頂板(top),然后你就搞定了每個(gè)機(jī)器人都會(huì)喜歡的底盤
3???運(yùn)動(dòng)系統(tǒng)
3.1???安裝電機(jī)
● 用4-40 x 1螺絲穿過小孔,將驅(qū)動(dòng)電機(jī)定位在底板上,電機(jī)的傳動(dòng)軸應(yīng)該穿過大孔
● 使用螺母和墊片在電機(jī)的一端上緊,因?yàn)榭梢允┱沟目臻g尺寸很小,可能需要尖嘴鉗子(夾住螺母)才能上緊
3.2???制作輪轂
● 用2英寸(外徑,合50.8mm)的空心鉆頭(見過裝空調(diào)的師傅在墻上鉆大洞用的那種鉆吧,很類似)在廢木頭板上鉆出輪子(鉆透木板之后木板上有個(gè)圓洞,鉆頭中間的洞里會(huì)剩下個(gè)圓片,這個(gè)圓片就是輪子),我用了18號(hào)板(貌似是一種規(guī)格),最終得到的輪子有3/4英寸(19.05mm)厚,直徑1.8英寸(45.72mm)。鉆輪子的時(shí)候要牢固的固定木板,并且緩慢進(jìn)刀,防止卡住鉆頭
● 給2個(gè)木頭輪子分別對(duì)心定位一個(gè)輪心(圖中白色塑料的小輪子),并用小螺絲標(biāo)記兩個(gè)孔的位置,在此位置上用1英寸(原文如此,合25.4mm,不過疑為有誤,從圖上看孔絕對(duì)沒那么大)的鉆頭鉆透
● 給木頭輪子噴漆,我喜歡紅色光面防銹漆,這種東西非常薄,顏色很亮,覆蓋性好并且容易清潔。注意,不要在安裝孔里噴太多
3.3???制作輪胎
● 用43號(hào)鉆頭在輪心上鉆兩個(gè)相對(duì)的孔,然后用4-40絲錐在每個(gè)孔里攻出螺紋
● 用兩個(gè)4-40 x 1螺絲從木輪外側(cè)把輪子和輪心固定在一起,不要太緊
● 給每個(gè)輪子裝輪胎,輪胎外徑比較大的一面朝外。最后把輪子裝在驅(qū)動(dòng)電機(jī)的傳動(dòng)軸上
3.1-3.3就是折騰那倆輪子,原作者極其不厚道,沒說怎么對(duì)心,這個(gè)很重要,誰也不希望做完的機(jī)器人跑起來一跳一跳的。您還別問我咋對(duì)心,我也沒經(jīng)驗(yàn),新手還是找現(xiàn)成的輪子對(duì)付一套比較安全。另外3.2-3.3中原作者留下一個(gè)邏輯錯(cuò)誤,看出來的童鞋請(qǐng)舉手
3.4???安裝萬向輪
● 使用螺絲、螺母以及墊片將萬向滾珠安裝在底板底部
4???電控系統(tǒng)
4.1???安裝電源
● 按照第一步打印出來的隔板圖樣,從一塊硬塑料上切出隔板(隔板是用來裝線路板的,用塑料是為了絕緣),按說明打孔,嘗試著塞進(jìn)機(jī)器人的外殼并使之架在驅(qū)動(dòng)電機(jī)之上,作必要的修整,令其充分貼合匹配
● 用兩個(gè)4-40 x 2螺絲將Arduino控制線路板與硬塑料隔板固定在一起,螺絲應(yīng)從隔板下方穿入,并在線路板上方擰螺母。線路板上的USB接口需要和機(jī)器人面板上預(yù)先留好的開口充分對(duì)齊
● 將電池夾具鉚接在機(jī)器人外殼的左側(cè)面板上,預(yù)制的鉚釘頭朝外,這樣的話丑的一頭就朝里啦
關(guān)于鉚接,這里指的不是造泰坦尼克的那種把燒紅了的鋼制鉚釘插進(jìn)去擠兌一下的工藝,而是一種將鋁合金預(yù)制鉚釘?shù)拈_放端在常溫下擠壓成型從而將兩個(gè)或更多構(gòu)件固定在一起的方法,最常見到的是各地馬路邊的刮大風(fēng)能掉下來砸死人的鐵皮廣告牌子,它們就是用這種工藝把鍍鋅薄鋼板固定在L字鋼框架支撐結(jié)構(gòu)上滴
4.2???控制板
● 按照制造商的教程,把原型板(ProtoShield)焊好
● 用帶鋸機(jī)把板子上的BlueSMiRF接頭切下來,這個(gè)接頭是用來連接藍(lán)牙模塊的,我們的機(jī)器人用不到那東西。是不是鋸得很爽?
● 把面包板接在原型板上,原型板插在Arduino上,如果用的是Diecimila(Arduino主板的一個(gè)版本),那么將電源跳線設(shè)置在EXT位上
焊接原型板絕對(duì)不是個(gè)輕松的活兒,沒基礎(chǔ)的童鞋搞不定也不用糾結(jié)。面包板(breadboard)是這么個(gè)東西,其意義在于省了燒電烙鐵的麻煩,不過問題是有時(shí)候元件捅進(jìn)去會(huì)接觸不良...
5???給WALL·E安上一雙明亮的眼睛
5.1???WALL·E的脖子
● 咱這個(gè)項(xiàng)目用的是HS-55型舵機(jī)及與之配套的較短的一字舵角,用5''鉆頭對(duì)舵角最靠外的兩個(gè)孔進(jìn)行擴(kuò)孔
Du-Bro Mini E/Z 連接頭, #DUB845
微副翼系統(tǒng) Du-Bro Micro Aileron System, #DUB850
● 將兩個(gè)Du-Bro Mini E/Z連接頭從正面穿過搖臂兩端的孔,并在反面用黑色橡膠的部件固定
● 將控制桿(圖中所示的細(xì)鐵絲樣?xùn)|西)穿過Du-Bro Mini E/Z連接頭,并用連接頭附帶的螺絲擰緊
5.2???WALL·E之眼
● 有挑戰(zhàn)性的工作來咯!咱們需要把舵機(jī)和超聲波探頭接在一起。把從舵機(jī)上伸出來的控制桿分別穿過位于傳感器電路板對(duì)角的定位孔(這個(gè)定位孔來自Du-Bro Mini E/Z連接頭,連接頭又插在板子上的螺絲眼里,然后另一端用那個(gè)黑橡膠部件固定)并向外折成90度角
● 控制桿應(yīng)該從舵角開始豎直向上,并且給超聲波探頭留下足夠插信號(hào)線的空間,傳感器正面(有收發(fā)端,也就是像倆小眼睛的那一面)朝前,控制桿上還應(yīng)該套上絕緣套(就是那個(gè)塑料管)以防止短路,絕緣套在Du-Bro套件里可以找到。確認(rèn)安裝無誤后,將控制桿與傳感器上的連接頭擰緊。
Du-Bro是美國的一家生產(chǎn)模型配件的公司,很遺憾我沒找到這些產(chǎn)品的國內(nèi)版本。歡迎在國內(nèi)見過這些配件的同學(xué)提供信息
5.3???給WALL·E安上一雙明亮的眼睛
● 將舵機(jī)和超聲波探頭出來的線穿過機(jī)器人外殼頂部預(yù)先留下的長方形開孔
● 舵機(jī)也要插進(jìn)那個(gè)頂部開孔,調(diào)整好位置后兩邊用螺絲與螺母將舵機(jī)與外殼固定好,剪去多余的控制桿(還是那個(gè)細(xì)鐵絲)
● 把舵機(jī)搖臂與舵機(jī)上到一起,用小螺絲刀調(diào)整一下保證Makey的眼睛(傳感器)朝前
6???連接并測(cè)試驅(qū)動(dòng)電機(jī)
6.1???電機(jī)預(yù)處理
● 咱的地?cái)傌涬姍C(jī)上的連接頭部件是很脆弱滴,所以連接部分一定要用心
● 從外殼里拆出電機(jī)和Arduino線路板
● 切2紅2黑各12英寸(304.8mm,12寸炮是305mm的,比如筑波級(jí)的2*2主炮)電線,每條線的兩端1英寸(25.4mm)剝?nèi)ソ^緣皮。先別焊接,用一個(gè)紅黑線對(duì)在電機(jī)的末端(有電源接點(diǎn)的那一端)纏幾圈,以防止拉斷,然后讓線對(duì)從電機(jī)頂端通過,用雙面泡沫膠帶將其固定在電機(jī)上。注意不要覆蓋電機(jī)上的任何孔洞,同時(shí)要為電機(jī)的固定留足空間
● 將電容的兩個(gè)引腳分別穿過電機(jī)接線頭上的小孔,焊接(這里應(yīng)該是把引腳穿過去的部分和同一根引腳的根部焊在一起,這樣的話引腳和電機(jī)接線頭就充分連通了。注意,千萬別把倆引腳焊在一起!)這需要使用尖嘴鉗的巧妙掰彎手法。然后把給電機(jī)供電的電線頭與電容引腳,注意,不是電機(jī)接線頭,焊在一起,焊牢穩(wěn)一些。再然后剪掉多余的電容引腳。把電容和纏在電機(jī)末端的電線一起用黑膠布(也就是絕緣膠帶)緊密的纏在電機(jī)上,并且用更多的泡沫膠帶把這個(gè)鼓鼓囊囊的位置包起來(還是為了固定)
● 把漏在外面的電機(jī)供電線擰成雙絞線,這樣可以減低電路中的噪聲(一個(gè)供電的低壓直流線路里有點(diǎn)噪聲怕什么?原作者的想法好奇怪)。給電機(jī)標(biāo)出左和右
在電機(jī)上并聯(lián)了一個(gè)電容,這樣做有兩個(gè)好處。
其一,在穩(wěn)定的直流電路里,電容是開路,不會(huì)影響電機(jī)工作,但是給電機(jī)通電的那一瞬間,電容因?yàn)橐潆姡梢苑謸?dān)一部分電流,所以電容作為一個(gè)保護(hù)器件可以保護(hù)電機(jī)。
其二也是更重要的,這種直流電機(jī)的接線頭是一個(gè)銅合金片,從電機(jī)的塑料外殼里伸出來(通常被和塑料鑄在一起),鬼知道奸商們用了什么材料,反正這個(gè)東西非常脆,尖嘴鉗上去經(jīng)常能掰斷,然后這個(gè)電機(jī)就沒啥搶救的價(jià)值鳥,另外這個(gè)銅片不怎么粘焊錫,焊接不易。但是電容的引腳一般都是類似鋁、錫一樣的柔韌金屬,想怎么扳都能成形,焊起來也容易得多,所以作者把電氣連接的活兒都轉(zhuǎn)到這個(gè)引腳上來做。
【連電機(jī)的小經(jīng)驗(yàn)】銅接線片作連接之前最好用細(xì)砂紙小心的蹭幾下,去掉氧化物。電容線腳穿過去之后輕輕拉緊,在穿孔附近用尖嘴鉗用力捏一下,使線腳與銅片充分接觸。另外電線最好挑獨(dú)軸的,也就是絕緣皮里面只有一根金屬的,那種絕緣皮里有一束極細(xì)銅絲的線焊起來會(huì)有想死的沖動(dòng)
6.2???電機(jī)測(cè)試
● 將短實(shí)心跳線分別焊接到電機(jī)供電線和電池接頭線上,這些跳線可以讓你把它們(電機(jī)和電池)插到面包板上,焊接之后用熱縮膠帶作焊點(diǎn)的絕緣(用絕緣膠布纏是一樣的,除了丑一點(diǎn)和大一點(diǎn))。將電機(jī)供電線穿過塑料隔板(4.1提到的那個(gè))上的大窟窿(因?yàn)槊姘搴碗姍C(jī)分別在隔板上下兩側(cè))
● 按圖示把電機(jī)驅(qū)動(dòng)器插進(jìn)面包板中間的一行孔里,使之和電機(jī)以及一個(gè)電池連通(注意,在面包板上,每一行的孔之間是連通的)。使用短跳線并保證這些線緊貼面包板,傻大黑粗的大電線是不配塞進(jìn)機(jī)器人里的
● 從?Arduino官網(wǎng)?下載Arduino的軟件并且安裝之,通過USB接口把你的Arduino和電腦連起來,如果你用的是Diecimila版本的話,把它的電源跳線接換到USB檔上。
● 為了測(cè)試電機(jī),運(yùn)行名為01_Test_Motor_Rotation的程序,此時(shí)左邊的電機(jī)應(yīng)該先往前轉(zhuǎn)再往后轉(zhuǎn),然后是右邊的,先往前再往后。如果不是這樣,檢查一下你的接線。接下來運(yùn)行02_Test_Motor_Speed,此時(shí)電機(jī)應(yīng)該以低速啟動(dòng),然后加速,最后反方向轉(zhuǎn),如果不是這樣的話檢查線腳D11和D3
7???連接并測(cè)試舵機(jī)和傳感器
7.1???連接舵機(jī)
● 將電機(jī)和Arduino再裝回機(jī)器人里面,找兩個(gè)3針的單排直角插針(通常是將一個(gè)20針的單排插針折斷得到)插在面包板上,把舵機(jī)線接在上面,具體接線規(guī)則為:黑線-GND(地線,電池負(fù)極),紅線-+5V(電池正極),黃線-Arduino跳線D10
● 再來一個(gè)3針右轉(zhuǎn)接頭,這個(gè)是接超聲波探頭的,接線規(guī)則為黑線-GND(地線,電池負(fù)極),紅線-+5V(電池正極),黃線-Arduino跳線D9
7.2???測(cè)試舵機(jī)和超聲波探頭
● 運(yùn)行舵機(jī)對(duì)中程序03_Test_Servo_Center,松開舵機(jī)搖臂的螺絲并微調(diào),舵機(jī)臂與超聲傳感器盡量指向正前,因?yàn)槎鏅C(jī)軸齒輪的問題,這一步可能無法完全對(duì)中,沒關(guān)系,我們稍后再調(diào)整
● 運(yùn)行程序04_Test_Servo_Sweep,這個(gè)程序可以讓超聲波探頭慢慢的搖頭
● 再來測(cè)試超聲波探頭,運(yùn)行05_Test_Sensor_Distance,點(diǎn)擊Arduino軟件的數(shù)據(jù)流監(jiān)視器圖標(biāo),你應(yīng)該能看到不斷跳出來的測(cè)距讀數(shù),而且如果你在傳感器之前揮舞你的手,測(cè)距讀數(shù)應(yīng)該有變化。如果你得到的讀數(shù)始終是0或者255厘米或者別的什么錯(cuò)誤的讀數(shù),檢查你的接線是否有誤,并且千萬確定你的傳感器沒接反 :P
7.3???安裝開關(guān)
● 終于可以接電源開關(guān)鳥!把Arduino最后一次拆出來,為了裝開關(guān),需要把還沒用到的電池引線的紅線焊在開關(guān)的一端并且把另一跟紅線焊在開關(guān)的另一端。同樣別忘了把電池的黑色引線和另一個(gè)根黑線焊在一起
● 把線從機(jī)器人側(cè)面的方形孔穿好,開關(guān)需要打在“1”的檔位上,把開關(guān)塞進(jìn)方孔里固定好,這個(gè)調(diào)整可能會(huì)用到鉗子
● 把從開關(guān)出來的紅色線腳接到原型板的RAW線腳上(這個(gè)線腳還連著Arduino的Vin線腳),把從電池出來的黑色線接到原型板的GND線腳上,如果你用的是Diecimila版本的話,把它的電源跳線調(diào)回到EXT檔上
8???系統(tǒng)測(cè)試
● 現(xiàn)在所有的電子設(shè)備工作都正常鳥,小心的把所有東西塞回機(jī)器人里,啥也別落下。裝好電池,把機(jī)器人放好,別摔了。用來傳程序的USB接口應(yīng)該能從側(cè)面的孔里露出來
● 重新載入并運(yùn)行01_Test_Motor_Rotation,注意,所謂前是指機(jī)器人的USB接口和傳感器指向的方向,如果你的機(jī)器人反著跑,檢查在線腳AOut1, AOut2, BOut1, BOut2, AIn1, AIn2, BIn1, 和 BIn2處的接線,可能也會(huì)需要反轉(zhuǎn)驅(qū)動(dòng)電機(jī)的連接
● 重新運(yùn)行其他的測(cè)試程序,確認(rèn)接線正常,測(cè)試完成后把舵機(jī)和傳感器的線塞進(jìn)外殼里,扣上頂蓋,擰上4個(gè)螺絲固定,收工!
9???給你的WALL·E注入靈魂
● 有時(shí)候你的硬件做好了你就沒啥事可干了,不過你的程序是寫不完滴。這也是你展示創(chuàng)造力的好時(shí)機(jī)
● 在代碼中你需要使用digitalWrite和analogWrite這倆函數(shù)來控制驅(qū)動(dòng)電機(jī),通過傳遞值給電機(jī)驅(qū)動(dòng)器的各3個(gè)線腳。其中一個(gè)可以接收介于0到255之間的值,用于控制傳給電機(jī)的電流大小,這個(gè)是用來控制速度的。另外2個(gè)線腳則使用布爾型變量,用于決定每個(gè)電機(jī)兩端的電位高低,這個(gè)可以決定電機(jī)的方向(當(dāng)然電機(jī)兩端只能一端是高電位)
● 你可以編寫類似void Forward()這樣的函數(shù)實(shí)現(xiàn)簡(jiǎn)單的動(dòng)作,比如后退(兩個(gè)電機(jī)同時(shí)反轉(zhuǎn)),Spin_Left(原地左轉(zhuǎn),右輪正轉(zhuǎn)左輪反轉(zhuǎn)),Arc_Left(畫弧左轉(zhuǎn),右輪正轉(zhuǎn)左輪不動(dòng))之類的。Arduino的編程環(huán)境使你的代碼實(shí)驗(yàn)和加載都很方便
● 另外一個(gè)好玩的事情是規(guī)避障礙,只要運(yùn)行這樣一個(gè)循環(huán):往前走,讀取測(cè)距信息,如果障礙物太近則采取躲避動(dòng)作比如后退并轉(zhuǎn)彎,返回循環(huán)體頭部
?
評(píng)論