[NXC] 具有數據記錄功能的PID軌跡車(PID Line-following robot with data logging)

之前我們曾介紹MATLAB這個功能強大的數學軟體,並用它來設計NXT的程式。之後更透過PID控制原理做出軌跡車,並畫出誤差對時間的關係圖,比較P控制、PI控制、PID控制的效果(連結請點我)。

最近在帶科學小芽子的學生使用NXC進行這個專題。NXC不像MATLAB一樣需要與電腦連在一起才可讓機器人執行程式,但也因此無法像MATLAB一樣可以使用簡單的指令在電腦上直接畫圖,在MATLAB中,我們可以將數據記錄在一個或兩個夠長的陣列中,並在程式中讀取這些數據,再畫圖顯示在電腦螢幕上。NXC則無法這樣做,因為程式在執行時無法直接把資料回傳給電腦,然而機器人的行動力可以更高,這是無庸置疑的。

因此,要使用NXC做到數據記錄(Datalog)的功能,我們將需要用到NXC的讀檔與寫檔(File I/O)功能,也就是讓NXT創造一個純文字(.txt)檔,將數據直接寫進檔案,並存在NXT的記憶體裡,程式執行完後,就可以把檔案抓出來,並用Excel之類的軟體繪圖。

讓我們先看一個簡單的範例,程式將每隔1毫秒讀取一次光感的值,共600次,記錄每次讀取到的值與所對應到的時間,儲存在純文字檔裡:

#define size 600
task main()
{
     string val;
     string time;
     string data;
     int t1;
     int t2;
     short bytesWritten;
     byte fileHandle;
     SetSensorLight(S2);
     DeleteFile("Datalog.txt");
     if(CreateFile("Datalog.txt",7000,fileHandle) == NO_ERR)         //創造一個名為Datalog.txt的純文字檔
     {
          t1=CurrentTick();
          for(int i=0; i<600; i++)
          {
               val = NumToStr(Sensor(S2));                       //讀取光感值,並轉成字串
               t2 = (CurrentTick()-t1);                                  //計算時間
               time = NumToStr(t2);
               data = StrCat(val," ",time);
               WriteLnString(fileHandle,data,bytesWritten);         //寫入檔案
               TextOut(0,LCD_LINE6,val);
               Wait(1);
          }
     }
     CloseFile(fileHandle);
     PlayTone(660,100);
     Wait(100);
}

程式跑完後,打開 Tools 裡的 NXT Explorer,您就會發現多了一個Datalog.txt的檔案:

這個就是NXT創造的純文字檔,您可以將它拉到桌面並打開,以下是科學小芽子的學生鍾詔安的測試結果:

結果(Datalog.txt):

毫秒   光值

17 38
56 41
58 41
59 38
60 38
61 38

          .
          .
          .
          .
   共600組資料

繪圖(利用Excel):

最後,結合這幾週的題目-應用PID控制原理的軌跡車,學生們將數據記錄的程式加入PID軌跡車的程式裡:

程式執行完後,得到以下資料(為科學小芽子學生王淳謙的測試結果):

毫秒     誤差

11 -11
58 -11
61 -12
65 -12
68 -12
71 -12

           .
            .
     &nbs
p;      .
            .
    共 1000組資料

並且繪圖:

其中橫軸為時間,縱軸為誤差。

讀檔與寫檔是NXC的一個重要且實用的功能,也是我們NXC書將來會新增的內容。

歡迎留言討論喔!

One thought on “[NXC] 具有數據記錄功能的PID軌跡車(PID Line-following robot with data logging)

  1. says:

    想請問一下有沒有指令可以不用再從NXT Explorer把檔案拉出來而是可以直接將檔案傳至電腦指定位子
    [版主回覆03/08/2013 22:58:36]我記得NXC 好像沒有這樣的指令,因為 NXC 是單機執行的程式。您的需求可以從 LabVIEW 來做到

發佈留言

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