http://pansci.tw/archives/45497
2013年七月號的 ROBOCON 專欄題目是[輕鬆使用Android裝置控制樂高機器人:用滑桿控制馬達速度],使用Slider 元件來控制馬達的方向與速度。
更多資訊請到App Inventor中文學習網 ~
========================================================================
本期專欄將與大家介紹如何使用Slider 滑桿元件來分別控制樂高機器人馬達的轉速與方向。滑桿元件好比是電玩遊戲機的類比搖桿,提供了比按鈕更細緻的操控效果。
樂高NXT 伺服機
樂高公司所生產的馬達種類約有十數種,其中NXT 馬達是輸出扭矩最大也是最有份量的一款馬達,相對地耗電量也是相當驚人。另一方面,NXT馬達是所有樂高馬達中唯一有配置角度感應器的馬達,透過角度感應器我們可以精確指定馬達轉軸之旋轉角度(最低為1 度),甚至經過計算之後可轉換為機器人行走的距離,非常方便。在App Inventor 中是透過NxtDrive元件來控制樂高NXT 馬達,雖然控制功能不如其他程式語言例如C 語言或是LabVIEW 來得豐富,但是基本操作也是相當足夠了。圖1a 是NxtDrive的屬性設定欄位,由於本範例要使用三個Slider 元件分別來控制三個馬達,所以需要三個NxtDrive 元件, 將其DriveMotors 欄位分別設為A、B 與C,代表控制樂高NXT 機器人的A、B 與C 馬達。至於WheelDiameter 代表目前所使用的輪胎直徑, 單位為公分。
在此不必理會此欄位,因為它不會影響到本範例的操作效果,我們會在日後的專欄來介紹如何使用它。
圖1a NxtDrive 的屬性設定欄位。
圖1b NxtDrive 的轉動指令。
開始玩機器人
請把NXT機器人組裝好,並將左側馬達接在NXT的輸出端B,右側則是輸出端C(註1)。請確認NXT主機的藍牙是啟動的,接著將NXT主機與 Android手機進行藍牙配對(註2),完成之後就可以把機器人放到一邊了。啟動藍牙之後您可以從NXT主機的螢幕左上角看到藍牙的符號。
接下來依序介紹程式的各個功能:
STEP1 登入畫面:
首次進入程式的畫面如圖2a , 只有「NXT 裝置清單/ 連線」按鈕可以按,其它所有按鈕都無法操作。點選「NXT 裝置清單/ 連線」按鈕後進入藍牙裝置清單(圖2b),請找到剛剛配對完成的NXT 主機名稱(本範例為abc),點選之後就會由Android 裝置對NXT 主機發起藍牙連線。順利連線成功的話,就可拉動Slider 滑桿元件來控制馬達轉速(圖2c)。
圖2a 程式首次執行的畫面。
圖2b 點選連線按鈕後進入藍牙裝置清單。
圖2c 連線成功後才可進行相關操作。
STEP2 程式初始化:
在點選連線清單之前(ListPickerConnect 的BeforePicking事件), 需先將清單內容指定為Android 裝置上的藍牙配對清單(圖3a)。點選之後則先測試連線是否成功,成功則將「選擇感測器」與「開始唸/ 停止」設為可點選(圖3b)。
圖3a 指定藍牙配對裝置清單。
圖3b 連線成功後啟動相關元件。
STEP3 使用滑桿控制馬達電力:
在設計的想法上,我們希望滑桿拉到最左邊時,馬達電力為-100(全速反轉),拉到最右邊時馬達電力為100(全速正轉),置於中間時電力則為0 ,同時也讓馬達停下來。
由於滑桿元件最小值只能為0 ,因此我們將滑桿的最大值改為200 ,後續運算再減100 就可對應到馬達電力-100~100 的範圍了。至於滑桿的初始位置則設為100 ,即滑桿正中央處。
拉動滑桿時, 會呼叫Slider 的PositionChanged 事件並帶入thumbPosition 參數, 我們就是要用這個參數來控制馬達的電力。在圖4中,我們將滑桿位置thumbPosition_A 減去100 之後四捨五入, 指定為power 變數的內容, 這就是馬達的電力。接著將相關數值顯示於畫面上, 最後呼叫NxtDrive 的MoveForwardIndefinitely 指令並塞入power 變數值就好了。這樣當滑桿位於最右側時,thumbPosition_A 的值為200 ,power 變數值為200-100為100 ,代表馬達正向全速轉動。
圖4 Slider 元件控制馬達轉速。
STEP4 定義副程式:
您應發現了三個Slider 元件做的事情好像大同小異,這時候就可以將這些類似的指令包成一個副程式,不但程式的可讀性變高,日後要修改程式時也更加方便。本範例中宣告一個名為move 的副程式,並可傳入一個參數。當我們拉動SliderA 時,就會傳入一個文字A 給move 副程式。因此的程式可以簡化變成以下的樣子(圖5a):
圖5a 使用副程式架構來改寫Slider 事件。
我們將文字A 傳入move 副程式之後, 就都交給它來處理了。那麼,move 副程式裡面到底發生了什麼事呢? 在move 裡面, 我們會判斷接收到的參數motor 內容是否等於「A」,如果是的話就執行圖5b 的內容, 圖5b 的內容是不是和圖4 是一樣的呢?
那麼另外兩個Slider 事件您應該已經知道怎麼做了,就是分別送出文字「B」與「C」,並在move 副程式中進行對應的判斷與動作(圖5c)。這樣一來我們就能集中管理程式碼了。
圖5b 將原本的Slider_A 事件中指令整合到副程式中。
圖5c 不同的Slider 事件差別在於送出的參數。
STEP5 停止所有馬達並將滑桿歸零:
為了方便起見, 請新增一個按鈕,按下之後會三個Slider 元件的滑桿回復到正中央位置,同時也會將power 變數值歸零,馬達也就停止轉動(圖6)。
圖6 停止所有馬達。
STEP6 斷線:
按下「斷線」按鈕之後,會中止藍牙連線(BluetoothClient.Disconnect指令),並使按鈕恢復到未連線時的狀態(圖7)。
圖7 按下「斷線」按鈕時中斷藍牙連線。
操作
實際執行的時候,請先確認NXT 已經開機且藍牙也啟動了,並將NXT 接上三個馬達( 圖8a、8b、8c)。接著在Android 裝置上點選程式畫面中的「連線」按鈕,會進到藍牙清單畫面,點選您要的NXT 主機名稱並連線成功後,就能拉動滑桿來控制,或按下「停止所有馬達」按鈕來停止馬達。
圖8a A 馬達電力82% 正轉。
圖8b B 馬達電力34% 正轉。
圖8c C 馬達電力46% 反轉。
本範例介紹了Slider 滑桿元件,它提供了更細微的控制, 善加利用它,您的機器人會有更多有趣的功能。程式模組化是非常重要的程式開發觀念,希望您可以藉此建立起良好的基礎。
期待您從本期專欄的內容來激盪出更多有趣的火花。請繼續關注CAVE 的機器人專欄唷!
歡迎大家由以下連結或掃描以下的QRCode 來下載本程式:
請到Google Play 搜尋「CAVE 教育團隊」就找得到我們的樂高機器人系列app 了。在App Inventor 中文教學網上直接下載本範例的App Inventor 原始檔與apk 安裝檔。
註1: 想學如何開發App Inventor 程式嗎? 請到AppInventor 中文學習網與我們一同學習。
註2:將Android 手機設定為可安裝非Google Play 下載的程式以及讓手機與樂高NXT 主機連線等說明請參考這裡。
註3:與NXT 連線後如果出現[Error 402] 之錯誤訊息請不必理會,程式依然能正確執行。
文章原文刊載於《ROBOCON》國際中文版2013/7月號
請問老師如果想用雙滑桿,
透過藍芽控制馬達有可能實現嗎?
雙A計畫part2我有做成功,
但是我發現如果弄了兩個滑桿,
傳送兩個滑桿位置的值過去,
不知怎麼讓Arduino程式端分開接收值…
請問可以給我一些指示嗎
我覺得把兩個數值組合起來當做同一筆來發送會比較好,例如A B兩個滑桿數值都是 0~100, 那就送 C= A *100 + B 送出,Arduino 接收到之後再拆開就好