2010年5月31日 星期一

使用NXC撰寫NXT程式---第六章 從感應器抓取資料

使用NXC撰寫NXT程式---第六章 從感應器抓取資料

一、Touch Sensor

//讓機器人撞到東西後會後退轉彎
task main()
{
    SetSensorTouch(IN_1);//設定 port 1接到碰觸感應器,IN_1 也可以用 S1取代
    OnFwd(OUT_BC, 80);
    while (true)
    {
      if (SENSOR_1==1)// port 1讀到的數值會存在SENSOR_1中
      {
        OnRev(OUT_BC, 80); Wait(300);
        OnFwd(OUT_B, 80); Wait(500);
        OnFwd(OUT_BC, 80);

      } //end if

    } //end while

}



二、Light Sensor

//簡易循跡車
#define _LIGHT 45
#define _POWER 50
#define _TURN_TIME 100
task main()
{
    SetSensorLight(IN_3); //或用 S3
    while (true)
    {
      if (SENSOR_3<=_LIGHT)//左轉修正
      {
        NumOut(5,20,SENSOR_3,true);
        Off(OUT_C);
        OnFwd(OUT_B, _POWER); Wait(_TURN_TIME);

      }
      else //右轉修正
      {
        NumOut(5,20,SENSOR_3,true);
        Off(OUT_B);
        OnFwd(OUT_C, _POWER); Wait(_TURN_TIME);

      }

    } //end while

}



三、Sound Sensor
(未完待續...)

四、Ultra sonic Sensor


五、角度 Sensor


六、進階用法

使用NXC撰寫NXT程式---第五章 將程式模組化

使用NXC撰寫NXT程式---第五章 將程式模組化

一、程序
sub 程序名(參數1,參數2,...)
{
    //程式碼...

}

//將轉彎的功能以程序包裝起來,要用時再呼叫。
sub turning(int power)
{
    OnRev(OUT_BC, power);//B、C反轉
    Wait(3000);
    OnFwd(OUT_C, power); //C正轉,B繼續反轉
    Wait(500);

}

task main()
{
    OnFwd(OUT_BC, 80);
    Wait(1000);
    turning(30); //呼叫turning,傳入30%的動力
    OnFwd(OUT_BC, 80);
    Wait(2000);
    turning(50); //呼叫turning,傳入50%的動力
    Off(OUT_BC);

}

二、函式 (function)
傳回值型別 函式名(參數1, 參數2,…)
{
//…
return 傳回值;
}

與程序主要的不同點在於:
函式可有傳回值,若無則傳回值型別以 void 表示。


//隨機傳回x~y的任一數
int myRand(int x, int y)
{
    int result;
    result = (x+ Random(y+1-x)); //隨機取 x~y
    return result;

}

task main()
{
    int time,power;
    time= myRand(2,5)*1000; //隨機取2~5秒
    NumOut(5,20,time,true);
    OnFwd(OUT_BC,80);
    Wait(time); //隨機等待2~5秒

    power= myRand(3,5)*10 ; //隨機取30、40或50
    NumOut(5,10,power);
    OnRev(OUT_C,power); //隨機以30%、40%或50%動力輸出
    Wait(time); //隨機等待2~5秒
    Off(OUT_BC);

}



三、inline function
inline 傳回值型別 函式名(參數1, 參數2,…)
{
    //…
    return 傳回值;

}

與函式之不同處在於:
程式在編譯前,會先行內擴展(就是取代啦!),
將函式中的程式碼直接複製一份在呼叫的程式中,
直接執行函式中的指令,並非以呼叫的方式來調用函式,
因此,使用inline function會使程式碼大小增加,
但因省掉函式呼叫時,位址與記憶空間需保留的堆疊運算,
執行效率會比較高。

如果您的程式很大,NXT記憶體寸土寸金,
當然就不適合使用inline function了。

2010年5月26日 星期三

使用NXC撰寫NXT程式---第四章 流程控制

使用NXC撰寫NXT程式---第四章 流程控制

一、迴圈
1. repeat(n) {...} //執行{ }中的程式碼n次

//讓機器人走一個正方形
#define _GO_STRAIGHT_TIME 3000
#define _TURN_TIME 700
#define _GO_STRAIGHT_POWER 80
#define _TURN_POWER 50

task main()
{
    repeat(4){

      OnFwd(OUT_BC,_GO_STRAIGHT_POWER);
      Wait(_GO_STRAIGHT_TIME);
      OnRev(OUT_C,_TURN_POWER);
      Wait(_TURN_TIME);

    }
    Off(OUT_BC);

}


2. while(條件) {...} //當條件成立時執行{ }中的程式碼

//讓機器人走一個正方形
#define _GO_STRAIGHT_TIME 3000
#define _TURN_TIME 700
#define _GO_STRAIGHT_POWER 80
#define _TURN_POWER 50

