文/曾吉弘(CAVE教育團隊)
在7 月號的專欄中, 我們介紹了如何使用Slider 滑桿元件來控制樂高機器人馬達的轉速與方向。本期我們將介紹如何使用樂高馬達中的編碼器(encoder)來讓機器人前進指定的距離,並且深入介紹App Inventor 中對於樂高機器人的SetOutputState 低階控制指令。
樂高NXT 伺服馬達
樂高NXT 的馬達是所有樂高馬達中輸出扭矩最大也是最有份量的一款,另一方面,它也是唯一有配置角度感應器的馬達,經過計算之後可求出機器人行走的距離或轉動的方位角,非常方便。
本期專題將使用App Inventor 中,NxtDrive 元件的MoveForward 指令與NxtDirectCommand 的setOutputState 指令來控制樂高NXT 馬達。圖1 中是NxtDrive 的屬性設定欄位,由於本範例要控制機器人上的兩個馬達,所以需要兩個NxtDrive 元件, 將其DriveMotors 欄位分別設為B 與C ,代表控制樂高NXT 機器人的B 與C馬達。WheelDiameter 代表目前所使用的輪胎直徑,單位為公分。以本範例所使用的輪胎直徑為5.6 公分,因此請填入5.6。樂高的輪胎胎皮上都會標示輪胎的尺寸(圖2),請依照您所選用的輪胎填入正確的數字,否則機器人行走的距離就不正確啦。
圖1NxtDrive 的屬性設定欄位。
圖2樂高NXT 機器人的5.6公分馬達。
接著看到NxtDrive 的正轉MoveForward 與反轉MoveBackward 指令, 我們須給定電力power 與距離distance 兩個參數,但事實上也能以負數讓馬達反向轉動。圖3 中兩個指令都會讓B 馬達以電力50% 反向轉動10 公分。
圖3 NxtDrive 的轉動指令。
回想一下國小的圓周長公式:2πr ,r 代表半徑。以本範例使用的5.6公分輪胎來說,圓周長就是2π X2.8=17.6 公分,代表馬達每轉一度所代表的圓周長為17.6 / 360 =0.049公分。換言之如果要讓機器人前進一公分的話,馬達大約要轉動20.4 度。
什麼是編碼器?
編碼器的功能主要是得知馬達轉軸的位置,並推估馬達的轉速。由於馬達會受到電力、負載與其他種種外在因素,沒有編碼器的馬達就無法得知其正確位置而導致誤差愈來愈大。因此應用在機器人上的馬達大部分都會有編碼器來得到更好的精確度與控制效果。樂高馬達的編碼器解析度為1度,高級馬達的編碼器解析度會更精細,當然也就愈貴囉!
開始玩機器人
請把NXT 機器人組裝好,並將左側馬達接在NXT 的輸出端B , 右側則是輸出端C( 註1)。為了完整測試,請將第三個馬達接上輸出端A。請確認NXT 主機的藍牙是啟動的,接著將NXT 主機與Android 手機進行藍牙配對(註2),完成之後就可以把機器人放到一邊了。啟動藍牙之後您可以從NXT主機的螢幕左上角看到藍牙的符號。
接下來依序介紹程式的各個功能:
STEP1 登入畫面:
首次進入程式的畫面如圖4a , 只有「NXT 裝置清單/ 連線」按鈕可以按,其它所有按鈕都無法操作。點選「NXT 裝置清單/ 連線」按鈕後進入藍牙裝置清單(圖4b),請找到剛剛配對完成的NXT 主機名稱(本範例為abc),點選之後就會由Android 裝置對NXT 主機發起藍牙連線。順利連線成功的話,就可拉動Slider 滑桿元件來控制馬達轉速(圖4c)。
圖4a 程式首次執行的畫面。
圖4b 點選連線按鈕後進入藍牙裝置清單。
圖4c 連線成功後才可進行相關操作。
STEP2 程式初始化:
在點選連線清單之前(ListPickerConnect 的BeforePicking 事件), 需先將清單內容指定為Android 裝置上的藍牙配對清單(圖5a)。點選之後則先測試連線是否成功,成功則將「斷線」按鈕設為可點選(圖5b)。
圖5a 指定藍牙配對裝置清單。
圖5b 連線成功後啟動相關元件。
STEP3 讓馬達前進指定的距離:
本範例的架構相當簡單,點選「前進距離」按鈕就會呼叫MoveForward指令, 讓兩個馬達同時以電力50 來行走我們所輸入的距離。在此我們透過一個if 判斷式,當您尚未輸入任何數字之前,按鈕事件的內容將無法執行,事實上是因為如果該欄位為空的話將造成程式當機按鈕將無法點選。
另外由於速度過快機器人容易衝過頭而導致計算不準,在此不建議您使用太高的電力值(圖6)。
圖6 按下按鈕讓機器人前進指定距離。
STEP4 讓馬達轉動指定的角度:
您應該發現了吧,App Inventor管太多啦! 一般來說我們都是使用馬達編碼器值搭配輪胎尺寸來算出機器人的移動距離。但NxtDrive.MoveForward 指令這樣子包起來的話, 反而使我們無法取得馬達的編碼器值了。幸好, 在NxtDirectCommands元件中有一個設定輸出端狀態(SetOutputState)指令,它的tachoLimit 欄位就是編碼器值,可在此直接指定馬達所要轉動的角度,每次轉動到這個值的時候就會自動停下來。
在圖7a 中,點選「轉動角度」按鈕就會呼叫SetOutputState 指令,讓兩個馬達同時以電力50 來轉動我們所指定的角度值。其實這才是所有AppInventor 中有關樂高機器人輸出指令的真實面貌,它是根據樂高官方所定義的直接指令,以位元陣列的方式來直接與樂高NXT 主機的韌體進行溝通。當然,要達到這樣的效果是需要一點功力的,所以App Inventor 開發小組就幫您把常用的樂高控制指令都包好了,我們只要直接呼叫使用即可。
圖7a 按下按鈕讓馬達轉動指定角度。
以SetOutputState 指令來說, 就是以藍牙通訊的方式,一次向NXT 機器人發送15 個位元組長度的位元陣列,機器人收到之後就可以自動執行對應的內容。這也就是為什麼我們不需要編寫機器人端的程式就可以控制樂高機器人,是不是非常方便呢?
如果我們要用SetOutputState 指令來達到與MoveForward 指令一樣的效果的話,就要先算出馬達轉一度所代表的圓周長,再計算出要前進的距離(圖7b)。這樣雖然計算比較繁複,但對於開發者來說,這種作法的彈性是比較大的。由於篇幅關係,我們無法詳細介紹所有欄位的意義,如果您想要對樂高直接控制指令一探究竟的話, 請由樂高MindStorm官方網站下載藍牙開發套件的文件。
圖7b 用SetOutputState 指令達到MoveForward的效果。
STEP5 斷線:
按下「斷線」按鈕之後,會中止藍牙連線(BluetoothClient.Disconnect指令),並使畫面上的各個元件恢復到未連線時的狀態(圖8)。
圖8按下「斷線」按鈕時中斷藍牙連線。
操作
實際執行的時候,請先確認NXT 已經開機且藍牙也啟動了。接著在您的Android 裝置上點選畫面中的「NXT 裝置清單/ 連線」按鈕,會進到如圖4b的藍牙清單畫面,點選您所要的NXT主機名稱並連線成功後,就能輸入距離或是角度來控制機器人了(圖9)。
圖9程式執行畫面。
本範例介紹了如何讓機器人移動指定距離以及讓馬達轉動指定角度,這都是透過。期待您從本期專欄的內容來激盪出更多有趣的火花。請繼續關注CAVE 的機器人專欄唷!
歡迎大家由此連結或掃描以下的QRCode 來下載本程式
本程式已上架Google play,請到Google Play 搜尋「CAVE 教育團隊」就找得到我們的樂高機器人系列app 了。在App Inventor 中文教學網上直接下載本範例的App Inventor 原始檔與apk 安裝檔。
註1: 想學如何開發App Inventor 程式嗎? 請到AppInventor 中文學習網(http://www.appinventor.tw)與我們一同學習。
註2: 將Android 手機設定為可安裝非Google Play 下載的程式以及讓手機與樂高NXT 主機連線等說明請參考此連結。
註3: 與NXT 連線後如果出現[Error 402] 之錯誤訊息請不必理會,程式依然能正確執行。
文章原文刊載於《ROBOCON》國際中文版2013/9月號