置頂文字

歡迎來訪 !! 如有任何問題歡迎一起討論或是 eMail 給我 legorunmail@Gmail.com

2010年12月27日 星期一

樂高網路影片分享





影片中NXT的OutPort沒有接任何一條線卻可以行走,為什麼??? 
因為NXT的馬達不是只有一種可以使用,更多的介紹請看 探奇邱老師用PF馬達

























把樂高NXT融入日常生活中


























把你的數位相機攝影功能打開裝在樂高上你就是導演「Michael Bay」





































光用看的就知道這不是一般人做的出來的「逸品」

樂高NXT溝通與協調運作

這次打算要作兩台NXT可以互動的設計,一台NXT做取出物件的服務、另一台NXT軌跡車做搬運的服務,兩台NXT透過藍牙溝通協調達成任務。

軌跡車要加上置物與頃倒的功能,而下面這台NXT要負責拿取物件與告訴軌跡車物件的顏色,讓軌跡車運送到對應顏色的指定地點頃倒。

以上都是想法,接下來要如何實踐才是挑戰 !!





2010年12月21日 星期二

NXT 軌跡車馬達 PID 控制

在做NXT軌跡車設計時如果路線是轉彎度平滑筆直的時候NXT走得很順利,但如果把路線的轉彎角度變大時會發現NXT有時會偏離路線走失了。

這是因為NXT左右兩顆驅動馬達的反應速度跟不上路線的變化導致無法即時修正,這時候就是馬達PID控制可以發揮所長的地方,因為除了比例P模式之外還有微分模式、積分模式可以更快速反應路線的變化資訊給NXT做必要的修正。

比例P模式:P(t) = E(t)   LightSensor與Motor電力比例值          
積分I 模式:I(t) = I(t-1) + E(t)   每次讀取比例值的累積  
微分D模式:D(t) = E(t) – E(t-1)    LightSensor 前次與本次差異值累積  

這三個參數的調整方式都有不一樣的效果建議大家試試看,如何走的順又平穩就是最佳的參數值,像影片中的走法還有改進的空間雖然LightSensor一直維持在黑線中間但電力的供應還不夠平順。


2010年12月16日 星期四

NXC 指令:ColorSensor

NXT2.0 有一個新的感應器 ColorSensor 可以辨識6種顏色

Color Define:
  1. Black  
  2. Blue 
  3. Green
  4. Yellow
  5. Red
  6. White
NXC也可以控制ColorSensor 的燈光顏色(Red、Green、Blue、White)

用TouchSensor來操控ColorSensor的燈光顏色,每按一下就換一種燈光顏色

Example:
task main(){
   int Light=0;
   SetSensorTouch(S2);  
    while(true){  
        if(Sensor(S2)==1){
            Light++;
            Wait(300);
        }
        switch(Light){
            case 1:
                SetSensorColorRed(S3);
                break;
            case 2:
                SetSensorColorGreen(S3);
                break;
            case 3:
                SetSensorColorBlue(S3);
                break;
            case 4:
                SetSensorColorFull(S3);
                Light=0;
                break;
        }
        NumOut(20, LCD_LINE3, Sensor(S3))  //讀取ColorSensor的數值
    }
}

NXC 指令:關掉Sensor功能

有網友在探奇向邱老師提出一個問題「如何關掉超音波 Sensor 的功能」

 一開始我覺得把SetSensorLowspeed(S1) 改為 SetSensorLowspeed(NULL) 應該就可以了但實際測試失敗, 我查了一下NXC 的 Help 發現Sensor_TYPE_ 裡面有SENSOR_TYPE_NONE,所以改為SetSensorType(S1,SENSOR_TYPE_NONE) 就可以關掉特定Port的Sensor Function。

反過來想到底何時會想關掉特定Sensor功能呢???我覺得至少在電力方面應該有其需要....^_^

樂高網路影片分享
















 NXTCam 的運作範例







NXC 指令:Precedes

Precedes:啟動多個Task

void Precedes( task1 , task2 ,task3 ,.....taskN) 

用途:可同時啟動多個Task各自執行自己的程序。

StopAllTasks():停止所有Task
StopTask(taskA):停止taskA的程序
Stop(x == 24); // stop the program if x==24


Ex:假設有兩個Task 都對MotorA下指令一個是前進另一個是後退 ,這時你會看到NXT MotorA有時前進有時後退變得無所適從。

如果有多個Task對同一個驅動馬達下指令時就看誰先搶到工作權誰就先執行,因此這時候在使用Precedes指令時最好用mutex 來判斷誰最需要「工作權」,有點類似十字路口的紅綠燈,假如路口沒有號誌燈那所有車輛都要前進時就會發生車禍或是某個方向的車子一直前進而另一個方向的車子卻動彈不得,因此mutex 就像號誌燈讓多個方向的車流都能維持一定的流量而不打結。


