Category Archives: NXC/RobotC/C++ for Lego robot

[RobotC] 藍牙傳輸馬達編碼器值

咱們對於 RobotC 的教學文章比較少,但淡江電機大一的基礎電機實驗下學期就是使用 RobotC 帶領學生進入 C語言與機器人控制的領域(上學期使用 NXTG圖形化軟體)

本範例是將一台 NXT 的兩個馬達(作為手把,所以不會轉動)的編碼器值透過藍牙送給另一個NXT。接收之後顯示在螢幕上。

事實上可以顯示在螢幕上,下一步就可以用這兩筆數值來控制馬達電力,遙控機器人就完成啦。請期待我們下一個範例喔!

2014-05-26 10.21.28

[youtube=http://www.youtube.com/watch?v=73oSUdFpTTY]

發送端

task main()
{
   nMotorEncoder[motorA] = 0;
   nMotorEncoder[motorB] = 0;
   while(true){ 
      wait1Msec(300);
      int my_number,my_number1; 
      my_number=nMotorEncoder[motorA];
      my_number1=nMotorEncoder[motorB];
      sendMessageWithParm(my_number,my_number1);  //將兩筆資料一起送出
}
}
發送端 - 將兩筆馬達編碼器值送出

 

接收端

task main()
{
   int message_first;
   int message_second;
   while(true)
   {
      message_first = messageParm[0]; //取出第一筆資料
      message_second = messageParm[1];  //取出第二筆資料
      if(message_first != 0 || message_second != 0)  //如果兩者任一不為零
      {
         nxtDisplayBigTextLine(2,"1: %d",message_first);
         nxtDisplayBigTextLine(4,"2: %d",message_second);
         ClearMessage();  //清除藍牙暫存區
      }
      wait1Msec(300);
   }
}
接收端 - 接收藍牙訊息之後顯示於螢幕

[RobotC] Sariel 的 遙控NXT

http://sariel.pl/2012/10/nxt-virtual-subtractor/

Sariel的遙控車, 用RobotC來開發。 用左側的香菇頭來控制機器人動作。上面連結有Sariel提供的robotC原始碼, 大家可以玩玩看。

CAVE也有許多類似的專題, 使用LabVIEW or Android, 歡迎看看:

Android + NXT: http://lab.cavedu.com/android

LabVIEW + NXT: http://lab.cavedu.com/labview

[簡易數學應用]移動平均法

每秒抓一次光感測器資料, 並使用陣列來儲存. 並取前3筆歷史資料進行平均, 這樣可避免突發的過高/低值影響機器人運作。

移動平均法每筆資料比重相同, N筆資料的比重就是1/N。 我們可以將較舊的資料比重調低. 例如 0.4 + 0.3 + 0.2 + 0.1。 最舊的資料只占比重的10%,  這稱為加權平均法。

此方法常應用在二輪平衡車, 用來平滑Gyro 的突發震盪。

================================================================
task main(){
int sum, i=0, arr[4]

SetSensorLight(S2){
while(true){

arr[0] = Sensor(S2); Wait(1000);  //sample once per second

for(i=1 ; i<4; i++){

arr[i] = arr[i-1]; //前一筆資料往後推
}
sum = (arr[0]  + arr[1]  + arr[2] + arr[3] )/4;   //求平均

NumOut(20, LCD_LINE1, Sensor(S2));  //顯示即時光值
NumOut(20, LCD_LINE2, sum);  //顯示平均光值
}
}
}

[C++] NXT++ Library

撰文:謝宗翰老師

之前曾跟各位介紹過給 NXT 使用的 C++ LibraryNXT++ Library 以及 C++ Communication Library,當時對 NXT++ 有所批評,然而在經過多次實作過後,筆者認為事實上兩者都還算好用(雖然兩者好像都很久沒更新了),對於需求不高的使用者,已經非常足夠。這兩個 Library 都需透過傳輸線或藍牙進行控制,因此主要仍以電腦為控制核心,NXT 當做電腦的延伸,與 LabVIEW 的 Direct Mode 相同。看到這裡,很多人或許會問:這麼不方便,為什麼還要用它?

答案很簡單,要用什麼樣的程式語言,端看您的需求。C++目前仍是程式語言的大宗,在開發與應用上具有無限的潛力,就像是使用 LabVIEW 的 Direct Mode,在 Direct Mode 下,NXT 是電腦的延伸,我們可以讓電腦進行各式各樣的運算,再藉由 NXT 來致動,同樣的道理,使用 C++,我們可以設計視窗程式介面、使用機器視覺函式庫(OpenCV),甚至結合其他硬體(許多硬體都會提供 C++ 的開發工具,即 SDK),讓 NXT 從單一的機器人變為一套更強大的系統。

目前筆者已嘗試使用過 Visual C++ 配合 NXT++ 以及 C++ Communication Library 撰寫過一些程式,事實上在兩者的網站上對於 Visual Studio 的使用環境皆有非常詳細的解說,各位不妨參考看看。另外筆者目前正在使用 Qt 結合 NXT++ 設計一個簡單的測試程式,下禮拜再跟各位分享。

 

[影音分享] 100-101年度北區技專資源中心「LEGO機器人研習營」- 軌跡避障競賽

1/16 於清雲科大舉辦的 100-101年度北區技專資源中心「LEGO機器人研習營」,為期三天的課程是以軌跡避障競賽來一較高下。

由於三個障礙物的切入角度不一樣,所以要把三個障礙物獨立成三個不同的避障動作,而不是期待用同一個動作就能成功完成三次。當然也可以透過傳值來動態調整每次避障動作的各樣參數(時間,馬力與回轉半徑等等)。這在NXC中都很容易做到唷

來看看No. 1的英姿吧。範例程式(NXC)請點我下載

[軌跡車範例] 比例控制循跡影片

本影片是100-101年度北區技專校院教學資源中心舉辦的「LEGO機器人研習營」的競賽題目。使用NXC程式語言控制樂高機器人完成循跡控制。

是不是走得很順暢呢?

[youtube=https://www.youtube.com/watch?feature=player_embedded&v=0ZMz-CS0bPY]

附上NXC程式碼:

//我是p控制task main()
{
SetSensorLight(S3);
int kp=2; //比例參數
int light_initial = Sensor(S3); //程式啟動時先抓一次光值,這時請將光感測器所投射出的光圈擺在黑線左測一半處
int light_realtime;                      //即時光值
int vl,vr;                                         //左右輪速

   while(true)
{
light_realtime = Sensor(S3);    //更新即時光值
vl = 40 + kp*(light_realtime-light_initial);    

      //計算左輪速,40 是基礎速度,代表當誤差為0時,機器人將以此速度直走
vr = 40 + kp*(light_realtime+light_initial);

      //計算右輪速, +/- 是代表進彎時的修正方向,可根據實際狀況修改

      OnFwd(OUT_B,vl);                      //出發!
OnFwd(OUT_C,vr);
}

}

 

 

NXC之電視遙控車

大家好!又到是每周阿邦老師分享的時間囉!這禮拜要跟各位分享的是電視遙控車,一般來說,電視遙控氣大概就只能遙控電視而已,轉轉台、開電視、關電視等等…似乎沒有甚麼特別的功能!但是若是配合阿邦老師的巧思那就會有更不一樣的應用囉!以下給各位看阿邦老師用NXC程式配合紅外線感應器編寫一個用電視遙控器遙控NXT機器人,這樣以後不僅可以用電視遙控器遙控電視,還可以用電視遙控器遙控小幫手來幫你送零食唷!果然科技是來自於人性(阿邦老師解讀:科技來自於惰性 惰性來自於人性 故:科技來自於人性)是不是很酷呢~~~


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

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

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

0523清雲科大NXC機器人教學

這裡拜阿邦老師又到了清雲科大教NXC,這次的題目主要是因應本周在虎尾科大筆的自走車競速比賽,所以要求同學們必須要能夠閃避走廊上的保特瓶,因為比賽規則中說明寶特瓶與牆壁會有15公分以上的距離,所以阿邦老師原先的想法是,應用P控制沿著牆壁走(這樣跟循跡車原理一樣),加上大家幾乎都是用原型車的車體,所以寬度基本上都在15公分以內,但是為了以防萬一阿邦老師也帶學生一起完成不用沿著牆壁走,隨機放在出發點也能順利閃避所有障礙物的程式,以下影片給大家參考:




這邊阿邦老師用了兩顆超音波感應器,分別偵測右邊跟前方的障礙物,以便做修正的動作,詳見以下圖片:

我們照著比賽規則大致設計了一個模擬場地,跑的情況還不錯,在這邊祝清雲科大的同學們本周的比賽可以榜上有名喔!

0516 清雲科大NXC機器人教學

這禮拜阿邦老師在清雲科大教同學們應用P(比例)控制來玩循跡車,甚麼是P(比例)控制呢?簡單來說,就是光源感應器每偵測到一個光源值,其B、C馬達都會有一個對應的速度,假設B馬達在左邊、C馬達在右邊,並且從黑線的右邊出發,當光源值在全黑40的時候,B馬達會用100的電力離開黑線,C馬達會用0的電力保持不動,當光源值在45的時候,也就是剛好在黑線跟白線交界,B、C馬達都會以50的電力直線前進,當光源值在全白50的時候,C馬達會用100的電力離開白線,B馬達會用0的電力保持不動,這就是P(比例)控制!

那麼一般我們在玩循跡車時的Z字型走法跟應用了P控制所做出的循跡車有甚麼差別呢?以下阿邦老師有錄製影片給大家參考:

Z字型走法的循跡車:

應用P控制的循跡車:

兩種控制法在走相同的場地時,應用P控制的循跡車整整比Z字型走法的循跡車快上了20秒左右,這個在分秒必爭的各種機器人比賽上肯定會有相當大的幫助!  所以大家一定要把P控制學起來,才能走得又快又穩!!  大家說是不是阿~

 

清雲科大0509

這禮拜是阿邦老師到清雲科大的第四天,目前做到的題目是"投籃車",阿邦老師發覺投籃車這個題目只要你學機器人控制方面一定會碰到這個題目,但是這個題目難易度可深可淺,這次在清雲科大,阿邦老師又看到組裝上的突破性,程式部份都是用NXC來寫,主要還是應用光源感應器偵測到黑線後停下來,接著丟球,但是這部分阿邦老師要求同學們要用馬達負載的指令來寫並且要在馬達出手的前方裝個檔版,裝檔板的原因在於當你的馬達出手打到板子再丟出球的話,其準確度會較高,若是沒有檔板的話,會因為每次出手的慣性造成每次手臂歸位的位置會漸漸不一樣,也就是我們常說的誤差累加,時間一久或是投藍次數一多其投籃精確度會肯定一直下降,所以在這建議各位在做投籃機器人的時候,記得要在馬達出手的前方裝個檔板,這樣你的準確度才不會因為丟越多球而越來越不準。

在這邊跟大家分享一下學生的創意,以往我們常看到的大概就是一次丟兩顆,清雲科大的同學想盡辦法一次可以丟三顆,且準確度相當高,而且破了阿邦老師目前教的學生的紀錄,一分鐘進了44顆球!大家給他們鼓勵鼓勵~~~

04/25 師大應電[機器人控制] 期中展示

4/25 是師大應用電子科技[機器人控制]的期中展示。 全班10組同學都要上台展示該組的成果, 並於期末時候完整呈現。

為了培養同學上台的經驗, 從書面/投影片格式, 服裝, 流程到時間都有很嚴格的管控。 目的是希望同學認真地培養presentation的能力。 除了會做更要會說, 這樣才能讓別人看到自己。

兩輪平衡車

這組同學影片剪輯做得不錯, 題目是NXT印表機, 可以用點陣的方式輸出特定的圖案。

[魔術機器人]同學和老師在討論機器人如何辨識不同的撲克牌花色

[解魔方機器人] 單機就要解魔術方塊, 同學你的程式要很強唷!!

[遙控自走砲塔] 使用加速度感應器來控制砲塔的仰角, 演算法相當好, 加速度感應器的雜訊處理也挺好的。

[你追我跑] 兩台機器人, 前面的機器人會隨機在地上畫出軌跡線, 後面的那台車要跟著軌跡線跑。 希望可以克服隨機的十字路口與斷線問題。

[數獨機器人] 這是網路上既有的範例, 但同學們在影像處理方面著墨很深, 在影像二值化以及特徵辨識上講解得相當好, 值得鼓勵。

[彈珠檯] 使用Wii 手把來控制彈珠台底板的俯仰角, 使用了LabVIEW 搭配NXT機器人, 趣味性十足的專題。

 

0428阿邦老師於清雲科大初體驗

0418這天是個值得紀念的日子,是阿邦老師首度到大學教學,一開始還相當緊張,深怕自己準備不足無法帶給同學們更多學習樂趣,甚至在前一天也把上台要講的PPT看了又看,也想盡辦法的搭配一些應用的題目希望可以讓學生可以學以致用。當天面對大學生時不免還是有點緊張,但是憑著在外面辦研習會的經驗,很快讓自己穩定下來,3個小時的時間說長不長說短不短,感覺3小時一下子就過去了,在這期間,有請學生做了幾個範例,1、讓樂高小人站在原型車上,行走一個磁磚的距離,煞車時不能讓小人跌倒!(主要讓學生學習用Coast煞車)2、讓車子可以走一個螺旋狀的圓圈(主要讓學生了解控制車子轉彎百分比及每次對轉彎百分比累加的觀念),學生們表現都相當好,每組都成功了,相當讚的一個班級,看來在接下來的課程裡,阿邦老師要加深題目難度,讓學生可以學到更紮實的技術!

BricxCC 3.3.8.9

BricxCC 3.3.8.9來囉, 大家趕快裝起來玩玩看

載點:  http://sourceforge.net/projects/bricxcc/files/bricxcc/bricxcc%203.3.8.9/

version 3.3.8.9
—————
– NBC 1.2.1.r4
– Fixed reported problem with saving to non BMP file types from NXT Screen tool.
– Fixed a problem with the internal compiler when connected via bluetooth.
– HTML help fix (unable to load hhctrl.ocx)
– Added text viewer
– Added manual loading of symbol file in watch and new watch tools
– Added hot keys for close comm and find brick
– Added support for user-defined API functions in code completion
– Modified firmware download so that it allows more time for brick to boot in SAMBA mode
– Added symbol file library path and exposed it and UserDataLocalPath in preferences
– Loading symbol file manually in watch tools.
– AVI movie changes in NXT Screen tool.
– ROPS improvements
– New variable watch tool classes
– Variable watching changes
– More NXT Watch list changes
– ROPS debug support change.
– Added status messages for compiler download problems
– Added additional keyboard support to Joystick tool
– ctrl-click changes in the editor

[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):

毫秒   光值

1738
5641
5841
5938
6038
6138

          .
          .
          .
          .
   共600組資料

繪圖(利用Excel):

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

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

毫秒     誤差

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

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

並且繪圖:

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

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

歡迎留言討論喔!