文/曾吉弘(CAVE教育團隊)
延續上期用手機遙控機器人,本期要將您的Android做成一臺手持式資訊面板,可以持續更新NXT機器人的四種感測器資訊。
首先把NXT機器人準備好,並依序將觸碰感測器,聲音感測器,光感測器與超音波感測器接在NXT的1至4號輸入端,您之後可以自行修改感應器的連接埠。
請先確認NXT主機的藍牙是啟動的,接著請將NXT主機與Android手機進行藍牙配對,完成之後就可以把機器人放到一邊了,啟動藍牙之後您可以從NXT主機的螢幕左上角看到藍牙的符號(圖1)。
圖1 NXT主機藍牙已開啟(左上角)
接下來依序介紹App Inventor程式的各個功能:
STEP1:
首次進入程式的畫面如圖2,您可以看到只有 [連線]按鈕可以按,[斷線]按鈕則無法按下(Enabled屬性設為false),這時候只能點選[連線]按鈕。
圖2 程式首次執行的畫面
STEP2:
接著是將ListPickerConnect清單指定為已配對的藍牙裝置清單(圖3),點選[連線]按鈕之後,會進入Android裝置的藍牙連線清單(圖4),請找到剛剛配對完成的NXT主機名稱(本範例為abc),點選之後就會由Android裝置對NXT主機發起藍牙連線,跳回主畫面之後您可以看到感測器的資訊已經更新在Android裝置畫
請注意我們在NXTList.AfterPicking事件中加入一個if,來判斷是否成功建立藍牙連線(BluetoothClient.Connect),如圖5。這可以處理在非預期情況下的斷線情形,例如機器人沒電而關機或是手機來電等狀況,此檢測步驟可避免程式發生錯誤。圖5中下方的NxtSensorLight1.GenerateLight指令使光感測器前端發出紅光,您可以將True改為Flase來關閉光感測器前端光源。
圖3 將ListPickerConnect清單內容指定為已配對的藍牙裝置清單。
圖4 Android裝置的藍牙連線清單
圖5 再次檢查藍牙連線是否成功
STEP3:
本程式的關鍵就在這一步:使用Clock元件來定時更新感測器值。在App Inventor中所有與時間有關的功能,包括時鐘、計時器與碼錶等等都由Clock元件負責。請將Clock元件的屬性如圖6來設定,代表每200毫秒觸發一次計時器,這就是我們所希望感測器更新數值的頻率。
圖6 Clock元件屬性設定
我們依照連接埠的順序來介紹各種感測器的運作方法。首先,App Inventor透過NxtTouchSensor1.IsPressed來偵測觸碰感測器是否被壓下,如果壓下就為True,本程式在此以一個if…else結構來更換按鈕的底色來達到燈號的效果。
接著,請注意App Inventor抓回的聲音感測器與光感測器值為原始(raw)值,介於0到1023之間,音量愈大。您可以從圖8中看到我們將聲音感測器的原始值除以10.23來換算成百分比值。
最後是超音波感測器,由於它是一種I2C數位感測器,會直接將超音波發射後撞到物體後回傳的時間換算為距離之後顯示在螢幕上,單位為公分。
圖7 感測器的值更新在畫面上了
圖8 使用Clock元件來定時更新感測器值
STEP4:
按下[斷線]按鈕之後,會斷開藍牙連線(BluetoothClient.Disconnect),並使按鈕恢復到未連線時的狀態。這時候您可以再次發起連線。
圖9 按下[斷線]按鈕時中斷藍牙連線
STEP5:
本範例一樣加入了超連結功能,上一期的範例是跳轉到CAVE官方網站(http:www.cavedu.com),這次是跳到App Inventor中文學習網,有許多豐富的App Inventor教學範例與課程說明。請點選畫面下方的可愛圖樣,點選之後就能跳到App Inventor中文學習網。這是藉由App Inventor的ActivityStarter來呼叫Android裝置上的WebKit瀏覽器,網址是從DataUri來指定為http://www.appinventor.tw。
圖10 點選CAVE圖案會跳到App Inventor中文學習網
實際執行的時候,請先確認NXT已經開機且藍牙也啟動了。接著在您的Android裝置上點選程式畫面中的「連線」按鈕,點選NXT主機名稱就會自動連線,連線完成就能看到感測器值不停更新啦。
請注意由於程式一開始尚未進行藍牙連線時,程式就會試著去抓感測器的值,當然什麼也抓不到。這也就是為什麼圖2中的感測器值會為-1的原因,-1是代表無設備或無連線,並非感測器值真的為-1。
另一方面,藍牙發送與接收訊號皆會有一定的延遲時間(30~40毫秒),加上我們設定計時器的觸發頻率為200毫秒,加加起來就快0.3秒啦!因此實際執行時感測器值更新會有點lag,這是正常的。
為什麼感測器的反應會頓頓的呢?有使用過樂高機器人的朋友, 一定有在螢幕上檢視感應器數值的經驗,應該是相當順暢才對。那為什麼在Android 手機上看就變得頓頓的, 好像慢半拍的感覺呢?原因就在於藍牙傳輸來回需要時間。由於我們是從Android 手機端對NXT 機器人發出要求,請它傳回指定感應器的數值,機器人接收到之後就會回傳。這樣一來一往各會用掉30 ∼ 40 毫秒,相加的話最大會用掉0.08 秒!這已經是我們感覺得到的延遲時間了。當然會有比直接在NXT 機器人端直接觀看數值來得慢的感覺囉!
(比較:一般卡通片是一秒24 張圖,也就是每0.042 秒換一張圖。)
在上一篇的按鈕控制也是同樣的道理,雖然在該範例中沒有從NXT 機器人擷取回任何感測器數值,但每次我們點選按鈕來控制機器人動作時,機器人還是會回傳一個確認碼/位元告訴Android 手機:「我已經正確接收指令並執行完畢。」這是在一般網路傳輸中必要的通訊機制喔!
請要下載本程式來玩玩看的朋友,請由以下連結下載:
http://dl.dropbox.com/u/11288673/NXT_ButtonControl.apk
或掃描以下的QRCode也可以唷!
註1:App Inventor伺服器目前正由Google移轉至麻省理工學院行動研究中心,預計在近日推出新的服務。使用介面將無重大改變,在過渡期間想要申請測試帳號的讀者請至以下連結申請:http://appinventoredu.mit.edu/。
註2:CAVE教育團隊所提供的App Inventor指令中文化手冊請至http://www.appinventor.tw下載。
註3:如何將您的手機設定為可自行安裝非Market下載的程式請參考:http://www.appinventor.tw/phone。
註4:讓Android手機與樂高NXT主機連線的詳細步驟請參考:http://www.appinventor.tw/connecttonxt。
文章原文刊載於《ROBOCON》國際中文版2012/5月號