這次要來跟各位介紹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);
}
有興趣的朋友們趕快來試試看吧!
LABVIEW辦的到嗎
[版主回覆06/23/2011 17:42:55]Alex:
那你的控制端是裝有LabVIEW的另一個NXT主機, 還是就是LabVIEW? 前者應該是可以的, 後者的話就和直接控制差不多吧.
是前者 但不知道這個功能
[版主回覆06/28/2011 11:59:12]Hi Alex, 我目前的想法有兩種, 一個就是NXT I/O -> NXT Direct I/O -> Output下的指令, 應該建立好NXT object就可以了, 或是建立藍牙連線後發送16進位的位元陣列(byte array), 你試試看囉.