在〈EV3 Tutorial(12)土炮的繪圖機械手臂(上)〉中,我們完成了機械手臂操作時的程式基礎,不過還沒涉及怎麼在指定的點進行繪圖,因此,接下來要來點數學了 … XD
X-Y 座標與角度的關係
我打算以 X-Y 座標的方式來指定手臂頂端的點,只是這 X-Y 座標必須能轉成角度,這樣馬達才能控制,因此,必須先知道幾個變數:
L1 與 L2 可以直接從手臂量測,(x, y) 是指定座標,從上圖,可以建立幾個等式:
經由一些三角函式推導,最後可以得到:
因為在〈EV3 Tutorial(12)土炮的繪圖機械手臂(上)〉中,我們已經撰寫程式,可以直接指定手臂的兩個內角,令馬達做對應的轉動,因此,再 Θ1、Θ2、Θ3 計算出兩個內角為:
這就是我們需要的 X-Y 座標轉角度了,實際上我量得的 L1 與 L2,分別是 12 與 9 公分,倒要再複習一下怎麼量,記得是從大齒輪的軸心開始量,而不是小齒輪:
手臂位置的初始化
現在的問題在於,手臂一開始要怎麼擺放?還記得之前寫過讓手臂停靠的 Park
程式嗎?我的方式是,先讓手臂作停靠,這樣就有一個基準位置了,然後讓手臂的兩個內角都成為 90 度,也就是成為以下的狀態:
這麼一來,手臂前端的座標位置,就是 (12, 9) 了,我將這個手臂初始化的程式取名為 Init
:
我沒有實際拿量角器去量停靠後要轉多少度,而是直接讓它們都轉到我想要的 90 度,接下來重置馬達感應器,這樣後續的馬達轉動,就有了角度依據了。
我有一個 Const
程式,用來初始一些常數,像是 L1、L2,以及公式中一定會用到的 L1 二次方與 L2 二次方:
接下來當然是求 Θ1、Θ2、Θ3 的三個方塊了,分別命名為 ToSita1
、ToSita2
、ToSita3
:
雖然我已經能將座標轉角度,不過,那是目標角度,也就是實際上,對馬達真正需要的是從目前的角度到下個角度,必須轉多少角度才行,這很簡單,因為一開始內角都是 90 度,而馬達被重置歸零了,我們可以從馬達後來被量得的角度,與 90 度做運算,知道目前處於哪個角度,再與目標角度作運算,就知道要轉多少度了。
這時還要記得,大小齒輪比是 40 : 8,因此,馬達量得的角度,必須除以 5 才對,這些運算,我寫成了一個 Angle12
:
接下來就是指定座標轉動馬達的部份了,這我將之命名為 SetXY
:
弄些簡單的繪圖測試
所有基礎就都完成了,那麼,來畫個直線吧!記得嗎?雖然先前我設計,讓兩個馬達可以在相同時間內,完成指定的角度轉動,不過,這畫出來並不會是直線,而是弧線,為了能畫出直線,那就是將弧線移動分解為更小的弧線,一次一點畫,只要夠小夠細,那麼畫出來就會像是直線。
雖然說,分得越細越好,不過,繪圖也會變慢,再加上 EV3 執行程式並不是那麼快速,因此,我就只分為 20 段好了:
那麼就來畫個 0 試試看吧!只要加上落筆就可以開始畫了:
來看看實際作動與畫出來的樣子,先畫個 0 好了:
當然,你也可以設計來畫個 2:
以 EV3 馬達解析度最小為 1
度,加上目前我的積木組裝時的誤差等因素看來,效果還算勉強可以接受,雖然很土炮,不過驗證了自己的想法應該可行,也是蠻開心的!