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