置頂文字

歡迎來訪 !! 如有任何問題歡迎一起討論或是 eMail 給我 legorunmail@Gmail.com

2010年11月8日 星期一

兩台樂高 NXT 透過藍芽傳資料

當你手上有兩台樂高 NXT 時如果可以互動的話應該會更有趣,在這個想法下又買了一台 NXT 8547 所以來試試看兩台NXT要如何互傳資料。

首先要區分誰要當Master與Slave而Master的代號是0、Slave的代號為1、2、3,因此Master只能有一台而Slave最多三台也就是連線時最多是一對三。

每一台NXT 可以接收訊息的MailBox有10個每個MailBox只能存一則訊息 ,雖然不多可是善加利用也可以做出許多不同的組合。

首先你必須先讓AB兩台NXT建立信任的藍芽連線,由A找B的話A就是Master(0)、B就是Slave(1)

再來就是Master與Slave程式碼 


Master 範例

#define BT_CONN 1    //指定與第一台Slave連線
#define INBOX 1          //接收Slave傳來的資料位置
#define OUTBOX 2     //傳送到Slave的信箱位置

sub BTCheck (int conn){
    if (!BluetoothStatus(conn)==NO_ERR){
        TextOut(5,LCD_LINE2,"BT  Error");             //無法找到 Slave時顯示錯誤訊息
        Wait(1000);
        Stop(true);
    }
}

task main(){
        BTCheck (BT_CONN); //檢查與slave之連線
        int x1=0;
        while(true){
               if(ButtonPressed(BTNCENTER, false)){   //按下中間 Enter鈕時送出訊息 3 到Slave
                   TextOut(5,LCD_LINE1,"Send Slave=3");
                   SendRemoteBool(BT_CONN, OUTBOX, 3);
               }
               ReceiveRemoteBool(INBOX, true, x1);     //接收Slave信息資料「x1」
               if(x1!=0){
                  ClearScreen();
                  NumOut(5,LCD_LINE3,x1);                     //顯示Slave傳送的數值「x1」
                  Wait(1000);
                  x1=0;
                  ClearScreen();
                  TextOut(5,LCD_LINE1,"Waiting...");
               }
        }
}


-------------------------------------------------------------------------------------------------------------------


Slave 範例

#define BT_CONN 0      // 對Slave而言 Master 都是連接在 0
#define INBOX 2            //這必須是 Master的OutBox信箱位置
#define OUTBOX 1       //這必須是 Master的InBox信箱位置

sub BTCheck(int conn){
    if (!BluetoothStatus(conn)==NO_ERR){
        TextOut(5,LCD_LINE2,"BT Error");  //無法找到 Master 時顯示錯誤訊息
        Wait(1000);
        Stop(true);
    }
}

task main(){
    BTCheck(BT_CONN);
    int x2=0;
    while(true){
         ReceiveRemoteBool(INBOX, true, x2);          //檢查信箱是否有資料「x2」
         if(x2!=0){
            ClearScreen();
            NumOut(5,LCD_LINE3,x2);                      //顯示資料「x2」
            Wait(1000);
            x2=0;
            ClearScreen();
            TextOut(5,LCD_LINE1,"Waiting...");
         }
        if(ButtonPressed(BTNCENTER, false)){              //按下中間 Enter鈕時送出訊息 6 到Master
            TextOut(5,LCD_LINE1,"Send Master=6");
            SendResponseBool(OUTBOX,6);                    //Slave回應主機要用SendRespone
        }
    }
}

沒有留言:

張貼留言