工程筆記本 / NXC/RobotC/C++ for Lego robot

NXC/RobotC/C++ for Lego robot

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

CAVEDU 阿吉 - 雜工📅 2011-06-19👁 66

這次要來跟各位介紹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);
}

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

相關文章 📎

留言 💬 (0)

還沒有留言,來當第一個。