延伸學習:NXC

 樂高 NXT 機器人LEGO官網

(一)NXT 藍牙機器人硬體系統組成

藍牙機器人硬體是由 NXT 智慧型主機(Intelligent Brick即控制器)、伺服馬達(Interactive Servo Motor)、感應器(Sensor)等組成,如圖所示。NXT 控制器如同人的大腦,伺服電機好比人的肌肉,提供動力,感應器就像人的五官,先接收外界環境的資料,再傳送回大腦進行處理。

(二)NXT 控制器簡介(可程式化的控制主機


 1:『輸出埠』:連接馬達或燈泡的3個輸出埠(A、B、C)。
 2:連接電腦的USB埠。
 3:LCD螢幕:顯示NXT主機運作狀態,100x64 像素黑白圖顯示,可視區域 26mm x 40.6mm。
 4:進行NXT主機功能選單的按鈕。
  6 橙色按鈕:電源ON、確定、程式執行。
  7  灰色箭頭按鈕:用於移動左、右的選單。
  8 深灰色按鈕:回上一頁、取消、電源OFF(主選單)。
 
 5
:連接4個感應器的輸入埠(1、2、3、4)

『輸入埠』:4個6線數位介面,支援數位和類比介面,連接感應器(Sensor)。
  (1)觸碰感應器:例如碰碰車。
  (2)聲音感應器:偵測音量大小,0-100分貝(db)。
  (3)光感應器:偵測光源亮度,0-100%(數值越大時越亮)。
  (4)超音波感應器:偵測測量距離0-255cm,若距離受測物過遠或過近都會顯示「??????」錯誤訊息。

 電源:6個 AA 電池,1400mA 的鋰電池板。
 連接線:6線工業標準連接線 RJ12 右側卡口。
註:公用程式/Wav2Rso

(三)I/O port



(四)伺服馬達(Interactive Servo Motor):內置角度感測器可以測量速度和距離。

 伺服馬達:
  正轉方向:
 常用的 Function:
    OnFwd(port,power);   //馬達正轉
    OnRev(port,power);    //馬達反轉
 
 例如:
    OnFwd(OUT_B,50);    //Port B所接馬達以50% power往正方向轉動
    OnFwd(OUT_B,-50);   //讓馬達反轉

(五)NXT 主機功能選單:

    • My Files:用來管理、執行使用者所設計的程式(下載【F6】到NXT控制器)或聲音檔等資料。
    • NXT Program:提供使用者直接在NXT主機上編寫程式(僅能設計5個步驟)。
    • View:可透過內建的程式測試馬達或是sensor的數值。例如:光源強度、馬達的角度、或聲音等。
    • Blueteeth:藍芽功能選單,包括開關NXT的藍芽功能,及與其他藍芽裝置之搜尋、連線功能等設定。
    • Setting:可對控制器進行一些設定,例如音量、進入待機時間、刪除檔案等。
    • Try Me:測試各個感應器或馬達是否正常連線運作(會以聲音或圖示來反應是否正常)。

一、NXC 軟體

  • LEGO MindStorms Education NXT是用來設計NXT機器人程式的軟體,為圖形化程式編輯軟體,NXT-G (G代表Graphic)的設計界面和一般視窗軟體相似,操作相當容易,瀏覽: NXT-G 編撰 NXT 程式
  • 此外,2001 年 Dave Baum 發表了NQC(Not Quite C), 是一套給樂高 RCX 主機使用的類 C 語言,程式環境是RCX Command Center,之樂高NXT機器人發表,John C. Hansen 等人將NQC 語言延伸改版為 Bricx Command Center。Bricx Command Center(簡稱BricxCC)是一個整合開發環境(IDE),可讓我們用NXC(Not eXactly C,類似C/C++的語法)來撰寫程式,並透過NBC(Next Byte Codes )來編譯成 rxe 的NXT,支援所有樂高智慧型主機以及眾多的第三方程式語言。

二、NXC 安裝&環境簡介

 BricxCC官方網站→下載 BricxCC 開發環境(test_release版本可支援NXT 2.0的顏色感應器)為免費軟體。因 BricxCC 不包含NXT 驅動程式,請至樂高 MindStorms 官方網站下載 NXT驅動程式

(一)啟動 BricxCC

  • 畫面如下設定:選擇Port【usb】、Brick Type【NXT】;或進入BricxCC後,執行【Tools→Find Brick】。

(二)環境說明

 
註:
1:Compile program(F5)
2:download program(F6)
3:Run program(F7)
4:Stop program(F8)

:開新檔案
註:
(1)程式檔:存檔類型為*.nxc
(2)程式註解方式,與C相同:
  • 多行註解: /*註解文字*/
  • 單行註解: //註解文字

三、程式結構

(一)程式結構:大致與 C 相同。

【程式設計1(檔名:nxc_ex.nxc)

【程式設計2


(二)馬達控制

  • 常用的 Function(函式)

 OnFwd(port,power); //馬達正轉(讀取power正值)
 OnRev(port,power); //馬達反轉(讀取power副值)
 Off(port);         //讓某個port所連接的馬達停止轉動
例如:
 OnFwd(OUT_A,80);     //Port A所接的馬達以80% power往正方向轉動
 OnFwd(OUT_A,-50);    //讓馬達以50% power反轉
 RotateMotor(port,power,angle);  //馬達以特定power轉某個角度

 MotorRotationCount(port);  //讀取某個port所連接之馬達的角度

 RotateMotor(OUT_A,70,45);    //port A馬達以70% power正轉45度
 RotateMotor(OUT_A,-70,45);   //port A馬達以70% power反轉45度
 x=MotorRotationCount(OUT_A) //讀取port A目前轉的角度,初始值為程式開始執行時的馬達角度
 Wait(ms)              //程式等待幾毫秒的時間
 Stop(bool value)    //如果value=1,則終止整個程式執行
 CurrentTick()    //讀取從程式開始到目前的毫秒值
 

例如:
(檔名:nxc_RotateMotor-1.nxc)
task main()
{
    OnFwd(OUT_B,50);Wait(500);  //B馬達以50% power正轉
    RotateMotor(OUT_B,50,360);   //B馬達正轉一圈
    RotateMotor(OUT_B,50,-360); //B馬達反轉一圈
    RotateMotor(OUT_B,-50,-360);//B馬達正轉一圈
    RotateMotor(OUT_C,50,-360); //C馬達反轉一圈
    RotateMotor(OUT_C,-50,360); //C馬達反轉一圈
}

(三)螢幕控制

  • 座標原點在LCD螢幕之左下角。
 ClearScreen( );               //清除螢幕
 NumOut(x,y,value,clear=false);    //螢幕x,y位置輸出value數字,clear為是否要先清除螢幕,不填時預設為false
 TextOut(x,y,msg,clear=false);     //螢幕x,y位置輸出msg文字,clear為是否要先清除螢幕,不填時預設為false
                                              //x、y值單位為螢幕上的一個點,但y值也可以填LCD_LINE1~8,整個螢幕可分為8行,第一行在最上方。
註:x、y值單位為螢幕上的一個點,而y值也可以填LCD_LINE1~8,整個螢幕可分為8行,第一行在最上方。

  • 螢幕相關函數:有LineOut(畫線)、PointOut(畫點)、CircleOut(畫圓)、RectOut(畫方形)等功能。參閱:BricxCC安裝目錄(C:\Program Files\BricxCC\)中的Documentation\NXC_Guide.pdf

(四)實作練習

範例1:在LCD螢幕顯示文字。(檔名:nxc_ex1.nxcnxc_ex1-2.nxc)

【程式設計1

(1)開新檔案:選取【File→New】(Ctrl+N) 即可如上圖示,編撰程式碼。
(2)儲存檔案:按下【File→Save】(Ctrl+S) 存檔後,即可編譯執行程式;程式檔存檔類型為*.nxc
(3)編譯執行:分別按下【F5】編譯→將USB線連接電腦與NXT,接著按【F6】下載程式至NXT按下【F7】執行,即可在NXT螢幕顯示"Hello NXC!"。

【程式設計2


 範例2:BC馬達直走2秒鐘後停止。(檔名:nxc_ex2.nxc)

【程式設計

註:OUT_AB、OUT_AC 、OUT_BC、OUT_ABC等,表示對這些port同時控制。
→行3&4可合併為 OnFwd(OUT_BC,70);  //BC port 馬達一起以70% Power前進。


 範例3:使用 #define 定義常數,BC馬達直走1秒鐘後轉彎,再直走1秒鐘。(檔名:nxc_ex3.nxc)

【程式設計

註:OnRev(OUT_BC,70);    //BC port 馬達一起以70% Power後退。


延伸思考:讓NXT車子走出一個正方形。


四、變數、運算子、運算式

(一)變數命名規則

變數名稱由英文字母、或 _ (底線符號)構成例如 my_name(建議最好不要以中文命名);變數名稱不能包含空白字元及特殊字元,例如 ~、\、@、?、%、&、#、^
等;所有的變數皆必須宣告後才能使用。

【程式設計

(二)變數的資料型別

 資料型別  資料種類/說明 佔用記憶體  數值範圍
 short
 int
 具符號短整數 2 bytes  -32,768 ~ 32,767
 long  具符號長整數 4 bytes  -2,147,483,648 ~ 2,147,483,647
 bool  無符號布林  1 byte  0 ~ 255
 char  具符號字元 1 byte  -128 ~ 127
 byte
 unsigned char
 無符號位元組
 無符號字元
1 byte

 0 ~ 255

 unsigned int  無符號短整數 2 bytes  0 ~ 65,535
 unsigned long  無符號長整數 4 bytes  0 ~ 4,294,967,295
 mutex  互斥程式碼     
 string  字串     
 struct  自訂結構     
 Arrays  陣列     

(三)運算子(Operator)應用

 範例4:變數值遞增應用(檔名:nxc_ex4.nxc)

【程式設計

  • 參閱:BricxCC安裝目錄(C:\Program Files\BricxCC\)中的 Documentation\NXC_Guide.pdf

(四)實作練習

 範例5:讓NXT隨機移動。(檔名:nxc_ex5.nxc)

【提示Random(x)是NXC API中的數學函式,產生某特定範圍的亂數,例如:產生 m <=r<= n 的亂數,公式如下:

  int r=m+Random(n-m+1);              // 產生 m <= r<= n 的亂數

【程式設計


 範例6:顯示馬達轉動的角度。

【程式設計(檔名:nxc_angle.nxc)



 範例7:多個task組成程式之應用。

【程式設計(檔名:nxc_ex7.nxc)

五、流程控制 重複結構-(repeat、while、do~while、for)、選擇結構-條件判斷(if~else、switch)

六、將程式模組化 將程式模組化

七、感應器(sensor)應用 講義

延伸思考:機器人一開始是靜止,拍一下手掌便直行走,再拍一下暫停動作,再拍一下又繼續行走。


 數位學習網