買書捐殘盟

2011年8月19日 星期五

Google App Inventor -手機藍芽遙控Segway

這兩天使用Google App Inventor 將VB版的操作平台,實現在App Inventor上,操作時可以直接在手機上使用。

Google App Inventor 設計區安排的介面如下:


操作面板上,點選藍芽連線的按鈕,選擇與之匹配的NXT,即完成連線。

程式區,結構如下:

解釋:軟體啟動後,將預備顯示的區塊設定顯示(visible true)、不想出現的先隱藏(visible false)
ListPicker.BeforePicking等待使用者回應按鈕,使用者按下後,則進入挑選清單。
清單裡頭包含已被手機偵測到的藍芽裝置都會出現在畫面中。


解釋:
當ListPicker.BeforePicking按下按鈕後,被選到的清單藍芽裝置便會與手機連線。
如果連線成功,則出現Connecting...字樣
如果連線失敗,則出現can not be connected!



解釋:
當藍芽離線後,畫面出現Wait之字樣(回到初始狀態)。



解釋:
本例僅作ForwardBtn的操作。
當使用者按下ForwardBtn按鈕,程式指定ControlMessage之變數值為F,且透過
NxtDirectCommands1.MessageWrite的方法,指定mailbox為1、message為ControlMessage,
將變數的文字傳出給NXT。(NXT為接收端,程式須設計接收訊息)

附帶一提,一個很簡單卻又很重要的一個設定,少了這個操作,你的手機還是無法與nxt連結,那就是點選NxtDirectCommands1,右邊的Properties,須指定為BluetoothClient1


最後,Connect to Device,選擇你的手機,就可以開始操作了。

-----------------
至於NXT端的程式,程式碼如下:
#include "NXCDefs.h"

#define Touch IN_1

void BTCommCheck(int conn)
{
if (BluetoothStatus(conn)!=NO_ERR) //如果nxt未與主機連線
{
TextOut(5,LCD_LINE2,"Error");
Wait(1000);
Stop(true);
}
}

//-----------------------------------------
task main()
{
 string ControlMessage;
 int power=20,power_left,power_right;
 BTCommCheck(0);
 SetSensorTouch(Touch);
 ClearScreen();
 while(SENSOR_1==0)
 {
   ReceiveRemoteString(MAILBOX1,true,ControlMessage);
   TextOut(0,LCD_LINE1,ControlMessage);
 }
}

10 則留言:

  1. 這兩天摸索App inventor的藍芽,總算在try error的過程找到了,現在可以從手機傳遞文字,透過mailbox的方式傳到nxt.

    首先,App inventor在藍芽搜尋裝置,無須指定SerialPort,當你的程式引入BluetoothClient元件後,它會自動去抓已偵測到的鄰近裝置,由使用者點選並連線。

    其次,App inventor在mailbox傳遞訊息,與VB大相逕庭的是,VB是利用byteOut的陣列傳遞一串陣列值,而App inventor則利用NxtDirectCommand元件的MessageWrite方法,指定mailbox=1
    以及要傳遞的message即可。

    至於nxt的接收端的程式碼,似乎無須特別改變即可使用。

    回覆刪除
  2. 剛剛反覆欣賞著早上拍的這一段影片,從segway負重、行走障礙,跌跌撞撞失敗,到總算成功的整段歷程,回想起這一路來,不斷得找資料,研究,並與先進們交換心得與建議,我想,除非曾經經歷過,要不然旁人是無法感受到這箇中滋味。
    所以在欣賞這段影片的時候,不禁喜悅從心中而來!!

    回覆刪除
  3. 我很佩服樂高公司研發的這一套產品,不但結合了機構組裝,對於軟體建設更是智慧的結晶。從機構的組裝去了解動力的運行,從軟體建設的開發,讓機器人賦予一個生命。

    回覆刪除
  4. 結果老師跳槽用NXC啦, haha~ (阿吉)

    回覆刪除
  5. 阿吉老師好:NXC比較易上手,lejos也可以啦~ :p
    我比較習慣nxc~哈哈

    回覆刪除
  6. matlab比較可惜的是,它的程式執行端依舊在電腦上,並不是載入到NXT裡,雖然它可以使用藍芽無線連線,但控制的效果,恐怕會有lag的情形。

    回覆刪除
  7. 老師:
    請問,如果我想要用在自走車上面,程式寫法跟NXT一樣?
    謝謝你

    回覆刪除
  8. 你的自走車硬體,是哪一種? 有些人使用單晶片設計,有些人用FPGA,或者像我使用nxt,但程式的algorithm類似!

    回覆刪除
  9. 薛老師您好:您上面程式是由手機傳訊給NXT,如果要用NXT傳訊給手機,您有試過嗎?因為我試了很多次都沒辦法成功。會是信箱法與指令法的差異嗎?因為使用NXT送出時指定信箱,但是在Ai這邊沒有對應的指令可以指定接收的信箱。

    回覆刪除
    回覆
    1. 本作品是手機傳給nxt沒錯!理論上都是mailbox互相傳訊。

      刪除