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


六、進階用法

19 則留言:

  1. 不好意思!我是剛接觸的新手 請問一下

    我想要
    當(SENSOR_1==1)時就會做到退指令 當(SENSOR_2==1)時也會做到退指令 同時壓到時也做到退指令
    這樣我該怎麼把程式碼寫進去??

    麻煩大大撥空一下謝謝!!

    回覆刪除
  2. 您好:

    因為尚未說明多工的寫法,
    在此請於if中使用布林運算:
    且(and)-> &&
    或(or)-> ||

    程式如下:

    task main(){
       SetSensorTouch(IN_1);
       SetSensorTouch(IN_2);
       OnFwd(OUT_BC,80);
       while(true){
          if((SENSOR_1==1) || (SENSOR_2==1) || (SENSOR_1==1 && SENSOR_2==1)){
             OnRev(OUT_B,50);
             Wait(2000);
             OnFwd(OUT_BC,80);
          }
       }
    }


    其實,使用
    if((SENSOR_1==1) || (SENSOR_2==1))
    就可以了。

    回覆刪除
  3. 剛接觸的新手2010年7月29日 晚上9:16

    非常感謝大大^^ 我馬上來試試

    回覆刪除
  4. 剛接觸的新手2010年8月4日 晚上10:48

    不好意思又來請教您!!

    #define SOUND 90
    #define MIC S3

    task main()
    {
    SetSensorSound(S3);
    while(true)
    {
    if((MIC>SOUND))
    OnFwd(OUT_AB,80);
    until(MIC > SOUND);
    Off(OUT_AB);

    }
    }


    這個程式是我看書上寫的 但是找不出原因為何沒反應!
    煩請大大幫忙 謝謝

    回覆刪除
  5. 請把第二行
    #define MIC S3
    改成
    #define MIC SENSOR_3

    試試看

    回覆刪除
  6. 剛接觸的新手2010年8月22日 晚上8:33

    抱歉 最近工作有點忙 拖這們晚回你~
    謝謝大大幫忙我馬上去測試

    回覆刪除
  7. 您好!不好意思我們的程式有問題想請教一下!我們的程式無法條件性觸發超音波..麻煩您了!!

    int i;

    task main()
    {
    while(true)
    {
    OnFwd(OUT_AB,90);

    if(SensorUS(S1)<20)
    {

    Off(OUT_AB);
    OnRev(OUT_AB,90);
    Wait(3000);
    Off(OUT_AB);


    i=Random(1);


    if(i==0){
    OnFwd(OUT_A,90);
    Wait(1000);

    }

    if(i==1){
    OnFwd(OUT_B,90);
    Wait(1000);

    }
    }

    if(SensorUS(S2)<=20)
    {
    Off(OUT_AB);
    OnFwd(OUT_A,90);
    Wait(1000);

    }

    if(SensorUS(S3)<20)
    {
    Off(OUT_AB);
    OnFwd(OUT_B,90);
    Wait(1000);
    }
    }
    }

    回覆刪除
  8. 若要與上面超音波合在一起要怎麼修改!?謝謝!!
    int j;
    int sum;
    task main()
    {
    OnFwd(OUT_ABC,90);
    Wait(1000);
    Off(OUT_ABC);


    while(true)
    {
    OnFwd(OUT_AB,90);



    j=Random(100);
    sum=0;



    if(j<50){
    Off(OUT_AB);
    OnFwd(OUT_A,90);
    Wait(1000);
    OnFwd(OUT_AB,90);
    Wait(j*100);
    sum=sum+(j*100);

    }else{
    Off(OUT_AB);
    OnFwd(OUT_B,90);
    Wait(1000);
    OnFwd(OUT_AB,90);
    Wait(j*100);
    sum=sum+(j*100);
    }






    if(sum>=5000){
    break;
    }
    }

    OnRev(OUT_C,90);
    Wait(1000);
    Off(OUT_ABC);
    }

    回覆刪除
  9. 要使用SetSensorLowspeed(port)先設定Out Port是接Ultrasonic才行喔!
    請參考底下範例:


    task main()
    {
    const int d=20;
    SetSensorLowspeed(S1);
    SetSensorLowspeed(S2);
    SetSensorLowspeed(S3);
    while(true)
    {

    if(SensorUS(S1)<d)
    {
    TextOut(10,2,"S1<d");
    OnFwd(OUT_A,90);
    }

    if(SensorUS(S2)<=d)
    {
    TextOut(10,2,"S2<d");
    OnFwd(OUT_B,90);
    }

    if(SensorUS(S3)<d)
    {
    TextOut(10,2,"S3<d");
    OnFwd(OUT_C,90);
    }
    Wait(1000);
    Off(OUT_ABC);

    }
    }

    回覆刪除
  10. 請問1. 按下右鍵在NXT螢幕右方顯示RIGHT;
    2. 按下左鍵在NXT螢幕左方顯示LEFT;
    3. 按下中鍵在NXT螢幕中間顯示ENTER;
    4. 按下ESCAPE鍵則輸出一段音樂後離開程式。
    這要如何寫哩?

    回覆刪除
  11. task main()
    {
    bool btExit, btRight, btLeft, btCenter;
    SetLongAbort(true); //讓Exit功能進入長按模式,此功能要使用NXC的firmware
    SetAbortFlag(BTNSTATE_LONG_PRESSED_EV); //進入長按模式,此功能要使用NXC的firmware

    while (true)
    {
    btExit = ButtonPressed(BTNEXIT,false);
    btRight = ButtonPressed(BTNRIGHT,false);
    btLeft = ButtonPressed(BTNLEFT,false);
    btCenter = ButtonPressed(BTNCENTER,false);
    ClearScreen(); //清除螢幕

    if (btExit){
    while(ButtonPressed(BTNEXIT,false)==1); //等放開後才往下執行
    PlayFile("Woops.rso");
    TextOut(10,2,"Exit"); //在 (10,2)的位置(第一象限)輸出 Exit 字串
    Wait(2000); //等候2秒
    ClearScreen(); //清除螢幕
    StopAllTasks(); //停止程式
    }
    if (btRight){
    while(ButtonPressed(BTNRIGHT,false)==1); //等放開後才往下執行
    TextOut(60,2,"Right"); //在 (60,2)的位置(第一象限)輸出 Right 字串
    Wait(2000); //等候2秒
    ClearScreen(); //清除螢幕
    }
    if (btLeft){
    while(ButtonPressed(BTNLEFT,false)==1); //等放開後才往下執行
    TextOut(10,2,"Left"); //在 (10,2)的位置(第一象限)輸出 Left 字串
    Wait(2000); //等候2秒
    ClearScreen(); //清除螢幕
    }
    if (btCenter){
    while(ButtonPressed(BTNCENTER,false)==1); //等放開後才往下執行
    TextOut(30,2,"Center"); //在 (30,2)的位置(第一象限)輸出 Center 字串
    Wait(2000); //等候2秒
    ClearScreen(); //清除螢幕
    }
    }
    } //end while
    }

    回覆刪除
  12. 作者已經移除這則留言。

    回覆刪除
  13. 版大您好,我是剛接觸這塊領域的生手
    想做一個機械手臂,請問要怎麼讓機械手臂往下夾起物品後,在使他上升後,再向右平移放下物品。
    目前做到了 往下觸碰感應物品後會夾起物品,再上升,但他只會無限上升,卡關了
    task main()
    {

    SetSensorTouch(IN_1);//設定 port 1接到碰觸感應器,IN_1 也可以用 S1取代
    OnRev(OUT_B, 80);
    while (true)
    {
    if (SENSOR_1==1)// port 1讀到的數值會存在SENSOR_1中
    {
    OnFwd(OUT_A, 30); Wait(300);
    OnFwd(OUT_B, 50); Wait(300);


    } //end if

    } //end while

    }

    回覆刪除
  14. 因為您把程式寫在while(true)迴圈裏了,所以會一直上升,
    請改成
    task main()
    {
    SetSensorTouch(IN_1);//設定 port 1接到碰觸感應器,IN_1 也可以用 S1取代
    OnRev(OUT_B, 80);
    if (SENSOR_1==1)// port 1讀到的數值會存在SENSOR_1中
    {
    OnFwd(OUT_A, 30); Wait(300);
    OnFwd(OUT_B, 50); Wait(300);
    } //end if
    }

    回覆刪除
  15. 請問是直接把這串task main()
    {
    SetSensorTouch(IN_1);//設定 port 1接到碰觸感應器,IN_1 也可以用 S1取代
    OnRev(OUT_B, 80);
    if (SENSOR_1==1)// port 1讀到的數值會存在SENSOR_1中
    {
    OnFwd(OUT_A, 30); Wait(300);
    OnFwd(OUT_B, 50); Wait(300);
    } //end if
    }
    輸入進去就可以了嗎?
    我丟進去執行後 機械手臂只會往下動,約一秒就停止了,不知道是怎麼回事~"~

    回覆刪除
  16. 有沒有怎控制陀螺儀的範例程式~

    回覆刪除
  17. 作者已經移除這則留言。

    回覆刪除
  18. 期待您把多工的部分補上>_<我很想了解這部分!

    回覆刪除
  19. 謝謝。由於工作很忙,但我會盡力試試。

    回覆刪除