task main()
{
    int i=0;
    while(i < 4){
      OnFwd(OUT_BC,_GO_STRAIGHT_POWER);
      Wait(_GO_STRAIGHT_TIME);
      OnRev(OUT_C,_TURN_POWER);
      Wait(_TURN_TIME);
      i++;

    }
    Off(OUT_BC);

}



3. do {...} while(條件) ; //本迴圈至少會執行一次

4. for(初始設定;條件;每次迭代最後要執行的指令) {...}

//讓機器人走一個正方形
#define _GO_STRAIGHT_TIME 3000
#define _TURN_TIME 700
#define _GO_STRAIGHT_POWER 80
#define _TURN_POWER 50

task main()
{
    int i;
    for(i=0; i < 4; i++){
      OnFwd(OUT_BC,_GO_STRAIGHT_POWER);
      Wait(_GO_STRAIGHT_TIME);
      OnRev(OUT_C,_TURN_POWER);
      Wait(_TURN_TIME);

    }
    Off(OUT_BC);

}



二、條件判斷
1. if(條件){...} else {...}

//讓機器人隨意散步
task main()
{

    int run_time = 0; //宣告一個整數變數,名為run_time,其初值為0
    while (true){
      run_time = (3+ Random(6-3)); //隨機取 3~5
      NumOut(5,20,run_time,true);
      TextOut(5,10,"Go Straight!");
      OnFwd(OUT_BC,80); //設定B、C port 的馬達以80%的Power正轉。
      Wait(run_time*1000); //等待 run_time 秒
      if (run_time % 2 ==0){ //右轉
        NumOut(5,20,run_time,true);
        TextOut(5,10,"Turn Right!");
        OnRev(OUT_C,80); //設定C port 的馬達以80%的Power後退。
        Wait(run_time*1000); //等待 run_time 秒

      }
      else { //左轉
        NumOut(5,20,run_time,true);
        TextOut(5,10,"Turn Left!");
        OnRev(OUT_B,80); //設定B port 的馬達以80%的Power後退。
        Wait(run_time*1000); //等待 run_time 秒

      }

    } //end while

}


2.switch(條件){...}

switch(x)
{

    case 1:
      // 撰寫x==1 時要做的事...
      break; //跳出switch

    case 2:
    case 3:
      // 撰寫x==2或3時要做的事...
      break; //跳出switch

    default:
      // 撰寫當x不是1, 2, 3 時要做的事...
      break; //跳出switich

}
註:NXC的 switch 可以使用 string 型別來判斷喔!

2010年5月7日 星期五

使用NXC撰寫NXT程式---第三章 變數

使用NXC撰寫NXT程式---第三章 變數

一、變數命名規則
英文字母或_(底線)開頭

二、資料型別




資料型別說明範圍

bool

8位元無號數

0~255

byte

unsigned char

8位元無號數0~255
char8位元有號數-128~127
unsigned int16位元無號數0~65535

short

int

16位元有號數-32768~32767
unsigned long32位元無號數0~4294967295
long32位元有號數-2147483648~2147483647
mutex互斥程式碼
string字串
struct自訂結構
Arrays陣列


注意 : NXT 不支援 float 與 double 等浮點數型別

修正 :
感謝 探奇自然科學教室 指正


NXT 1.0x版本的韌體的確不支援浮點數,但是1.2x版的韌體就已經支援浮點運算。

在新版BricxCC的編譯選項選擇"Automatic firmware version" 或 "NXT 2.0 compatible firmware"就可以使用浮點運算。

請參考http://forums.nxtasy.org/index.php?showtopic=5093&view=findpost&p=38693


三、運算子
    1.算數運算子:

符號功能C++運算式數學意義

+

a = x + y

a = 5 + 3

-a = x - ya = 5 - 3
*a = x * ya = 5 * 3
/a = x / yfloat a;
a = 5 / 3; (結果a=1)
a = 5.0/3;
%取餘數a = x % ya = 5 / 3 的餘數
++遞增a = x++(先指派再遞增)
a = ++x(先遞增再指派)
a = 5++ (=6)
--遞減a = x--
a = --x
a = 5-- (=4)


    2.指定運算子:

運算子

功能

實例

結果

=

指定

i = 2

變數i的值為2

+=

相加後再指定

i +=2 相當於(i=i+2)

變數i的值為7

-=

相減後再指定

i -=2相當於(i=i-2)

變數i的值為3

*=

相乘後再指定

i *=2相當於(i=i*2)

變數i的值為10

/=

相除後再指定

i /=2相當於(i=i/2)

變數i的值為2.5

%=

餘數除法後再指定

i %=2相當於(i=i%2)

變數i的值為1

^=

做XOR運算後再指定(逐位元)

i ^=2相當於(i=i^2)

&=

做AND運算後再指定(逐位元)

i &=2相當於(i=i&2)

=

做OR運算後再指定(逐位元)

i =2相當於(i=i2)

<<=

左移指定運算

i<<=2相當於(i=i<<2)

>>=

右移指定運算

i>>=2相當於(i=i>>2)