從以下Example你可在NXT 螢幕看到反覆顯示   「go1」  0.5秒  「go2」

範例:

mutex muxFlag;
task go1(){  
    while(true){
       Acquire(muxFlag);
       TextOut(10,LCD_LINE3,"go1",false);
       Wait(500);
       ClearScreen();
       Release(muxFlag);
    }
}

task go2(){   
    while(true){
       Acquire(muxFlag);
       ClearScreen();
       TextOut(10,LCD_LINE4,"go2",false);
       Wait(500);
       ClearScreen();
       Release(muxFlag);
    }
}

task main(){
    Precedes(go1,go2);
}

NXC 指令:Follows

Follows:一直等到設定的Task執行完畢,才會繼續執行下一個Task

用途:當 NXT 執行工作有固定順序時可以用 Follows 控制,這跟Precedes同時執行多個Task有不同的用法。

void Follows( task1 , task2 ,task3 ,.....taskN)

從以下Example你可在NXT 螢幕看到依序顯示 「Main」 5秒  「go1」  5秒  「go2」

範例:

task main(){
    ClearScreen();
    TextOut(10,LCD_LINE2,"Main",false);
    Wait(5000);
}

task go1(){
    Follows(main);
    ClearScreen();
    TextOut(10,LCD_LINE3,"go1",false);
    Wait(5000);
}

task go2(){
    Follows(go1);
    ClearScreen();
    TextOut(10,LCD_LINE4,"go2",false);
    Wait(5000);
}

2010年12月13日 星期一

LEGO NXT 藍牙遙控車

樂高有一款控制器  LEGO Power Functions IR Remote Control  加上HiTechnic 公司有個產品 IR Receiver Sensor 可當NXT的接收器,你就能像一般遙控玩具車一樣遙控你的NXT。

因為我有2台NXT所以我是利用藍牙連線互傳資料的方式來遙控,一台Master當遙控器發射訊息而另一台當Slave接收訊息後再對2顆馬達進行操控,因此一顆馬達控制左右轉向另一顆是控制前進後退。


車體的樣式組裝我是用 HiTechnic 的範例
材料:
  1. Lego MindStorms NXT
  2. 驅動馬達Motor 2顆
  3. 車體結構組件















程式不是寫的很完備還有很多地方要調整,但控制車體的轉向與前進後退功能都有,有興趣的人可以試試看,另外如果藍牙手機有NXT控制程式就可以用手機當遙控器使用。

我覺得這個藍牙遙控車最主要是讓我們學習與了解2個NXT要如透過藍牙溝通傳遞訊息, 這樣可以幫助我們往後設計更大型的樂高物件時會更有變化與多樣性。


結論:如果真的要當遙控車玩還是要買專用的Remote Control比較順手,但是要玩遙控車這樣的成本好像太高了。

在拍攝影片影片的時候,旺弟弟正在練習直笛所以背景有直笛音樂.....^_^


 程式方面如下:

//Master:遙控器程式

#define BT_CONN 1
#define INBOX1 1
#define OUTBOX1 1
#define INBOX2 2
#define OUTBOX2 2

sub BTCheck (int conn){

    if (!BluetoothStatus(conn)==NO_ERR){
        TextOut(5,LCD_LINE2,"Error");//顯示連線錯誤訊息
        Wait(1000);
        Stop(true);
    }
}

task main(){

        BTCheck (BT_CONN); //檢查與slave之連線
        int rev=0, rev1=0,sed=0,sed1=0,sed2=0,pwr1=0,pwr2=0;
       
        while(true){
            //左右轉向馬達          
            sed=MotorTachoCount(OUT_A)/20;
            if(sed!=sed1){
                pwr1=sed1-sed;
                sed1=sed;
                SendRemoteNumber(BT_CONN, OUTBOX1,pwr1);
            }

            //前進後退馬達
            sed=MotorTachoCount(OUT_B)/20;
            SendRemoteNumber(BT_CONN, OUTBOX2,sed2);
            if(sed!=sed2){
                pwr2=sed2-sed;
                sed2=sed;
                SendRemoteNumber(BT_CONN, OUTBOX2,pwr2);
            }
          }
}

------------------------------------------------------------------------

//Slave:車體接收遙控程式
#define INBOX1 1
#define OUTBOX1 1
#define INBOX2 2
#define OUTBOX2 2

