#content *課題3 [#l91ff4e8] #ref(課題3.png) 上の図のような紙を使用する。~ 2種類の空き缶(Aタイプ,Bタイプ)をそれぞれ3個づつ用意し、円XにABA、円YにBABとなるように3段づつ積み上げる。~ 空き缶には色をつけたり文字や記号を書いてもよい。あるいは周囲に紙を張ってもよい。~ *ルール [#v1d44981] 基本ルール~ ・競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。~ ・図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。~ ・空部分は領域からはみ出していてもよい。~ ・Aタイプの空き缶を円Y内に、Bタイプの空き缶を円X内に運ぶ。~ ・開始の合図から5秒以内にスタートボタンを押す作業を完了すること。~ ・競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。~ ・途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。~ 基本得点の計算方法~ ・運んだ空き缶の数×3点~ ・空き缶を積み重ねて置くことができば場合、2段目の空き缶一つにつき2点加算、3段目の空き缶一つにつき3点加算する。~ ・円内からはみ出している場合、半分以下なら1点減点、半分以上なら2点減点。~ ・間違った円内に空き缶を置いた場合は、1個につき1点減点。~ ・間違った円内の2段目に空き缶を置いた場合は1個につき3点減点、その上にある空き缶は0点~ 技術点の計算方法~ 以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(5チーム)が20点満点で採点し、その平均点を求める。 得点の目安: ~ ・空き缶を探し取りにいくまでの動作 (3点)~ ・空き缶を掴む動作 (3点)~ ・空き缶を運ぶ動作 (2点)~ ・空き缶を置く動作 (2点)~ ・空き缶を積む動作 (3点)~ ・2台のRCXまたはNXT、EV3の連携の良さ(2点)~ ・自立型のロボットとしての形や動作の美しさ、斬新さ(2点)~ ・その他 (3点)~ *ロボットの説明 [#j17a6a10] **アーム部分 [#q998f1fd] #ref(IMG_E1322ex.JPG) 写真のように滑り止めのために、アームと缶の接触部分にタイヤに取り付けた。また、積んだ2缶を同時に運べるようにアームに高さをだした。 #ref(アーム.png) アームの開閉は図のように行った。1つのモータでアームの手を両方動かすことができる。しかし、その分モータの出力が必要になる。 **アームを上下させる部分 [#z045562c] #ref(IMG_1324.JPG) #br #ref(IMG_1323.JPG) マスター #define CONN 1//スレーブの番号を割り振り #define AGERU RemoteStartProgram(CONN,"ageru.rxe");Wait(4500); //アームの上げるのを定義 #define SAGERU RemoteStartProgram(CONN,"sageru.rxe");Wait(3000); //アームの下げるのを定義 #define TUKAMU RemoteStartProgram(CONN,"tukamu.rxe");Wait(3500); //アームで掴むのを定義 #define HANASU RemoteStartProgram(CONN,"hanasu.rxe");Wait(3000); //アームで放すのを定義 #define MODOSU RemoteStartProgram(CONN,"modosu.rxe");Wait(3000); //アームを開きもとに戻す #define KUZUSU TUKAMU;AGERU;OnRev(OUT_BC,10);Wait(1000);Off(OUT_BC);OnFwd(OUT_B,15);OnRev(OUT_C,15);Wait(1500);Off(OUT_BC);OnFwd(OUT_BC,10);Wait(1000);Off(OUT_BC);Wait(3000);SAGERU;HANASU;TUKAMU;AGERU;OnRev(OUT_BC,10);Wait(1000);Off(OUT_BC);OnFwd(OUT_C,15);OnRev(OUT_B,15);Wait(1600);Off(OUT_BC);OnFwd(OUT_BC,10);Wait(1300);Off(OUT_BC);Wait(1000);SAGERU;HANASU; #define BLACK 40 #define LITTLE_BLACK 47 #define LITTLE_WHITE 53 #define WHITE 65 #define LEFT OnFwd(OUT_B,30);OnRev(OUT_C,30);Wait(1);Off(OUT_BC); #define LITTLE_LEFT OnFwd(OUT_B,35);OnFwd(OUT_C,20);Wait(1);Off(OUT_BC); #define LITTLE_RIGHT OnFwd(OUT_B,20);OnFwd(OUT_C,35);Wait(1);Off(OUT_BC); #define RIGHT OnFwd(OUT_C,30);OnRev(OUT_B,30);Wait(1);Off(OUT_BC); #define FRONT OnFwd(OUT_BC,25);Wait(1);Off(OUT_AC); #define LINE_LEFT if (SENSOR_1 < BLACK) {LEFT;KAZU += 3;} else if (SENSOR_1 < LITTLE_BLACK) {LITTLE_LEFT;KAZU += 1;} else if (SENSOR_1 > WHITE) {RIGHT;KAZU -= 1;} else if (SENSOR_1 > LITTLE_WHITE) {LITTLE_RIGHT;KAZU -= 3;} else {FRONT;KAZU *= 0;} #define LINE_RIGHT if (SENSOR_1 < BLACK) {RIGHT;KAZU += 3;} else if (SENSOR_1 < LITTLE_BLACK) {LITTLE_RIGHT;KAZU += 1;} else if (SENSOR_1 > WHITE) {LEFT;KAZU -= 1;}else if (SENSOR_1 > LITTLE_WHITE) {LITTLE_LEFT;KAZU -= 3;} else {FRONT;KAZU *= 0;} task main() { SetSensorLight(S1); //光センサを定義 int KAZU=0; int n = 0; long t0 = CurrentTick(); // until(BluetoothStatus(CONN)==NO_ERR); //つながるまで待機 RemotePlayTone(1,440,1000);Wait(1500); //最初に音を鳴らす MODOSU; //最初に念のため開いておく while(n < 1){ if (SENSOR_1 < BLACK){OnFwd(OUT_C,25);OnFwd(OUT_B,20);Wait(700);Off(OUT_BC);n++;Off(OUT_BC);Wait(1);} else {OnFwd(OUT_BC,20);Wait(1);Off(OUT_BC);} } n = 0; //黒を感知するまで進む//線を超えるために進む while(n < 1){ if (SENSOR_1 < LITTLE_WHITE){OnFwd(OUT_C,35);OnFwd(OUT_B,20);Wait(100);Off(OUT_BC);n++;Off(OUT_BC);Wait(1);} else {OnFwd(OUT_B,40);OnFwd(OUT_C,20);Wait(1);Off(OUT_BC);} } n = 0; //黒を感知するまで曲がる repeat(2000){LINE_RIGHT;};KAZU *= 0; while(KAZU < 300){LINE_RIGHT;}; PlaySound(SOUND_DOUBLE_BEEP); //十字の交差点を感知 OnFwd(OUT_C,30);OnRev(OUT_B,30);Wait(1200); //右に曲がる OnFwd(OUT_BC,15);Wait(300);Off(OUT_BC); repeat(2000){LINE_RIGHT;};KAZU *= 0; while(KAZU < 200){LINE_RIGHT;}; PlaySound(SOUND_DOUBLE_BEEP); //円との交差点を感知 KUZUSU; //缶を崩す OnFwd(OUT_BC,15);Wait(200);Off(OUT_BC); OnRev(OUT_BC,15);Wait(200);Off(OUT_BC); OnFwd(OUT_C,15);OnRev(OUT_B,30);Wait(200);Off(OUT_BC); OnFwd(OUT_B,15);OnRev(OUT_C,15);Wait(200);Off(OUT_BC); //ぐちゃぐちゃやって整える Wait(1000); SAGERU;TUKAMU; //引きずるために掴む Wait(2000); OnFwd(OUT_B,40);OnFwd(OUT_C,30);Wait(3000);Off(OUT_BC); //円を超えるために進む repeat(3000){LINE_RIGHT};KAZU *= 0; while(KAZU < 200){LINE_RIGHT}; PlaySound(SOUND_DOUBLE_BEEP); //十字の交差点を感知 /* OnFwd(OUT_C,20);OnRev(OUT_B,20);//右に曲がる Wait(2500); Off(OUT_BC); repeat(1500){LINE_RIGHT}; KAZU *= 0; while(KAZU < 100){LINE_RIGHT}; PlaySound(SOUND_DOUBLE_BEEP);//十字の交差点を感知 while(n < 1){ if (SENSOR_1 < BLACK){OnFwd(OUT_BC,20);Wait(1);Off(OUT_BC);} else{n++;Off(OUT_BC);Wait(1);} } n = 0; //白を感知するまで進む OnFwd(OUT_BC,25); Wait(700); Off(OUT_BC); MODOSU;*/ /*TUKAMU;AGERU; OnRev(OUT_BC,20);Wait(2000);Off(OUT_BC); OnFwd(OUT_B,30);OnRev(OUT_C,30); Wait(1000); Off(OUT_BC); OnFwd(OUT_BC,20);Wait(2000);Off(OUT_BC); SAGERU;HANASU; TUKAMU;AGERU; OnRev(OUT_BC,20);Wait(2000);Off(OUT_BC); OnFwd(OUT_C,30);OnRev(OUT_B,30); Wait(1000); Off(OUT_BC); OnFwd(OUT_BC,20);Wait(2000);Off(OUT_BC); SAGERU;HANASU;MODOSU;*/ /*repeat(1000){LINE_RIGHT}; KAZU *= 0; while(KAZU < 100){LINE_RIGHT}; PlaySound(SOUND_DOUBLE_BEEP);//円との交差点を感知 / † はなす } task main(){ OnFwd(OUT_A,1c0); Wait(500); Off(OUT_A); } 苦し紛れにつくったやつ #define CONN 1//スレーブの番号を割り振り #define AGERU RemoteStartProgram(CONN,"ageru.rxe");Wait(4500); //アームの上げるのを定義 #define SAGERU RemoteStartProgram(CONN,"sageru.rxe");Wait(3000); //アームの下げるのを定義 #define TUKAMU RemoteStartProgram(CONN,"tukamu.rxe");Wait(3500); //アームで掴むのを定義 #define HANASU RemoteStartProgram(CONN,"hanasu.rxe");Wait(3000); //アームで放すのを定義 #define MODOSU RemoteStartProgram(CONN,"modosu.rxe");Wait(3000); //アームを開きもとに戻す #define KUZUSU TUKAMU;AGERU;OnRev(OUT_BC,30);Wait(1000);Off(OUT_BC);OnFwd(OUT_B,30);OnRev(OUT_C,30);Wait(1500);Off(OUT_BC);OnFwd(OUT_BC,30);Wait(1000);Off(OUT_BC);Wait(3000);SAGERU;HANASU;TUKAMU;AGERU;OnRev(OUT_BC,30);Wait(1000);Off(OUT_BC);OnFwd(OUT_C,30);OnRev(OUT_B,30);Wait(2000);Off(OUT_BC);OnFwd(OUT_BC,30);Wait(1300);Off(OUT_BC);Wait(1000);SAGERU; task main() { MODOSU; RemotePlayTone(1,440,1000);Wait(1500); //最初に音を鳴らす OnFwd(OUT_BC,30); Wait(4000); Off(OUT_BC); KUZUSU; //缶を崩す OnFwd(OUT_BC,15);Wait(200);Off(OUT_BC); OnRev(OUT_BC,15);Wait(200);Off(OUT_BC); OnFwd(OUT_C,15);OnRev(OUT_B,30);Wait(200);Off(OUT_BC); OnFwd(OUT_B,15);OnRev(OUT_C,15);Wait(200);Off(OUT_BC); //ぐちゃぐちゃやって整える SAGERU;TUKAMU; //引きずるために掴む OnFwd(OUT_B,30); OnFwd(OUT_C,35); Wait(4000); Off(OUT_BC); OnFwd(OUT_C,30); Wait(500); Off(OUT_C); HANASU; MODOSU; } 上げる task main(){ OnRev(OUT_BC,30); OnRev(OUT_A,10); Wait(8000); } 戻す task main(){ OnFwd(OUT_A,20); Wait(1000); Off(OUT_A); } 下げる task main(){ OnFwd(OUT_BC,20); Wait(600); Off(OUT_BC); } 掴む task main(){ OnRev(OUT_A,20); Wait(1000); }