車子程式測試

各位有個觀念:車子組組裝裝的,拆了再重組隨時可以,我們還沒用上語音辨識模組,之後用上時再把主表拆下重裝,走由簡入繁的學習曲線,每樣細節都能理解及操作,在這個頁面中,我們將討論車子的基本動作,如何利用Makecode寫(拖曳積木)程式來完成

馬達線的接法

仔細地察看一下KSB048板子後方的馬達插槽,這塊電機驅動板可以同時接四顆馬達(我們只使用二顆),它的區分方式是左側M1A,M1B,右側M2A,M2B,你可以自己決定想怎麼接,這會影響之後你的程式碼的寫法

以左圖範例來看,我將車子左前馬達接在M1B(B01,B02),而將右前馬達接在M2A(A01,A02),所謂的A01,A02是板子的電流方向,在寫程式時你就能理解…

小車馬達轉向測試

看一下上面的程式,主要是函式「motor_test」,KSB048提供的馬達積木可以發送0到+-255的值,針對某個馬達(比如M1B)發正值的時候,電流方向就M1B01→M1B02,發負值的數字方向就反過來,我們可以透過觀察馬達的轉向來得知正轉或反轉,如果不是想要的方向,馬達的二個PIN就反過來接就OK了…

以這個例子而言,我希望發正值時二顆馬達都是朝前轉,發負值都向後轉,測試的時候發現哪一顆不對就把那顆馬達的線反接就可取得想要的

接續上頭說的,發的值越大,馬達的轉速就越高,所以255和-255就是二個方向的最大值,而0就是要求馬達停止,接下來各位可以思考:一輛車的動作不就前進、後退、右轉、左轉和停止,那就是操控左右馬達的轉動方向來達成的,自己寫一下程式吧!通常我會分開寫五個函式來代表這五個動作,然後在主程式中進行呼叫~

上頭關於馬達的程式涵數都是屬於沒有參數的類型,比如想要車子前進,呼叫了forward涵式,兩顆馬達就以200的力度輸出,思考一下:程式有沒有辦法寫成在呼叫forward時可以順便指定力度的?甚至所有前後左右的涵式合併寫成一個就好?

舉一個例子:在新增一個涵式時,除了取名motor之外,又加入了二個數字(Number)參數,取名為Rspeed和Lspeed,準備用來代表右馬達速度及左馬達速度

當按下A鍵時,呼叫motor涵式時就可以順便指定二個數字,前面的200會代替Rspeed而-100會代替Lspeed分別命令M1A和M2A以指定的速度運轉,以這種寫法來看,是不是比分別寫成好幾個涵式還簡捷好用呢?

關於夾子部份的程式設計(兩軸舵機的操控)

先複習一下在車體組裝時已知道的狀態,夾子舵機:角度變小→夾子打開(最小到40度就行了),角度變大→夾子關閉(120度),搖臂舵機:角度變小→向下(40度即可),角度變大→向上(140度即可)

寫程式的原則:分析夾子的各種動作(夾子打開、關閉、上升、下降…)→分別寫成涵數(也考慮是否要寫成可代入參數的樣式),而且你也應習慣於使用變數來掌握在程式中會變化的數值…,以下我舉一個簡單的例子,複雜的自己想…

看一下上頭這段程式,建了一個名為GRIPPER_angle的變數來握著夾子舵機的角度,一開始指定為90度,並命令舵機執行,寫了一個名為gripper_open的涵式帶有一個參數angle,用來呼叫讓夾子開啟的,我們不希望夾子的動作總是立刻指定幾度,而是希望它緩緩地動作,當按A鍵時,呼叫了這個涵式並代入了60,在涵式中有一個條件迴圈會比較GRIPPER_angle和60的大小,如果比60大,GRIPPER_angle便會減1且舵機執行,所以可預見的,舵機的角度會90→89→88→…直到60,而在動作上會看到夾子慢慢地打開~

※命名變數時,不要嫌英文長,我們總以有意義的英文來命名,以方便自己看得懂

※同一顆舵機下改變角度的命令時一定要有暫停,20毫秒、50、100都行,否則舵機會當住

除了利用A鍵和B鍵來觸發命令之外,我會也可以利用加速度計來試試

Micro:bit的加速度感測器

加速器是一個測量動作的感測器。 您的 BBC micro:bit 中的加速器會偵測您何時擺動它向左向右、向後向前和向上向下傾斜。 

你可以試著在你的Micro:bit裡寫入以下的程式範例,在執行時按一下「Show data裝置」藉以觀察xyz軸的數值在你搖動Micro:bit時的變化

搖動夾子車控制夾子 

在這段影片範例中,車子左傾時,夾子打開;右傾時夾子關閉,您能想想這程式是怎麼寫的嗎?