sub BTCheck(int conn){
    if (!BluetoothStatus(conn)==NO_ERR){
        TextOut(5,LCD_LINE2,"Error"); //顯示連線錯誤訊息
        Wait(1000);
        Stop(true);
        }
}

task main(){
    BTCheck(0); // 從slave來看,master都是連接在line 0
    int rev=0, rev1=0, rev2=0,sed=0,sed1=0,rev3=0,rev4=0;
   
    while(true){
       
        ReceiveRemoteNumber(INBOX1, true, rev3);
        if(rev3!=rev1){
            rev1=rev3;
            ClearScreen();           
            if(rev1>0)
              OnFwd(OUT_A,50);
            if(rev1<0)
              OnFwd(OUT_A,-50);         
            Wait(200);           
            Off(OUT_A);
        }       
       
        ReceiveRemoteNumber(INBOX2, true, rev4);
        if(rev4!=rev2){
            rev2=rev4;
           if(rev2>0)
              OnFwd(OUT_B,50);
            if(rev2<0)
              OnFwd(OUT_B,-50);
          }       
    }
}//main

2010年11月19日 星期五

2010年11月18日 星期四

NXC 馬達角度Function

在NXC裡面有兩個驅動馬達角度讀取Function常常被使用 MotorTachocoCount()、MotorRotationCount(),這兩個Function差在哪裡呢???


首先看看MotorTachoCount定義:
long MotorTachoCount ( byte  output  )
Get motor tachometer counter.
Get the tachometer count value of the specified output.


再看看MotorRatationCount定義:
long MotorRotationCount ( byte  output  )
Get motor program-relative counter.
Get the program-relative position counter value of the specified output

都是取讀馬達目前位置的累計角度值這也是常被搞混的地方,但這一定有差異因為相同的Function何必寫兩次呢,其中最大的差異在
  1.  MotorTachoCount有方向性當馬達轉動角度一改變方向時「就會歸零」而重新累計角度值,例如當順時針轉動馬達讀取MotorTachoCount(OUT_A)的Value=500時再反向轉動30度,這時讀取MotorTachoCount(OUT_A)的Value會變成-30。
  2.  MotorRotationCount也有方向性但當馬達轉動角度一改變方向時「不會歸零」而是減去角度值,例如當順時針轉動馬達讀取 MotorTachoCount(OUT_A)的Value=500時再反向轉動30度,這時讀取MotorTachoCount(OUT_A)的 Value會變成470。

所以兩者的差異是我們在使用Function時要瞭解的地方。

以上的測試是用NXT傳送正負Power值或是正負角度值給RotateMotor函數使用時得到的結果。
如果你用手轉動驅動馬達順時針或逆時針時的結果會不一樣,因為這兩個函數讀取的角度值都相同而且是累計值加減,不會像MotorTachoCount一遇到反向就規零重新累計數值。

2010年11月16日 星期二

驅動馬達的PID控制

樂高NXT的輸出目前是以馬達為主因此對於馬達的瞭解是非常重要的一課,實際在玩NXT有時候你對NXT下達轉90度的指令時馬達實際卻轉了100度這十度的誤差有可能影響很大,如果這類指令常用那累計的誤差值非常可觀,玩NXT想要精確的控制馬達一定要知道PID的控制原理。

研發養成所的這篇PID Speed Control  推薦一定要去看。


另外 文章中提到 NXC 沒有提供小數Float 資料型態在最新版的NXC已經支援了,以前在用NXC時也覺得不支援Float實在不方便要自己做轉換才能得到數據使用。


後來去研發養成所問了一個問題:
請問在NXC中讀取角度的Function:MotorRotationCount()、MotorTachoCount()..........都可以讀取馬達角度值...請問這兩者有何差異

再請問當我下達 RotateMotor(OUT_A,80,320) 指令後,再讀取馬達角度MotorTachoCount(OUT_A)時,往往不相同也就是馬達沒有精確的的停在320度.....請問要如何解決才能準確停在320度

-----------------------------------------------------------------
版主很熱心的回應:

MotorTachoCount()會因每次 RotateMotor 指令執行,而重置清除馬達角度值,但是 MotorRotationCount()不會,因此 MotorRotationCount()會一直累積馬達角度值,直到執行 ResetAllTachoCounts(OUT_A)才清除。

RotateMotor 指令,為 open loop 控制指令,它無法精確控制角度,會因電池電力大小或負載情形,造成角度有誤差。你可以嘗試 RotateMotorPID(OUT_A,80,320,P,I,D),P=50,I=50,D=50,這裡 PID 數值不是最佳值,您需要自行調整數值,PID控制後,才能修正回設定點。


看完回應後真是感謝版主的解釋........^_^



另一篇 J. Sluka PID 控制文章  也是一篇好文。
一定要去看看PID的計算原理你會獲益良多

2010年11月14日 星期日

樂高 NXT 敲音磚機器

前陣子買了 MindStorms NXT 8547 答應旺弟弟要組個敲音磚的機器人給他玩,因此在機構上花了許多時間一開使用直線來回的軌道方式來移動NXT到特定音階位置,實際組裝完成後發現移動的時間太久了,因此拆掉重新組裝成目前的外觀樣式,這種方式是用馬達旋轉的角度來作為特定音階位置所以速度比較快。


在琴槌方面為了要讓聲音有清脆感,所以在機械手臂上用橡皮筋綁住琴槌這樣在敲琴時有點彈性會聲音品質比較好。


這次NXT要表演「小星星」的曲目,相關樂譜的資料在維基百科有詳細說明,這首曲子好像是學樂器的入門指定曲,因為旋律簡單易懂 (只要6個音階) 相信應該難不倒樂高NXT的智慧 ...^_^





琴槌敲下的角度





























琴槌舉起的樣子



拍攝時背景音有錄到里長伯的廣播.....真是意外啊  另外NXT敲小星星時有些地方音階敲錯需要改進....但這樣的玩法蠻有趣的,第一段影片是音階定位這樣NXT機器人才知道所有的音階位置、第二段是「小星星」敲擊、最後一段很榮幸請到本次音樂指導教授旺弟弟示範正確的小星星敲法。

2010年11月10日 星期三

樂高網路影片分享

這個厲害 V8 引擎也可以模擬出來







 3段變速箱







自動變速箱





四輪驅動

























2010年11月8日 星期一

兩台樂高 NXT 透過藍芽傳資料

當你手上有兩台樂高 NXT 時如果可以互動的話應該會更有趣,在這個想法下又買了一台 NXT 8547 所以來試試看兩台NXT要如何互傳資料。

首先要區分誰要當Master與Slave而Master的代號是0、Slave的代號為1、2、3,因此Master只能有一台而Slave最多三台也就是連線時最多是一對三。

每一台NXT 可以接收訊息的MailBox有10個每個MailBox只能存一則訊息 ,雖然不多可是善加利用也可以做出許多不同的組合。

首先你必須先讓AB兩台NXT建立信任的藍芽連線,由A找B的話A就是Master(0)、B就是Slave(1)

再來就是Master與Slave程式碼 


Master 範例

#define BT_CONN 1    //指定與第一台Slave連線
#define INBOX 1          //接收Slave傳來的資料位置
#define OUTBOX 2     //傳送到Slave的信箱位置

sub BTCheck (int conn){
    if (!BluetoothStatus(conn)==NO_ERR){
        TextOut(5,LCD_LINE2,"BT  Error");             //無法找到 Slave時顯示錯誤訊息
        Wait(1000);
        Stop(true);
    }
}

task main(){
        BTCheck (BT_CONN); //檢查與slave之連線
        int x1=0;
        while(true){
               if(ButtonPressed(BTNCENTER, false)){   //按下中間 Enter鈕時送出訊息 3 到Slave
                   TextOut(5,LCD_LINE1,"Send Slave=3");
                   SendRemoteBool(BT_CONN, OUTBOX, 3);
               }
               ReceiveRemoteBool(INBOX, true, x1);     //接收Slave信息資料「x1」
               if(x1!=0){
                  ClearScreen();
                  NumOut(5,LCD_LINE3,x1);                     //顯示Slave傳送的數值「x1」
                  Wait(1000);
                  x1=0;
                  ClearScreen();
                  TextOut(5,LCD_LINE1,"Waiting...");
               }
        }
}


-------------------------------------------------------------------------------------------------------------------


Slave 範例

#define BT_CONN 0      // 對Slave而言 Master 都是連接在 0
#define INBOX 2            //這必須是 Master的OutBox信箱位置
#define OUTBOX 1       //這必須是 Master的InBox信箱位置

sub BTCheck(int conn){
    if (!BluetoothStatus(conn)==NO_ERR){
        TextOut(5,LCD_LINE2,"BT Error");  //無法找到 Master 時顯示錯誤訊息
        Wait(1000);
        Stop(true);
    }
}

task main(){
    BTCheck(BT_CONN);
    int x2=0;
    while(true){
         ReceiveRemoteBool(INBOX, true, x2);          //檢查信箱是否有資料「x2」
         if(x2!=0){
            ClearScreen();
            NumOut(5,LCD_LINE3,x2);                      //顯示資料「x2」
            Wait(1000);
            x2=0;
            ClearScreen();
            TextOut(5,LCD_LINE1,"Waiting...");
         }
        if(ButtonPressed(BTNCENTER, false)){              //按下中間 Enter鈕時送出訊息 6 到Master
            TextOut(5,LCD_LINE1,"Send Master=6");
            SendResponseBool(OUTBOX,6);                    //Slave回應主機要用SendRespone
        }
    }
}

