2019a/Member

課題

ピンポン玉または青と赤のボールを運搬して、所定の容器の中に入れる。

1.png

フィールドの説明

ロボット

アームが大きくなったためメインも大きくした

20.JPG

メイン構造

以下に光センサーがある。タイヤよりやや前に設置することで早めに感知差することができる。

三輪にすることで機動性が高くなった。

30.png

NXCの本体を横にするにことで問題となっていたアームの高さを解決した。

アーム構造

アームの下にあるゴム部分からボールを押さえ開閉部分を閉じることでボールを持ち上げる。

アームの開閉部分を開けることで入っていたボールが外に転がる。

40(2).png

プログラム

50%

赤の通りに進んでいく基本的にライントレースで進んでいく

メールボックスは重くならないように二つ使用

ライントレースの説明は第二回を参照

親機のプログラム

マクロ

色の定義

#define BL 40
#define WH 47
#define HB 32
#define HW 55

曲がる定義

#define left OnFwd(OUT_B,45);OnRev(OUT_C,40);
#define right OnFwd(OUT_C,45);OnRev(OUT_B,40);
#define lefts OnFwd(OUT_B,38);OnFwd(OUT_C,25);
#define rights OnFwd(OUT_C,38);OnFwd(OUT_B,25);

子機を番号として定義

#define CONN 1

サブルーチン

線の左をライントレース

 sub hidari()
 {
    SetSensorLight(S3); 
    long t0=CurrentTick(); 
    while(CurrentTick()-t0<=250){
        if(SENSOR_3>HW){
            right;
            t0=CurrentTick();
        }else if(SENSOR_3>WH){
            rights;
            t0=CurrentTick();
        }else if(SENSOR_3>BL){
            OnFwd(OUT_BC,30);
            t0=CurrentTick();
        }else if(SENSOR_3>HB){
            lefts;
            t0=CurrentTick();
        }else{
            left;
         } 
    }
    Off(OUT_BC); 
 }

交差点を横断

 sub oudann()
 {
    right;  //方向転換
    Wait(300);
    Off(OUT_BC);
    OnFwd(OUT_BC,30);  //横断
    Wait(500);
    Off(OUT_BC);
 }

白をカウントして止まる

 sub magari()
 {
    SetSensorLight(S3);
    int nOnline=0;
    while(nOnline<4600){  //白を4.6秒カウントしたら止まる
        if(SENSOR_3>HW){
             right;
             nOnline++;  //カウントさせる
        }else if(SENSOR_3>WH){
             rights;
        }else if(SENSOR_3>BL){
              OnFwd(OUT_BC,30);
        }else if(SENSOR_3>HB){
               lefts;
        }else{
               left;
        }       
    }
    Off(OUT_BC);             
 }

アームが上がる

sub arm_up()
{
   int msg;  //メッセージを送る定義(以下同)
   until(BluetoothStatus(1)==NO_ERR);  //子機にノーエラーが出るまで待つ(以下同)
   RemoteStartProgram(1,"TAI(S1).rxe");  //子機番号1のプログラム"TAI(S1)"を開始させる
   while(msg !=11){  //メッセージ「11」を受け取るまで停止
       ReceiveRemoteNumber(MAILBOX1,true,msg);  //メールボックス1からメッセージを受け取る(以下同)
   }
    Wait(2000);
}

アームが下がる

sub arm_down()
{
    int msg;
    until(BluetoothStatus(1)==NO_ERR);
    RemoteStartProgram(1,"TAI(S2).rxe");  //子機番号1の”TAI(S2)”を開始させる
    while(msg !=12){  //メッセージ「12」を受け取るまで停止
        ReceiveRemoteNumber(MAILBOX1,true,msg); 
    }
    Wait(2000);
}

アームが開く

sub arm_open()
{
    int msg;
    until(BluetoothStatus(1)==NO_ERR);
    RemoteStartProgram(1,"TAI(S3).rxe");  //子機番号1の”TAI(S3)”を開始させる
    while(msg !=13){  //メッセージ「13」を受け取るまで停止
       ReceiveRemoteNumber(MAILBOX2,true,msg);  //メールボックス2からメッセージを受け取る(以下同)
    }
    Wait(2000);
}

アームが閉じる

sub arm_close()
{
    int msg;
    until(BluetoothStatus(1)==NO_ERR);
    RemoteStartProgram(1,"TAI(S4).rxe");  //子機番号1の”TAI(S4)”を開始させる
    while(msg !=14){  //メッセージ「14」を受け取るまで停止
        ReceiveRemoteNumber(MAILBOX2,true,msg);
    }
    Wait(2000);
}

メインプログラム

task main()
{
    hidari();
    oudann();
    magari();
    arm_up();
    OnFwd(OUT_BC,30);
    Wait(300);
    Off(OUT_BC);
    arm_down();
    arm_close();
    left;
    Wait(1500);
    Off(OUT_BC);
    OnFwd(OUT_BC,30);
    Wait(2000);
    Off(OUT_BC);
    arm_up();
    arm_down();
    left;
    Wait(2500);
    Off(OUT_BC);
    OnFwd(OUT_BC,40);
    Wait(5000);
    Off(OUT_BC);
    hidari();
    oudann();
    hidari();
    oudann();
    hidari();
    arm_up();
    arm_open();
}

子機のプログラム

アームが上がる

TAI(S1)

sub arm_up_s()
{
      OnRev(OUT_C,50);  //アームが上がる
      Wait(5000);
      Off(OUT_C);
}
task main()
{
      arm_up_s();
       SendResponseNumber(MAILBOX1,11);  //メールボックスに「11」と送る
}

アームが下がる

TAI(S2)

sub arm_down_s()
{
      OnFwd(OUT_C,30);  //アームが下がる
      Wait(3000);
      Off(OUT_C);
}
task main()
{
      arm_down_s();
       SendResponseNumber(MAILBOX1,12);  //メールボックス1に「12」と送る
}

アームが開く

TAI(S3)

sub open_s()
{
      OnFwd(OUT_B,30);  //アームが開く
      Wait(3000);
      Off(OUT_B);
}
task main()
{
       open_s();
       SendResponseNumber(MAILBOX2,13);  //メールボックス2に「13」と送る
}

アームが閉じる

TAI(S4)

sub close_s()
{
      OnRev(OUT_B,50);  //アームを閉じる
      Wait(5000);
      Off(OUT_B);
}
task main()
{
       close_s();
       SendResponseNumber(MAILBOX2,14);  //メールボックス2に「14」と送る
} 

反省 感想

アームが重くロボットの製作に時間がかかった。アームの構造によりカップの中の玉をつかむのが運次第になってしまい改善点があった。役割分担がうまくできずに時間がかかってしまった。アームを大きくしてしまったため本体が大きくなるにつれ不具合が生じた。アームの構造をもっと簡素化させ小さい機体にすればよかった。


添付ファイル: file10.png 140件 [詳細] file40(2).png 127件 [詳細] file30.png 197件 [詳細] file20.JPG 103件 [詳細] file1.png 129件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-08-15 (木) 00:00:18