各位讀者,2015 快樂! CAVEDU的專欄從2012開始連載, 已經橫跨了四個年頭了呢。本期專題延續上一期的按鈕控制樂高EV3機器人,進一步帶您複習觸碰原理,您會應用三角函數來求出左右馬達的轉速。有接觸過App Inventor的師長朋友們,歡迎從App Inventor中文學習網下載原始碼回去,加入更多有趣的功能。
什麼是Direct Command?為什麼需要它?
Direct Command(註2)是樂高公司所提供的一種通訊格式。在機器人端不需要任何程式的情況下,只要建立通訊(USB、藍牙與 Wi-Fi)後對EV3主機發送位元陣列,就能達到諸多控制效果。因此不限於智慧型手機,只要是能夠與樂高機器人進行無線通訊(藍牙或Wi-Fi)的裝置,都能以此架構來通訊。不過請注意:NXT的無線通訊方式只有藍牙。
有了Direct command,只要與EV3藍牙配對,不需要任何程式就可以經由手機遙控機器人端,這樣的好處在於你不需要維護兩份程式碼。另外,手機端與機器人端的程式應該都是不同的程式語言,這樣也會增加開發上的難度。你可以使用將本程式的架構修改成姿態控制(orientation sensor)、觸碰點控制、語音控制等,讓您的機器人更豐富。
根據樂高官方文件, 您可以使用Direct Command做到的重要功能有:
• 啟動/停止主機上指定檔名的程式。
• 控制馬達啟動、停止、轉向、電力與角度上限。
• 取得感測器值與狀態
其餘功能,請參考官方文件。
開始玩機器人
本範例的機器人與2012年7月號的「單點控制」是一樣的,機器人不需使用任何感測器,只要用兩個馬達組裝成雙輪機器人即可。本範例是將馬達接在EV3主機的輸入端B 與C。請確認EV3主機的藍牙已啟動,接著將EV3主機與Android手機進行藍牙配對(註3),完成之後就可以把機器人放到一邊了。啟動藍牙之後,您可以從EV3 主機的螢幕左上角看到藍牙的符號。
接下來依序介紹程式的各個功能:
STEP1 登入畫面:
首次進入程式的畫面如圖1a ,這時只有「EV3裝置/連線」按鈕可以按,其它所有按鈕都無法操作。點選「EV3裝置/連線」按鈕後進入藍牙裝置清單(圖1b),請找到剛剛配對完成的EV3主機名稱(本範例為abc),點選之後就會由Android 裝置對EV3 主機發起藍牙連線。順利連線成功的話,「EV3裝置/連線」按鈕會變成不可按的狀態,其他按鈕則都可按(圖1c)。
STEP2 程式初始化:
在點選連線清單之前(ListPickerConnect 的BeforePicking事件),需先將清單內容指定為Android裝置上的藍牙配對清單(圖2),其中connected 這個布林變數是用來指示現在手機是否已和機器人成功連線。
點選之後, 會先測試連線是否成功,成功則將「EV3 裝置/連線」按鈕設為不可點選,「斷線」等按鈕設為可點選。
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 變數值而已。
藉由這樣的架構,當您要改用姿態控制、觸碰點控制、語音控制時,整體架構是不變的,差別只在於如何修改speed 變數值而已。
STEP4 觸控原理與前進按鈕:
我們在Canvas 畫布元件中放入一個Ball 元件,它可以藉由手指頭拖拉來移動 。如果要得到用手指頭拉動Ball 元件效果, 需把它放在Canvas 畫布元件中, 也就是要在Ball.Dragged 事件中取得它的座標,進而計算出夾角來求得兩個馬達的轉速。請按以下說明:
在此有兩個重要的變數angle 與power:angle變數代表觸碰點(就是Ball元件) 與X 軸的夾角θ , 公式為atan(y/x)。atan是反正切函數, 可由y/x 反推出夾角θ ,座標關係如圖4a。power變數則是觸碰點與螢幕中心的距離,公式為2*( √ ((x^2) + (y^2))) * 0.7。power 值愈大代表觸碰點離螢幕中心愈遠,馬達轉速會愈高,在此 0.7 為一個調控用的常數,您可以調整它來看看不同的效果。樂高EV3 機器人的馬達電力範圍為100(正向全速旋轉)到-100(反向全速旋轉),數值超過上下限則就限制在100 或-100。
使用Ball.MoveTo 指令, 將XY 欄位指定為CurrentX-5 與CurrentY-5 ,這樣就能用手指拉著小紅球移動。減去5 的原因是要扣掉半徑5 的偏移量,如圖4a。
先呼叫一次 stop副程式, 讓馬達停下來。最後將B 馬達電力指定為sin(x)*y ,C 馬達電力指定為cos(x)*y。接著呼叫兩次start 副程式, 分別傳入「port =1;speed = cos( angle × power)」 與 「port =2;speed = sin(angle ×power) 」這組參數,代表根據觸碰點座標進行三角函數的運算結果來要求左右馬達的轉速。
最後,把夾角與左右輪轉宿捨去小數點之後(round 指令),將計算結果更新在Screen 的狀態列上,如圖4c。
STEP5 停止按鈕:
按下停止按鈕,就會呼叫stop 副程式並傳入(3, true)這組參數,代表停止機器人動作,並讓球回到畫面中心。
STEP6 斷線:
按下「斷線」按鈕之後,會中止藍牙連線(BluetoothClient.Disconnect指令),並使畫面上的各個元件恢復到程式一開始時的狀態。
操作
實際執行的時候,請先確認EV 已經開機且藍牙也啟動了。接著在您的Android 裝置上點選畫面中的「EV3裝置/連線」按鈕,會進到如圖1b的藍牙清單畫面,點選您所要的EV3主機名稱並連線成功後,即可在畫面上滑動手指來控制機器人,如下圖(圖5a、圖5b)。在App Inventor 官方推出EV3的元件之前,您也可以用這樣的方法來直接控制樂高EV3機器人喔!
註:
本程式已上架Google play,請到Google Play搜尋「CAVEDU教育團隊」就找得到我們的樂高機器人系列app 了。歡迎大家到App Inventor 中文學習網的檔案庫下載本程式的aia原始檔與apk安裝檔。
註1: 樂高EV3直接控制指令的相關文件請參閱此網頁。
註2: 想學如何開發App Inventor程式嗎? 請到AppInventor 中文學習網與我們一同學習。
註3: 與EV3連線後如果出現「Error 402」之錯誤訊息請不必理會,程式依然能正確執行。
文章原文刊載於《ROBOCON》國際中文版2015/1月號