[NXC] 藍芽連線-直接控制(Direct control)

這次要來跟各位介紹NXC在藍芽方面一個強大的功能-直接控制(Direct control)。

通常在寫藍芽的程式時,一定會有一個Master跟一個Slave兩個NXT,而兩個NXT都需要寫程式,才可以彼此互相收發資料。我們稱這個為主從關係下的藍芽通訊。

然而,今天要跟大家介紹的是另一種方式:直接控制。直接控制最大的特點在於只要Master寫程式即可,Slave不用寫程式,透過所謂的直接指令(Direct commands),Master可以直接發送訊息給Slave,而經由Slave的韌體本身直接接收Master的指令並作動。

以下提供一個範例程式,您需要兩個NXT,且藍芽連線要先建立好,建立好藍芽連線後,將範例程式下載到Master主機裡按執行即可直接開始控制Slave的NXT。

此程式的功能為:Master按下主機上的右箭頭,Slave的A馬達會轉,按下左箭頭則是C馬達會轉,按下中間橘色按鈕則馬達停止程式結束。

 

#include "NXCDefs.h"
#define BT_CONN 1
#define MOTOR(p,s) RemoteSetOutputState(BT_CONN, p, s, \
OUT_MODE_MOTORON+OUT_MODE_BRAKE+OUT_MODE_REGULATED, \
OUT_REGMODE_SPEED, 0, OUT_RUNSTATE_RUNNING, 0)
#define SENSOR(p,t) RemoteSetInputMode(BT_CONN, p, t, IN_MODE_PCTFULLSCALE)

sub BTCheck(int conn)
{
    if (!BluetoothStatus(conn)==NO_ERR)
    {
       TextOut(5,LCD_LINE2,"Error");
       Wait(1000);
       Stop(true);
    }
}
task main()
{
     BTCheck(BT_CONN);
     RemotePlayTone(BT_CONN, 4000, 300);
     until(BluetoothStatus(BT_CONN)==NO_ERR);
     Wait(300);
     RemoteResetMotorPosition(BT_CONN,OUT_A,true);
     until(BluetoothStatus(BT_CONN)==NO_ERR);
     while(ButtonPressed(BTNCENTER,true)!=1)
     {
         if(ButtonPressed(BTNRIGHT,true)==1)
         {
             MOTOR(OUT_A,50);
             MOTOR(OUT_C,0);
         }
         if(ButtonPressed(BTNLEFT,true)==1)
         {
             MOTOR(OUT_A,0);
             MOTOR(OUT_C,50);
         }
     }
     Wait(300);
     MOTOR(OUT_A,0);
     Wait(300);
     MOTOR(OUT_C,0);
}

有興趣的朋友們趕快來試試看吧!

2 thoughts on “[NXC] 藍芽連線-直接控制(Direct control)

  1. ALEX says:

    LABVIEW辦的到嗎
    [版主回覆06/23/2011 17:42:55]Alex:

       那你的控制端是裝有LabVIEW的另一個NXT主機, 還是就是LabVIEW?   前者應該是可以的, 後者的話就和直接控制差不多吧.

  2. ALEX says:

    是前者 但不知道這個功能
    [版主回覆06/28/2011 11:59:12]Hi Alex, 我目前的想法有兩種, 一個就是NXT I/O -> NXT Direct I/O -> Output下的指令, 應該建立好NXT object就可以了, 或是建立藍牙連線後發送16進位的位元陣列(byte array),  你試試看囉.

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *