用機械手臂玩井字遊戲
前一章我們學會了如何用Blockly控制手臂繪圖,並確立出清楚的座標系與H工作範圍,接下來我們要出試著運用中學數學,畫出正方形、正三角、叉叉、圓形、等等基本形狀,最後讓手臂能幫我畫出井字遊戲。
向量繪圖法
先從最簡單的正方形與叉叉開始,在紙上找一點當起點,畫一個邊長1cm的正方形,由於每次的起點都不一樣,如果還是用之前的[MoveTo]積木畫圖,換一個起點就要重新計算另外三個點的座標,因此我們要使用新的方法,Motion類別中的[Move Distence]直接控制手臂末端移動多少距離。
如果用[Move Distence]畫正方形,積木的XYZ三的數值就不是座標而是向量,與其說是畫一個正方形,不如說是筆尖在紙上”走”出一個正方形,如上中圖所示,筆尖從左下的x出發依序向右、上、左、下走10個單位,就會回到起點剛好畫出一個封閉正方形,用積木程式做出這個過程如上右圖所示。
補充:Dobot程式中控制移動距離的單位都是1mm,無論是Blockly或是Python皆是如此,因此這裡輸入10就代表1cm。
接著示範用[MoveDistence]畫正三角形,回憶一下國中數學教的正三角形邊長與高的比例,這裡會用到"開根號"這個數學函數,找到Math類別中的[Square Root]積木,缺口後面擺的數字就是數學記號中根號裡的數字,按照下圖拼出程式積木,試試看執行後會不會畫出邊長為2cm的正三角形吧。
正方形與正三角形都是一筆畫能夠完成,那如果象X有兩筆畫又要如何用[MoveDistence]畫出來呢?前一節在畫隨機三角形時使用[JumpTo]做開頭,這個方塊會自帶提筆落筆的動作,如果單純使用[MoveDistence]就要自己寫提筆、落筆的動作,也就是原地升降Z軸的高度。
在左上示意圖中,紅色的方塊為提筆、圓形為落筆,中間的黑色虛線表示筆尖浮空移動,積木程式如右上圖所示,如此便能畫出X字型。
注意到了嗎,上面這幾段程式甚至連記錄紙面高度的變數[paperHeight]都沒有用到,手臂會直接從當前位置畫一個正方形、正三角或X,但這並不代表[MoveDistence]就完全優於之前介紹的[JumpTo]跟[MoveTo],還是要視情況選用積木。
圓型與正多邊型
接下來我們把目標放在畫出半徑為1cm的圓形,或者換言之是很多邊的正多邊形,看起來就會像是圓型,這當中會用到中學數學的三角函數、以及程式的迴圈功能,乍看之下很有挑戰,但其實一點都不複雜,整個繪圖的流程如下圖所示。
首先,宣告一個變數S表示我們要畫的是幾邊型,在此我以7邊型做示範因此變數後面接了數字7,由於我們要以手臂當下的位置當作圓心,因此需要變數X0、Y0來記錄位置,為統一變數名稱將原本的paperHeight也改成Z0,接著向右跨一步來到繪圖的起點,也就是上圖的紅圈處。
接著拿出Loops類別裡的第三個積木,將變數S擺進第二個洞原本10的位置,在迴圈中變數i就會從1數到7,在拉出這個積木的同時就會自動生成新的變數i,在使用迴圈時為了確認內容無誤,我都會在迴圈中擺入print及時將迴圈中計算的數寫出來確認。
接著計算角度t,每跑一次迴圈角度t就會增加整個圓的1/7,也就是t=i*360/7,並同步將t印出來。
計算出多邊形第i個頂點的座標,並以Xi、Yi變數記錄起來,以數學式表示為
Xi=X0+r*cos(t)
Yi=Y0+r*sin(t)
此處半徑r為10,並記得目前畫的圓是以當前的點(X0,Y0)做圓心,計算座標時最前面要加上去,最後再補上[MoveTo]將筆尖移動到計算出來的座標,就算大功告成了。
好不容易寫出來的程式積木,如果不小心拖曳到弄壞了就很麻煩,可以做一個函式將其包裝起來,並讓在函式積木上加入參數輸入框,之後使用時就可以任意設定想要的邊數。
怎麼幫函式加入輸入框呢?一樣先拿出Functions的第一個積木,這個積木的左上角有一個齒輪,點開後出現了一個迷你版的Blockly介面,是用於修改Function積木結構的,將[input name:X]的X改成S再拖到右邊[inputs]大框中,外面的函式積木也被修改了Blockly積木不只可以寫程式還能修改機木本身,很有意思吧。
記得將該函式名稱改成PlotCircle,原本畫圓型(多邊型)的程式塊整個拖進函式中,並記得丟掉[Set ‘S’ to 7]這個積木,不然從外面設定好的S值友會被覆蓋掉,打開Functions類別就發現新的PlotCircle積木出現了,而且還帶有S值輸入的缺口,這時就可以在S後面加入任意數值,數值越大越接近圓型喔。
發現了嗎,當邊數是3就是正三角,邊數設定為4就是正方形。
MLC題目:井字遊戲
如果要用手臂畫出井字遊戲,最困難的部分反而是畫OOXX的形狀,相信學了這麼多程式繪圖的技巧,要畫出井字的遊戲框不是甚麼難事,試著自己用Blockly介面做出能畫井字的程式,找朋友一起用手臂玩井字遊戲吧。