MobBob 與其它的 BoB 機器人一樣是以四顆伺服馬達當動力來源的雙足機器人,最大的特色是作者放了手機在機器人上,以手機當他的臉,搭上表情動畫、語音與操作者互動,並透過藍牙和手機通訊,指揮機器人做各種動作。它除了按按鈕下指令,還有影像辨識及語音發送指令的功能,增添了更多的玩法。
其實 MobBob 是最早製作的,但是因為沒弄懂它四顆馬達的腳位,一直走得不順,昨晚將作者釋放出來的 Arduino 程式碼好好的研究了一下,總算把哪一邊是左側的馬達,哪一邊是右側的馬達弄清楚了,下面是製作 MobBob 雙足機器的一些記錄。
材料與工具
- 機身組件(以 3D printer 列印)
- 伺服馬達(SG90)四顆
- Arduino 一片(UNO或其它控制板)
- 藍牙模組一片(HC-05、HC-06 ......)
- 航模鋰電池一顆(3.7V)
- Android 手機
機身組件的模型下載與組裝的方法就參考作者放在 Thingiverse 的檔案
MobBob Arduino 靭體
MobBob Android app
已測試過,用一顆 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 的目的。
沒有留言:
張貼留言