2015年10月31日 星期六

3DP : 可愛的 MobBob 雙足機器人

當初組 3D 印表機主要就是想印車子和機器人的機身及相關的改裝零件,結果為了研究印表機的機構,Arduino 荒廢了大半年,最近重回初衷,又開始和電路板及程式為伍,做了使用八顆 SG90 的四足機器人,做了使用12顆SG90的四足機器人,也完成了使用四顆SG90的雙足機器人 MobBob。

MobBob 與其它的 BoB 機器人一樣是以四顆伺服馬達當動力來源的雙足機器人,最大的特色是作者放了手機在機器人上,以手機當他的臉,搭上表情動畫、語音與操作者互動,並透過藍牙和手機通訊,指揮機器人做各種動作。它除了按按鈕下指令,還有影像辨識及語音發送指令的功能,增添了更多的玩法。


其實 MobBob 是最早製作的,但是因為沒弄懂它四顆馬達的腳位,一直走得不順,昨晚將作者釋放出來的 Arduino 程式碼好好的研究了一下,總算把哪一邊是左側的馬達,哪一邊是右側的馬達弄清楚了,下面是製作 MobBob 雙足機器的一些記錄。

材料與工具

  • 機身組件(以 3D printer 列印)
  • 伺服馬達(SG90)四顆
  • Arduino 一片(UNO或其它控制板)
  • 藍牙模組一片(HC-05、HC-06 ......)
  • 航模鋰電池一顆(3.7V)
  • Android 手機

機身組件的模型下載與組裝的方法就參考作者放在 Thingiverse 的檔案
已測試過,用一顆 3.7v 航模小鋰電池就可以供電給 Arduino UNO + HC-05 + 四顆 SG90 ,所以個人並沒使用作者設計的電池架,直接以一條橡皮筋將電池及 Arduino UNO 掛在背後。



伺服馬達接腳


按照作者 Arduino 程式的設計,當我們面向機器人正面(手機)時,我們左手邊的馬達是 Arduino 程式中所謂的左側馬達,左側上面那顆馬達是「leftHip」,而左側下面那顆馬達是「leftFoot」;我們右手邊的馬達則是 Arduino 程式中所謂的右側馬達,右側上面那顆馬達是 「rightHip」,而右側下面那顆馬達是「rightFoot」。

四顆伺服馬達的訊號線接腳可以自行指定要插在 Arduino 的哪個腳位,記得搭配修改 Arduino 程式的變數內容即可。例如:
  • leftHip 插在 Arduino 的 D4
  • leftFoot 插在 Arduino 的 D5
  • rightHip 插在 Arduino 的 D6
  • rightFoot 插在 Arduino 的 D7
我們要修改 Arduino 程式底下四行的變數內容:

const int SERVO_LEFT_HIP   = 4;
const int SERVO_LEFT_FOOT  = 5;
const int SERVO_RIGHT_HIP  = 6;
const int SERVO_RIGHT_FOOT = 7;


校正馬達角度

作者的 Arduino 程式中,四顆伺服馬達是以 90度為初始角度,因為馬達的品質有差,還需要在 Arduino 程式中微調變數來校正,讓馬達能確實的靜止在正中央。

要特別注意的是在 MobBob 在 Arduino 程式中,控制 servos 呼叫的是「writeMicroseconds( )」,所以使用的單位是「microseconds (uS) 」,而不是角度。所以置中(90度)大約是 1500 microseconds,整個搖臂旋轉可用的範圍(前後500)大概在 1000~2000 microseconds 左右。

我的校正做法是:
  • 馬達先不鎖上搖臂。
  • 將馬達控制線都插好,修改 Arduino 程式中的腳位變數後將靭體寫入 Arduino。
  • 上電等一會兒後,將四顆馬達的搖臂套上,使機器人腳掌馬達的搖臂盡量與地面呈垂直的姿態,而臀部的馬達搖臂是盡量對齊底座邊緣的姿態。
  • 以 Arduino IDE 中的 Serial Monitor 送控制 servo 角度的指令,格式是:

    <SV, time, leftHip, leftFoot, rightHip, rightFoot>

    例如
    想微調 leftHip 10 microseconds (正數為順時針旋轉),就輸入底下的指令:

    <SV,0,50,0,0,0>

    想微調 leftFoot -100 microseconds (負數為逆時針旋轉),就輸入底下的指令:

    <SV,0,0,-100,0,0>

    測試好,記得將數字記下來,前面的數字都是相對於原來 Arduino 程式中的置中,再據此以原來的置中的參數減掉(正數時)或加上(負數時)測試的值,計算每顆馬達置中的最佳參數。
  • 依據前一步驟的計算結果來調整 Arduino 程式中底下的四個參數值,讓每顆馬達都可以置中:
    LEFT_HIP_CENTRE : 左上馬達
    LEFT_FOOT_CENTRE : 左下馬達
    RIGHT_HIP_CENTRE : 右上馬達
    RIGHT_FOOT_CENTRE : 右下馬達
  • 重新編譯並更新 Arduino 靭體。



伺服馬達如果使用 .writeMicroseconds() 來控制角度時,照說 1500 是中間(90度),但像我的四顆馬達微調後的值分別是 1370, 1380, 1520, 1380:

const int LEFT_HIP_CENTRE = 1370;
const int LEFT_FOOT_CENTRE = 1380;
const int RIGHT_HIP_CENTRE = 1520;
const int RIGHT_FOOT_CENTRE = 1380;

有一顆馬達特別不合作哦!

Arduino 程式中的控制指令

MobBob 的 Arduino 程式中設計不少預設的機器人動作指令,我們只要透過 serial 連線傳送它能解析的指令,靭體就會幫我執行相關的程序。MobBob 的所有指令都必須用小於符號「<」開頭,最後再以大於符號「>」當結尾。例如:

  • <ST> : 等目前的動作執行完後,回復初始的站姿。
  • <SI> : 立即停止所有動作。
  • <FW> 或 <FW,次數> : 前進指定的次數
    <FW> 或 <FW,0> 相當於 <FW,1>
    而 <FW,-1> 是重覆執行前進的指令,直到被中止。
  • <BW> 或 <BW,次數> : 後退指定的次數
    <BW> 或 <BW,0> 相當於 <BW,1>
    而 <BW,-1> 是重覆執行後退的指令,直到被中止。
  • <RT> 或 <RT,次數> : 右轉指定的次數,其它用法和 <FW>、<BW>類似。
  • <LT> 或 <LT,次數> : 右轉指定的次數,其它用法和 <FW>、<BW>類似。
  • 其它類似的指令還有:
    <SX, #Times>
    <BX, #Times>
    <WX, #Times>
    <WY, #Times>
    <WZ, #Times>
    <TX, #Times>
    <TY, #Times>
    <TZ, #Times>
    <LX, #Times>
    <LY, #Times>
    <LZ, #Times>

另外還有一個在校正馬達中心點時就用過的:

  • <SV, time, leftHip, leftFoot, rightHip, rightFoot>

這個「SV」的指令可以說是控制整個機器人動作的最重要核心,<FW>、<BW>那些指令能用很多道不同角度的 <SV, ......> 組合而來。

測試 MobBob 指令最簡單的方法就是將 Arduino 插上 USB 線,和電腦連線後,以 Arduino IED 中的 Serial Monitor 來輸入指令來觀察:



知道上面那些指令,我們就可以開發自己的 APP,透過藍牙和 Arduino 連線後,將指令發送給靭體去執行,達到控制 MobBob 的目的。


相關文章



沒有留言:

張貼留言

 
© 2009. Design by Pocket