2010年10月31日 星期日

樂高網路影片分享

這個作品的機構設計的不錯






五十川芳仁老師的作品,如果有直線來回動作的需求可以作為參考







這個也不錯






經典的魔術方塊






NXT SEGWAY

2010年10月29日 星期五

樂高 NXT 8547 入手

前幾天購買的 LEGO MindStorms NXT 8547 到貨了,這次是跟台南的林老師購買而林老師很信任消費者竟然先出貨才收貨款......真是勇氣十足  ^_^


8547組合跟9797 組合最大的差異在 Color Sensor 與 Light Sensor ,因為 NXC 有支援 Color Sensor 所以這次訂購 8547 玩玩看,手上有兩台 NXT 後可以試玩更多的玩法例如透過BlueTooth 互傳資料或是互動。




























雖然旺弟弟只有國小二年級不會寫程式,但看到機器人還是很有興趣 !!
我答應他要組一個會敲音磚的機器人給他玩.....不知道支票會不會跳票啊


2010年10月20日 星期三

樂高 NXT 搜尋分類機器人(二)

在 NXC 程式方面要先區分幾個步驟:

  1. 啟動 UltarSonic Sensor 搜尋找球
  2. 驅動 NXT 到目標區
  3. Light Sensor 分辨球體顏色明暗度
  4. 抓取球體舉起到水平
  5. 啟動 UltarSonic Sensor 搜尋回收區位置(有一塊大小約 A4 立版當回收區的目標物)
  6. 驅動 NXT 到回收區
  7. Light Sensor 分辨回收區的顏色明暗度
  8. 放球
  9. 回到 步驟 1 再搜尋下一個目標球體

