2011年1月15日 星期六

Mailbox, NXT's communication method

http://4rdp.blogspot.com/2011/01/mailbox-nxts-communication-method.html?m=0

現在越來越多 NXT 玩家,利用藍芽通訊與電腦、手機或是其它 NXT 裝置相互聯結,但是裝置間通訊所運用的原理為何?我想許多朋友們不太清楚,因為最近跟 CAVE 的阿吉老師與台大土木三毓祥同學一起共餐,談論到這個話題。

CAVE 團隊集結各路人馬,致力於機器人教育,現在他們亦有能力開發 Android 手機控制 NXT 機器人,將會出一本書指導有興趣的玩家入門,這個領域我也非常有興趣玩玩,希望把手機控制功能加到公司產品應用上。

那回歸主題,先談一般通訊方法,常用兩種方式:一為信箱法 (Mailbox),另一為指令法 (Command)。

指令方法就是傳送文字字串,比如你要機器人向右轉,那麼控制端就傳送 "RIGHT" 控制字串給被控制端,被控制的裝置可以回應收到指令或是執行結果,當然你也可以設計一個簡單的不回應被控制器,只是這樣的設計方式在工業界很少被採用,因為工業產品的要求很嚴苛,不可以誤動作,因此必須回報狀態,以便進行下一步控制。傳送的指令通常有特定語法格式,一般區分指令與參數,例如 "RIGHT 90",RIGHT 就是指令,90 是參數表示角度,通常還會再加一個結尾字元表示該指令結束。所以傳送端字元一個字一個字送出,接收端一個字一個字收,無法及時處理的系統,那就會追加緩衝器 (Buffer),先把全部指令收進來,等有空時再逐一處理。採用此法設計通訊,也表示接收端要設計一個解譯程式 (Parser),才能知道傳送端所傳送的指令,這就不是一般人能夠簡單寫出來的程式。

那什麼是信箱法?它有什麼優缺點?為什麼 NXT (leJOS 除外,它用指令法) 會採用此法?
你就假想 NXT 內有十個信箱,藍芽擔任信差的任務,只是負責把訊息放在正確的信箱位置,這方法對應指令法,相當於 NXT 可以處理十個不同指令,你只要在指定的信箱放入參數值,你自己撰寫的 NXT 程式,自行定義相關意義,就可以控制 NXT 執行動作。信箱法簡化解譯程式的設計,使普通人可以簡單又快速上手,這就是 NXT 採用它的主要原因。而信箱法最大缺點在信箱數量限制,在 NXT上想超過十個指令,可以變通設計,取一個信箱傳送指令代碼,第二個信箱傳送相對應的參數值,這樣應該可以滿足高階運用的需求。第二項缺失在資料覆蓋,傳送者用同一信箱送兩筆資料,如果沒有通訊間確認機制,可能會發生沒收到第一筆資料,只收到第二筆資料。

另外要注意的地方,NXT 為了節省電力消耗,NXT 是不會自己主動對外傳送資料,當你有需要一直傳資料出去時,要記得重複執行傳送指令。最後給「超級有錢人」參考,一個藍芽 Dongle 可以接 7 個 SPP Device,如果想由一台電腦同時控制多台 NXT,但是不想透過一些 NXT 當通訊中繼站,就需要加接藍芽 Dongle。

8 則留言:

  1. 版主請問:我使用藍芽將筆電與NXT連接,執行藍芽遙控車程式後NXT螢幕上出現exception:16 at71(81),筆電螢幕出現communication disconnected,請問是怎麼回事?

    回覆刪除
  2. 您好,

    從你簡略描述問題情況,只能猜測如下:
    你應該不是用NXT-G設計程式,程式可能從它處抄來的,由於未見到程式碼,無法解釋發生什麼事?

    當NXT停止通訊,電腦端也會自然斷線。

    建議你先搞清楚程式每行意義,自然就有辦法除錯。

    回覆刪除
  3. 謝謝版主的回答,我是參閱阿吉老師所寫的機器人程式設計與實作一書中的範例檔藍芽遙控車,程式是使用JAVA編譯完成。我該如何寄程式碼給你看呢?能否給我你的信箱,謝謝。

    回覆刪除
  4. 您好

    阿吉老師的書我都有,告訴我頁次,回去可以幫你查看看。

    如果時間急迫,直接問CAVE是最好,他們也可以給你詳盡且滿意的答覆。

    回覆刪除
  5. Bridan:

    這位讀者已經找到我囉, 感謝您的幫忙~

    回覆刪除
  6. 阿吉老師,

    不客氣,只是提供適當的訊息而已,如需幫忙再聯絡。

    回覆刪除
  7. Bridan:請教一下,如果是這樣,那麼我如果要將NXT的藍牙訊息傳到手機裡面,那要如何做?因為我在Ai裡面沒有辦法找到對應指令設定接收的信箱號碼,還是我必須將byte讀進來再寫一個程序將NXT的訊息解開?謝謝。

    回覆刪除
    回覆
    1. RichyWay 您好,

      請先參考前文 http://4rdp.blogspot.tw/2009/05/vb-communication-with-nxt-over.html,手機端程式是必須將 byte 一一讀進來再去解碼,倘若還有疑問歡迎留言。

      刪除