感謝各位讀者的支持,連載終於邁入最終回了!本期專題要介紹如何使用Android 手機上的姿態感測器來控制樂高EV3 機器人。有接觸過App Inventor 的師長朋友們,歡迎從App Inventor 中文學習網的檔案庫下載本程式的aia 原始檔與apk 安裝檔。
什麼是Direct Command?為什麼需要它?
根據樂高官方文件, 您可以使用Direct Command做到的重要功能有:
• 啟動/停止主機上指定檔名的程式。
• 控制馬達啟動、停止、轉向、電力與角度上限。
• 取得感測器值與狀態
其餘功能,請參考官方文件(註1)。
開始玩機器人
本範例的機器人與2013 年1 月號的「翻轉控制」專欄是一樣的,只是由NXT 換成EV3 機器人而已。機器人不須加裝任何感測器,只要用兩顆馬達組裝成雙輪機器人即可。本範例是將馬達接在EV3 主機的輸入端A 與B。請確認EV3 主機的藍牙已啟動,接著將EV3 主機與Android 手機進行藍牙配對(註3),完成之後就可以把機器人放到一邊了。啟動藍牙之後,您可以從EV3主機的螢幕左上角看到藍牙的符號。
接下來依序介紹程式的各個功能:
STEP1 登入畫面:
首次進入程式的畫面如圖1a ,這時只有「EV3 裝置/ 連線」按鈕可以按,其它所有按鈕都無法操作。點選「EV3裝置/ 連線」按鈕後進入藍牙裝置清單(圖1b),請找到剛剛配對完成的EV3主機名稱(本範例為abc),點選之後就會由Android 裝置對EV3 主機發起藍牙連線。順利連線成功的話,「EV3裝置/ 連線」按鈕會變成不可按的狀態,其他按鈕則都可按(圖1c)。
STEP2 程式初始化:
在點選連線清單之前(ListPicker_EV3 清單選取器的BeforePicking 事件),需先將清單內容指定為Android裝置上的藍牙配對清單(圖2a),其中connected 這個布林變數是用來指示現在手機是否已和機器人成功連線。
點選之後, 會先測試連線是否成功,成功則將「EV3 裝置/ 連線」按鈕設為不可點選,「斷線」等按鈕設為可點選(圖2b)。
STEP3 直接控制副程式start與stop:
直接控制的奧妙之處在於直接對EV3 發送位元陣列, 只要按照樂高官方文件(註1)的說明,以正確的格式來發送資料即可。以 start 副程式來說, 它可接受兩個參數:port/ speed。您可以看到每次呼叫它時, 都會初始化一個名為 data 的空清單,以本範例來說,每一個清單元素代表一個位元組長度的內容。格式為:(13, 0, 0, 0, 128, 0, 0, 165,
0, port , 129, speed , 166 ,0, port),如圖3a。這當然需要您去查找官方文件中各個欄位所代表的意義。在此我們是將port 與 speed 用變數來控制, 代表所要控制的馬達與其轉速。最後透過BluetoothClient 元件將整個data 清單經由藍牙發送給EV3 機器人即可。
到了stop 副程式,資料格式當然也有所改變。我們還用一個if 判斷式去檢查stop 參數是否為true , 如果是則在data 清單最後加入1 ,反之則加入0。這樣發送出去之後就能控制機器人是否要停止動作(圖3b)。
藉由這樣的架構,當您要改用姿態控制、觸碰點控制、語音控制時,整體架構是不變的,差別只在於如何修改speed 變數值而已。
STEP4 姿態感測器:
當手機的姿態發生變化時,就會自動呼叫它的姿態改變(OrientationChanged) 事件, 並會把XYZ 的軸向變化以pitch、roll 與azimuth 這三個事件變數呈現, 供我們取用。由圖4a 可知, 我們要透過X 軸向傾斜來控制機器人前進,Y 軸向傾斜來控制左右轉彎等。在本範例中我們使用另外一個Angle 參數(回傳一個角度代表手機往哪個方向傾斜)求出兩顆馬達的轉速。
在此有兩個重要的變數angle 與power:angle 代表手機的傾斜角度,這是由姿態感測器的Angle 參數再減去45 所決定,45 代表座標軸的偏移量。接著是power 變數,這是一個介於0 ∼ 1 之間的小數,代表手機的傾斜程度,數字愈大代表愈斜。power 變數值是由姿態感測器的Magnitude 變數再乘上200 所決定,200 是一個調控用的參數,數字愈大,代表在同樣的傾斜度下,機器人會跑得愈快,但是也更敏感而不好操控。樂高EV3 機器人的馬達電力範圍為100(正向全速旋轉)到-100(反向全速旋轉),數值超過上下限則就限制在100 或-100 ,如圖4b。
這四個重要的參數(pitch、roll、左馬達轉速與右馬達轉速)都會更新在畫面中間的四個Label 標籤元件上。先呼叫一次 stop 副程式,讓馬達先短暫停頓。接著呼叫兩次start 副程式,分別傳入「port =1;speed = cos(angle x power)」與「port =2;speed= sin( angle x power)」這組參數,代表根據姿態感測器的姿態變化量,進行三角函數運算結果,來決定左右馬達的轉速。
最後,把夾角與左右輪轉速捨去小數點之後(round 指令),將計算結果更新在Screen 的狀態列上,如圖4c。
STEP5 斷線:
按下「斷線」按鈕之後,會中止藍牙連線(BluetoothClient.Disconnect指令),並使畫面上的各個元件恢復到程式一開始時的狀態。
操作
實際執行的時候,請先確認EV3 已經開機且藍牙也啟動了。接著在您的Android 裝置上點選畫面中的「EV3裝置/ 連線」按鈕, 會進到如圖1b的藍牙清單畫面,點選您所要的EV3主機名稱並連線成功後,試著把手機左右搖晃看看。朝前方傾斜,機器人就會前進,傾斜愈多,機器人跑得愈快(圖5a)。左右傾斜的話則是控制機器人左轉或右轉(圖5b)。在App Inventor 官方推出EV3 的元件之前,您也可以用這樣的方法來直接控制樂高EV3 機器人喔!
本程式已上架Google play,請到Google Play 搜尋「CAVE 教育團隊」就找得到我們的樂高機器人系列app 了。歡迎大家到App Inventor 中文學習網的檔案庫下載本程式的aia 原始檔與apk 安裝檔。
註1:樂高EV3 直接控制指令的相關文件請參閱此網頁:http://botbench.com/blog/2014/02/19/ev3-buildyour-own-block-and-hdksdk-docs-available/
註2: 想學如何開發App Inventor 程式嗎? 請到App Inventor 中文學習網(http://www.appinventor.tw)與
我們一同學習。
註3: 與EV3 連線後如果出現「Error 402」之錯誤訊息請不必理會,程式依然能正確執行。
文章原文刊載於《ROBOCON》國際中文版2015/3月號