其餘請參考 BricxCC安裝目錄中的Documentation\NXC_Guide.pdf

四、讓您的NXT隨意散步

task main()
{

    int run_time = 0; //宣告一個整數變數,名為run_time,其初值為0
    string name = "simfonia";
    run_time = (3+ Random(6-3))*1000; //隨機取 3~5秒
    OnFwd(OUT_BC,80); //設定B、C port 的馬達以80%的Power正轉。
    Wait(run_time); //等待 run_time 秒

    run_time = (1+ Random(4-1))*1000; //隨機取 1~3秒
    OnRev(OUT_C,80); //設定C port 的馬達以80%的Power反轉。
    Wait(run_time); //等待 run_time 秒

    run_time = (3+ Random(6-3))*1000; //隨機取 3~5秒
    OnFwd(OUT_BC,80); //設定B、C port 的馬達以80%的Power正轉。
    Wait(run_time); //等待 run_time 秒


    Off(OUT_BC); //關掉B、C port 的馬達電力,並剎車。

}


關於 Random(x) 函式:
Random(x)是NXC API 中的一個數學函式,它隨機傳回 0 ~ x 之整數值(可等於零,但小於 x )。
0 <= Random(x) < x
=> 0 <= Random(y-x) < y-x 同加上 x
=> x <= x + Random(y-x) < y => 可隨機傳回 x ~ y (小於y)之整數

2010年5月6日 星期四

使用NXC撰寫NXT程式---第二章 讓 NXT 動起來

使用NXC撰寫NXT程式---第二章 讓 NXT 動起來

一、讓 NXT 前進

task main()
{

    OnFwd(OUT_A,80); //設定A port 的馬達前進,以80%的Power。
    OnFwd(OUT_B,80); //設定B port 的馬達前進,以80%的Power。
    Wait(3000); //等待3秒
    Off(OUT_AB); //關掉A、B port 的馬達電力,並剎車。

}


相關函式及常數

OnRev(port,power) //反轉
OUT_AB, OUT_ABC, OUT_BC, ...




練習:讓您的NXT車子可以轉彎。



二、使用 #define 定義常數

#define _TURN_TIME 700 //#為前置處理,不屬於語言範圍,故不加";"
task main()
{

    OnFwd(OUT_BC,80);
    Wait(3000); //前進3秒
    OnRev(OUT_C,80);
    Wait(_TURN_TIME); //轉彎時間
    OnFwd(OUT_BC,80);
    Wait(3000); //前進3秒
    Off(OUT_BC);

}



練習:
一、把上述程式中的字面常數以#define定義。
二、讓您的NXT機器人走出一個正方形。

2010年5月4日 星期二

使用NXC撰寫NXT程式---第一章 Hello NXC

一、安裝BricxCC
Bricx Command Center (BricxCC)是一個整合開發環境(IDE),可讓我們用NXC(Not eXactly C,類似C/C++的語法)來撰寫程式,並透過NBC(Next Byte Codes )來編譯成rxe的NXT可執行檔。



所以說,
NBC是編譯器,
NXC是程式語言,
BricxCC是IDE。

請至下列網址下載並安裝。
test release版本可支援NXT 2.0的顏色感應器,
latest version版本為最新穩定版。

http://bricxcc.sourceforge.net/

二、啟動BricxCC
在啟動畫面中挑選如下設定


或啟動BricxCC後,執行 Tools/Find Brick 亦可與NXT連線。



三、介面環境說明及常用設定




1.開新檔案

2.輸入位置行列數

3.Download program,下載程式至NXT

4.Edit/Preferences/Compiler/Common,將使用語言改成NXC。

5.Edit/Preferences/Options/,將Code completion的Hot key改成 Ctrl+Alt+Space,以免與中文輸入法衝突。

6.程式碼書籤,在某行程式使用Shift+Ctrl+0~9可設定書籤,再按一次可清除該書籤,Ctrl+0~9可跳到該書籤。


四、Hello world!



task main() //程式可由多個task組成,但main是程式進入點
{

    ClearScreen(); //清除螢幕
    TextOut(10,2,"Hello world!"); //在 (10,2)的位置(第一象限)輸出 Hello world! 字串
    Wait(2000); //等候2秒

}

將上述程式碼存成nxc檔,經NBC編譯成rxe後,下載至NXT中執行即可。

以上寫程式的過程您也可以不透過BricxCC 這個IDE,
步驟如下:
1.用您喜歡的文字編輯器(如記事本、UltraEdit...等)撰寫程式碼。
2.存檔至BricxCC安裝的資料夾(預設是C:\Program Files\BricxCC),假設檔名為 hello.nxc
3.按 開始/執行 , 輸入 cmd 後按 Enter 。
4.在 Console 中,切換工作目錄: cd C:\Program Files\BricxCC
5.編譯程式碼,請輸入 nbc hello.nxc -O=hello.rxe >log.txt
6.在NXT-G 中,把hello.rxe下載至NXT中即可。