本期專題是教你如何根據樂高官方的文件來直接控制樂高EV3機器人。目前App Inventor中的LEGO MINDSTORMS元件區只支援NXT機器人,但是我們還是能自行編寫程式,做到直接控制的效果,機器人端則不用編寫程式。有接觸過App Inventor的師長朋友們,歡迎從App Inventor中文學習網下載原始碼回去,加入更多有趣的功能。
什麼是Direct Command?為什麼需要它?
Direct Command(註1)是樂高公司所提供的一種通訊格式。在機器人端不需要任何程式的情況下,只要建立通訊(USB、藍牙與 Wi-Fi)後對EV3主機發送位元陣列,就能達到諸多控制效果。因此不限於智慧型手機,只要是能夠與樂高機器人進行無線通訊(藍牙或Wi-Fi)的裝置,都能以此架構來通訊。不過請注意:NXT的無線通訊方式只有藍牙。
有了Direct command,只要與EV3藍牙配對,不需要任何程式就可以經由手機遙控機器人端,這樣的好處在於你不需要維護兩份程式碼。另外,手機端與機器人端的程式應該都是不同的程式語言,這樣也會增加開發上的難度。你可以使用將本程式的架構修改成姿態控制(orientation sensor)、觸碰點控制、語音控制等,讓你的機器人更豐富。根據樂高官方文件, 你可以使用Direct Command做到的重要功能有:
• 啟動/停止主機上指定檔名的程式。
• 控制馬達啟動、停止、轉向、電力與角度上限。
• 取得感測器值與狀態
開始玩機器人
本範例的機器人與2012年3月號的「按鈕控制」是一樣的,機器人不需使用任何感測器,只要用兩個馬達製作出雙輪機器人即可。本範例中是將馬達接在EV3主機的輸入端B與C。請確認EV3主機的藍牙已啟動,接著將EV3主機與Android手機進行藍牙配對(註2),完成之後就可以把機器人放到一邊了。啟動藍牙之後,你可以從EV3主機的螢幕左上角看到藍牙的符號。
接下來依序介紹程式的各個功能:
STEP1 登入畫面:
首次進入程式的畫面如圖1a, 這時只有「連線」按鈕可以按,其他所有按鈕都無法操作。點選「EV3裝置/ 連線」按鈕後進入藍牙裝置清單(圖1b),請找到剛剛配對完成的EV3 主機名稱(本範例為abc),點選之後就會由Android裝置對EV3主機發起藍牙連線。順利連線成功的話,「連線」按鈕會變成不可按的狀態,其他按鈕則都可按(圖1c)。
STEP2 程式初始化:
在點選連線清單之前(ListPickerConnect的BeforePicking事件),需先將清單內容指定為Android裝置上的藍牙配對清單(圖2a),其中connected這個布林變數是用來指示現在手機是否已和機器人成功連線。點選之後,會先測試連線是否成功,成功則將「連線」設為不可點選,「斷線」等按鈕設為可點選(圖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用變數來控制,透過speed變數就可以控制馬達的轉速與方向。最後透過BluetoothClient元件,將整個data清單經由藍牙發送給EV3機器人即可。
到了stop副程式,資料格式當然也有所改變。我們還用一個if判斷式去檢查stop參數是否為true,如果是則在data清單最後加入1,反之則加入0。這樣發送出去之後就能控制機器人是否要停止動作(圖3b)。藉由這樣的架構,當你要改用姿態控制、觸碰點控制、語音控制時,整體架構是不變的,差別只在於如何修改speed變數值而已。
STEP4 前進按鈕:
畫面上的各個按鈕,原則上差異只在於馬達是否轉動與轉動速度。以前進按鈕來說,點選之後會先檢查conntected變數是否為true,代表已連線。滿足條件的話就呼叫stop副程式,並傳入(3, false)這組參數,代表機器人不停止。接著呼叫start副程式並傳入(3, Slider.ThumbPosition)這組參數,代表根據滑桿位置來決定機器人速度,滑桿位置愈右邊機器人就跑愈快,如圖4a。
如果是後退的話,只要把滑桿位置值乘上-1就可以讓馬達反向轉動,這樣機器人就得以後退(圖4b)。
STEP5 左轉與右轉按鈕:
左轉與右轉按鈕也是相同的概念,你可以拉動滑桿來決定機器人的轉彎速度。請注意左轉與右轉所傳入的port參數值是不同的,這樣可以控制要轉動機器人左側(2)或右側(1)的馬達,以達到轉彎的效果(圖5)。
STEP6 停止按鈕:
按下停止按鈕,就會呼叫stop副程式並傳入(3, true)這組參數,代表停止機器人動作,如圖6。
STEP7 斷線:
按下「斷線」按鈕之後,會中止藍牙連線(BluetoothClient.Disconnect指令),並使畫面上的各個元件恢復到程式一開始時的狀態(圖7)。
操作
實際執行的時候,請先確認EV3已經開機且藍牙也啟動了。接著在你的Android裝置上點選畫面中的「EV3裝置/連線」按鈕,會進到如圖1b的藍牙清單畫面,點選你所要的EV3主機名稱並連線成功後,即可按鈕控制機器人。在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》國際中文版2014/11月號