最近很忙都只有零碎時間不知道何時才能把程式碼寫完

    樂高 NXT 搜尋分類機器人(一)

    這次要做 樂高 NXT 搜尋分類機器人,球放置的位置不固定因此要靠超音波感應器來搜尋位置,再來就是把不同顏色的球放置在分類的特定收納區。


    這次的程式應該會比較複雜一點,因為要搜尋未知的球但又不能亂找導致跑到根本沒球的區域浪費時間 ,另外找到球後要分辨顏色明暗度與搜尋回收區的位置,然後把機器人移動到回收點並放下球到特定的收納區才算成功。


    這次用的樂高建構零件不多所以外觀蠻簡單的,但結構剛性不錯沒有搖搖晃晃的感覺,缺點就是最上面的馬達會擋到NXT的實體按鈕,所以會加裝一顆碰觸感應器(Touch Sensor)當啟動鈕。





























    當舉起球時超音波感應器的位置也變成水平因此可以用來找尋放球的收納區位置





























    光線感應器的裝置在底下因此抓到球後可以立刻分辨出顏色的明暗度




























    2010年10月19日 星期二

    樂高 NXT 按鈕與NXC 關係

    樂高 NXT 本體上有四顆實體按鈕:左、中 (Enter)、右、下 (Exit)

    這幾顆按鈕在NXC的對應名稱:BTNLEFT、BTNCENTER、BTNRIGHT、BTNEXIT

    常用的 Function
    1. 按鈕是否有按下:bool  ButtonPressed( const byte  btn, bool  resetCount  ) 
    2. 計算按幾次:byte ButtonPressCount  ( const byte  btn  )  
    3. 等待某個按鈕是否壓下:until(ButtonPressed(BTNCENTER, false)==1)


    下面的程式是測試 A Port馬達的正反轉功能,當按一下左 Button後馬達停止並等待 Enter鈕的按下啟動馬達,當按一下右 Button則馬達反向驅動。

    task main(){
        string strMsg;
        int iPower=30;
        while(true){
            if(ButtonPressed(BTNLEFT, false)){
                Off(OUT_A);
                ClearScreen();
                iPower=30;
                TextOut(0,LCD_LINE2,"Press CenterBtn");
                TextOut(0,LCD_LINE3,"Waiting Start");
                until(ButtonPressed(BTNCENTER, false)==1);
                ClearScreen();
            }
            if (ButtonPressed(BTNRIGHT, false)){
                Off(OUT_A);
                ClearScreen();
                iPower=-30;
                TextOut(0,LCD_LINE2,"Press CenterBtn");
                TextOut(0,LCD_LINE3,"Waiting Start");
                until(ButtonPressed(BTNCENTER, false)==1);
                ClearScreen();
            }
            strMsg=NumToStr(iPower);
            strMsg="Power Way="+strMsg;
            TextOut(0,LCD_LINE2,strMsg);
            OnFwd(OUT_A,iPower);
        }
    }

    2010年10月12日 星期二

    樂高 NXT 抓球分類車再改良

    上次的樂高 NXT 抓球分類車走起來有點不穩,所以要改良把輪子改為履帶再把超音波感應器加上去,這樣放球的位置就不必固定了。























































    這次車體變高所以要在放球的收納區多作一些球體移動軌道來增加視覺效果,如果有兩台樂高 NXT 就可以設計分工合作的玩法,不知道我的樂高 NXT 8547 何時才會到貨???。

    2010年10月7日 星期四

    樂高 NXT 抓球分類車

    能夠自主移動的樂高 LEGO NXT一直都是很吸引人的玩法,所以這次要做一個類似搬運機的LEGO NXT 。


    所需材料:
    1. LEGO NXT 本體
    2. Motor 驅動馬達三個
    3. Light Sensor 光感應器一個
    4. Ultrasonic Sensor 超音波感應器一個
    5. LEGO建構零件

    目標:讓 LEGO NXT  前進到球體位置後抓取球體並分辨顏色後再放置到正確的對應收納區。


    照片中的車體還沒裝上Light Sensor(用來分辨顏色明暗度) 與 UltraSonic(用來判斷距離),但爪子、轉盤、驅動這三顆馬達都已經能正確的運作,全部的車體與活動機構都能協調而不衝突。

    在組裝的過程中光爪子部份就不知道拆卸多少次了,一下子會跟車體卡住一下又跟轉盤碰到,等到沒問題時又發現要跟NXT結合會缺少穩固的接觸點,實際測試時整體結構就會慢慢解體....失敗啊  !!


    樂高的建構零件雖然都很輕巧但是零件一多還是有些份量的,因此要找出最少用量與最適合的零件就是一門學問與經驗,而多玩多做就是最佳的LEGO NXT學習方式。






























    這台LEGO NXT車體的只能裝三顆驅動馬達,一顆用在輪子上因此LEGO NXT在移動時只有前進與後退,第二顆用在轉盤上用來調整爪子的方向,第三顆當然用在驅動爪子的抓取動作。


    有時候在玩LEGO NXT的時候會覺得驅動馬達的Port 太少了想做些複雜的動作都不行,但仔細想想這是一個科學玩具因此目標要放在單一題目上,例如你想做什麼???而且在有限資源下是否能做到,其實只要我們設定明確單一的目標,相信在這些限制下我們依然能做出許多有趣的組合,目前這個機構的用途我還想到可以拿來敲音磚哦.......只要稍微做些改裝就可以了。



    這是最後的成品由四輪變三輪,因為原先的右前輪會卡到轉盤所以要修改設計,而後輪驅動齒輪組也作一些修改由馬達直接驅動加快速度,另外之前要用超音波感應器來偵測前方球體也改為由程式設定固定距離與收納區的相對位置。

    影片中粉紅色與綠色的球體都有固定的收納位置,因為光線感應器會分辨顏色明暗度進而告訴車體移動到特位置後再放下球體到正確的收納區。





    2010年10月5日 星期二

    如何教孩子玩 LEGO NXT

    很多家庭買LEGO Mindstorms NXT 是因為看到相關資訊覺得不錯就買一套來給小朋友玩,但很快就會發現不易上手因為組裝就是一項挑戰其後的軟體設計更是一項大挑戰,如果沒送小孩去上課學習這套LEGO Mindstorms NXT的話時間一久很容易就靜靜的躺在角落邊。


    這是一套非常棒的科學玩具能夠啟發小朋友的好奇心,更進而瞭解什麼是邏輯判斷與數學公式,我總覺得能夠讓小朋友在遊戲中學習不是一件很棒的事情嗎

    這篇文章算是一種紀錄:如何教孩子玩 LEGO NXT

    第一課
    1. 先組裝一輛外觀最簡單的 LEGO NXT 三輪車(前兩輪+後一輪)
    2. 用NXT-G做軟體設計:介紹NXT-G的基本用法並啟動孩子的好奇心
    3. 目標:讓LEGO NXT  直線前進、直線後退

    第二課
    1. 沿用上次的LEGO NXT 三輪車體
    2. 用NXT-G做軟體設計:當兩輪的供電差異越大時會有什麼變化
    3. 目標:讓LEGO NXT 順時針或逆時針的繞圈圈行走

    第三課
    1. 沿用上次的LEGO NXT 三輪車體另外加裝超音波感應器
    2. 用NXT-G做軟體設計 :如何讓超音波感應器與驅動馬達相互溝通運作
    3. 目標:當超音波感應器遇到前方障礙15公分時會自動停止前進

    第四課
    1. 沿用上次的LEGO NXT 三輪車體另外加裝碰觸感應器
    2.  用NXT-G做軟體設計:如何讓碰觸感應器與驅動馬達相互溝通運作
    3. 目標:當LEGO NXT 前進時發生碰觸感應器啟動後LEGO NXT 要退後

    第五課
    1. 沿用上次的LEGO NXT 三輪車體另外加裝光線感應器
    2. 用NXT-G做軟體設計:如何讓光線感應器與驅動馬達相互溝通運作
    3. 目標:當LEGO NXT 前進時遇到黑線時會停止

    第6課
    1. 沿用上次的LEGO NXT 三輪車體另外加裝光線感應器
    2.  用NXT-G做軟體設計:當光線感應器遇到黑色對右輪供電且對左輪停止供電,遇到白色對左輪供電且對右輪停止供電
    3. 目標:沿著黑繞行一圈 

    上完這六課如果還不能激發出孩子玩LEGO NXT 的興趣.......那就上網去二手拍賣吧(先PM我也可以)  ^_^

      2010年10月1日 星期五

      樂高 NXT 雙足機器人

      這次要作 LEGO NXT 雙足機器人,我是參考大師五十川芳仁的雙足機器人範例組裝而成的,但是因為特定結構零件不足導致腳部的結構不穩,因此LEGO NXT實際前進時會發生支撐不足的現象,看樣子還是要再買些零件補充包才行。
































































      2010年9月27日 星期一

      樂高 NXT 升降平台

      樂高 LEGO NXT 升降結構有很多種有興趣的人可以參考網路資料的樣式外觀再加以變化,而升降關節的連動機構是組裝重點,必須要不相互衝突又要能活動順暢。


      所需材料:
      1. LEGO NXT 本體
      2. Motor 驅動馬達一個
      3. LEGO建構零件

      目標:讓 LEGO NXT 能上下移動



      第一部分先組裝升降的連動機構,在活動關節部份要用活動專用插銷這樣馬達在運轉時比較順暢,如果用一般插銷會比較緊驅動馬達的出力要比較大























































































      先測試升降連動機構是否順暢














      2010年9月21日 星期二

      樂高 NXT 軌跡車三

      樂高 LEGO NXT 軌跡車加上超音波感應器是這次的設計重點,因為我們要在黑線上放一些障礙物,看樂高 LEGO NXT 軌跡車是否能避開障礙物繼續前進


      所需材料:
      1. 白色珍珠板一塊約2公尺*1公尺
      2. 黑色膠帶一卷
      3. LEGO NXT 本體
      4. Motor 驅動馬達兩個
      5. Light Sensor 光感應器一個
      6. Ultrasonic Sensor 超音波感應器一個
      7. LEGO建構零件
      8. 想像力...................^_^

      目標:讓LEGO NXT 軌跡車沿著黑色膠帶前進並且遇到障礙物時能避開後再繼續前進


      沿用上次的車體那就來個 LEGO NXT 「障礙」越野的 Pose !!


          這次 NXC 程式的撰寫重點就是讓 LEGO NXT 同時運作兩件事(Task):A 持續前進 、B 偵測前方障礙物時要停止並後退一些再繞過障礙物繼續前進,實際測試時你會發現LEGO NXT 遇到障礙物時會發生突然前進又後退的困擾意外。

          這是因為 AB兩件事同時發生沒有先後順序導致 LEGO NXT 無所適從,這時我們需要一個交通號誌類似路口的紅綠燈「Mutex」,看AB Task誰先取得 Mutex 的控制權誰就執行而另一個Task就要先暫停等待對方程序完成。


      NXC 程式碼:




      程式執行影片


      NXC 的一些小範例

      這篇文章要介紹一些 NXC 的範例:


      LEGO NXT 走直線問題:

      一開使以為要讓LEGO NXT走直線是件容易的事情,不就是讓左右馬達輸出相同的Power就OK了,但實地執行時會發現NXT越走越歪為什麼呢??  這是因為2顆獨立的馬達會因為某些物理或現場因素造成在相同Power輸出下2顆馬達轉速不同所以會越走越歪。


      NXC的解決方式是利用2顆馬達同步化 ,也就是NXT會監控2顆馬達的轉速當NXT發現兩邊差異過大時會自動調節讓兩邊盡可能轉速一致達到直線行走。


      NXC 同步指令:OnFwdSync(Outputs,Power,Turnpct)

      .直線行走:OnFwdSync(OUT_AC,50,0)

      .原地360度迴轉:OnFwdSync(OUT_AC,50,100)





      LEGO NXT 驅動馬達的指定角度設定與讀取:

      NXC 角度指令:RotateMotor(Outputs, Power, Degrees)
      指定馬達轉動到特定角度就停止的指令但不是每次都很準,因為LEGO NXT 認為已經轉到的角度不一定會剛好等於驅動馬達實際轉到的角度。




      NXC 讀取角度指令:MotorTachoCount (Output)
      讀取驅動馬達從一開始到讀取時的「累計」角度,可用於計算距離。

      2010年9月20日 星期一

      樂高 NXT 軌跡車二

          如果你用「一左一右」前進方式的LEGO NXT 軌跡車,會發現NXT速度較慢而驅動馬達走走停停,難道沒有更好的方式嗎??   當然有......因為到羅馬的方式不只有一種,現在介紹另一種方式是同時供電給兩顆驅動馬達,但電力會因光感應器的數值變化而持續「左右微調」的 PID控制方式,這次只用到 Proportional(比例)就夠了下次再加入 I 與 D。

      P:Proportional(比例)     I:Integrative(積分)   D: Derivative(微分)

      參考資料 :J. Sluka 網站的內容

          很多人說學數學只要會加減乘除就夠了幹麼學微積分上超市買菜又用不到,但這時候玩LEGO NXT你就會用到了,邏輯與數學在LEGO NXT上是非常重要的學習領域,而且從玩LEGO NXT的遊戲中學習邏輯與數學是最自然不過了因為你要現學現用才能玩 。


      目標:讓LEGO NXT 軌跡車用「較平順」的走法沿著黑色膠帶前進


      這是在下的組裝的第一種 NXT車體前面有超音波感應器能偵測前方是否有障礙物 ,旁邊有光感應器用來維持NXT軌跡車在黑色路線上前進






























      第二種 NXT車體重點在於很容易加裝各種感應器與已安裝第三顆驅動馬達備用







      NXC:程式碼




























      範例影片








      樂高 NXT 軌跡車一

      利用光感應器尋著黑線走幾乎是玩LEGO NXT的基本課題,有點像學寫程式的第一個範例永遠都是「Hello World」!!

      所需材料:
      1. 白色珍珠板一塊約2公尺*1公尺
      2. 黑色膠帶一卷
      3. LEGO NXT 本體
      4. Motor 驅動馬達兩個
      5. Light Sensor 光感應器一個
      6. LEGO建構零件
      7. 想像力...................^_^

      目標:讓LEGO NXT 軌跡車沿著黑色膠帶前進

        首先用黑色膠帶在白色珍珠板上圍成一個類似橢圓形的空間這將是NXT軌跡車要走的路線,再來就是組成一台軌跡車,要注意的是安裝光感應器時發光面盡可能與地面成90度且越接近地面越好(約0.5公分以內),這是因為光感應器容易受到其他光源的干擾,會造成LEGO NXT在讀取光感應器時數據偏差。


        這是在下的組裝成品外觀 大家可以自發揮只要類似即可,最重要的是光感應器安裝位置盡可能在中央。


















































        這是LEGO NXT 軌跡車 NXC程式碼,當Light Sensor的讀取數值 >=45 時代表在白色區域所以
        對A Port馬達供電50同時對C Port馬達停止供電,而遇到當Light Sensor的讀取數值 <45 時代表在黑色區域所以對C Port馬達供電50同時對A Port馬達停止供電,如此一來LEGO NXT 軌跡車就會一左一右的前進。






























        實際執行時的畫面

        樂高 NXT 抓球機器人

        這是一個會自動找尋桌面上球體的 NXT,所以頭頂上的超音波感應器遇到球體時會用抓子抓取球體。







































         



























































        樂高 NXT 搬運機器人

        這幾天試著組裝一個搬運機器人,同樣也是用超音波感應器來搜尋桌面上的物件,這次是用搬運的方式來移動物件。


        這次加裝「光線感應器 」用來判斷 LEGO NXT 是否走到桌面邊緣防止掉落,另外在馬達上也安裝一個「碰觸感應器」用來停止馬達搬運的開關。




























































        網路上 NXT 影片分享

        玩 LEGO NXT 除了自己組裝與寫程式還要多參考別人的分享案例,正所謂「人外有人、天外有天」尤其是 NXT 外觀變化多端有些網友的組裝外觀就是很酷,所以這篇文張是專門分享這些網址資訊。