[[2010a]] *目次 [#f8b8a456] #contents *課題2 [#da324a89] 課題2:黒い線に沿って動くロボット † 各チームで作成したコースを1周するロボットを製作せよ。交差点以外のコース上に350mlの空の空き缶を2個以上おき、空き缶にぶつかった時には次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する) 1. 空き缶をコース上に戻して再びコースに戻って進む 2. 空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む 3. 奇数回目に空き缶に遭遇したら、その場で反転して進み、偶数回目に遭遇したら、空き缶を押しのけて進む ただし、 * 速さと正確さを追求すること * コースを1周したら自動的に止まること * 交差点では一時停止すること *メンバー紹介 [#v48511d0] しょうご、カズ、マコト *コース紹介 [#nef8554c] A2左のコースと同じ #ref(SN3L0001.jpg) *ロボット紹介 [#a690a204] 三人で一台のロボットを作りました。 **ロボット1(失敗作) [#f9a624d7] #ref(20100621140444.jpg) 前。光センサーの間隔が狭く、コースに沿ってうまく進みませんでした。&br; またアームの強度が弱く、うまく動かすことができませんでした。 **ロボット2(成功作) [#xe1e9216] #ref(SN3L00030001.jpg) 前。光センサーの間隔を広げました。 #ref(a.jpg) タッチパネルです。タッチパネルの前に缶に当たるものを置くことでセンサーがより反応するようにしました。 #ref(SN3L00020001.jpg) 光センサーです。2つ使うことでうまく進むようになりました。また間隔を試行錯誤で決めました。 *ロボット制作での工夫、問題点 [#oa73e620] 工夫 ・タッチパネルをより押しやすくするためにタッチセンサーの前に部品を置いたこと。&br; ・アームの強度をなるべく上げるために部品を多く用いたこと。&br; ・前のほうに重心がかかってもいいようにタイヤを1つ増やしたこと。 &br; ・デザインとして羽を付けたこと。(笑) &br; 問題点 ・アームをどのように付けるか。→あまりうまくできませんでしたが、試行錯誤しました。&br; ・光センサーの間隔をどうするか。→試行錯誤でちょうどいい間隔にできました。 &br; *それぞれのプログラムの紹介 [#k258a730] それぞれ順番に1、2、3となっています。 **しょうごのプログラム [#o8eca2c2] #define go OnFwd(OUT_A+OUT_C); //進む #define turn_right OnFwd(OUT_C);OnRev(OUT_A);Wait(1); //右に回る #define turn_left OnFwd(OUT_A);OnRev(OUT_C);Wait(1); //左に回る #define tomaru Off(OUT_A+OUT_C); //止まる #define back OnRev(OUT_A+OUT_C); //戻る #define goes OnFwd(OUT_A+OUT_C);Wait(40); //進む #define turn_leftb OnFwd(OUT_A);OnRev(OUT_C); //右に回るtime free #define turn_rightb OnFwd(OUT_C);OnRev(OUT_A); //左に回るtime free #define arm_on OnFwd(OUT_B);Wait(8);Off(OUT_B); //缶を掴む #define arm_off OnRev(OUT_B);Wait(8);Off(OUT_B); //缶を離す task main(){ SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_3,SENSOR_LIGHT); int move_time = 10 ; while (move_time < 18){ //両センサー白の時進む if (SENSOR_1>39 && SENSOR_3>39){ go; }else if(SENSOR_3>39){ //右に回る turn_right; }else if(SENSOR_1>39 ){ //左に回る turn_left; } else{ tomaru; //交差点 Wait(150); go; Wait(30); move_time = move_time + 1; } if(SENSOR_2 == 1){ //缶をタッチしたとき arm_on; PlaySound(SOUND_UP) ; turn_rightb;Wait(100); go; Wait(70); arm_off; //缶を離し後退 back; Wait(70); turn_leftb;Wait(100); } } go; //交差点8つ通過後少し進み止まる Wait(20); tomaru; } **カズのプログラム [#bb6424f1] #define START OnFwd(OUT_A+OUT_C); //前進 #define STOP Off(OUT_A+OUT_C); //停止 #define BACK OnRev(OUT_A+OUT_C); //後退 #define arm_l OnFwd(OUT_B);Wait(30);Off(OUT_B); //アーム操作 #define BORDER 39 //閾値 #define RIGHT OnFwd(OUT_C);OnRev(OUT_A); //右折 #define LIGHT OnFwd(OUT_A);OnRev(OUT_C); //左折 #define turn OnFwd(OUT_A);OnRev(OUT_C);Wait(220);Off(OUT_A+OUT_C); //180°回転 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //光センサー(左) SetSensor(SENSOR_2,SENSOR_TOUCH); //タッチセンサー SetSensor(SENSOR_3,SENSOR_LIGHT); //光センサー(右) SetPower(OUT_B,1); //センサーBのパワーを1とする int flag=0; while(flag<8){ //ライントレース開始 if(SENSOR_1>BORDER && SENSOR_3>BORDER){ //光センサーが両方白のとき { START;} //前進 else if(SENSOR_1>BORDER){ //光センサー3が黒のとき LIGHT;} //左折 else if(SENSOR_3>BORDER){ //光センサー1が黒のとき RIGHT;} //右折 else{ //光センサーが両方黒のとき STOP;Wait(150); //停止 START;Wait(30); flag++;} //flagに1を追加 if(SENSOR_2==1){ //タッチセンサー反応 arm_l; //アーム操作 START;Wait(20);flag++; until((SENSOR_1<BORDER)&&(SENSOR_3<BORDER)); if(SENSOR_1>BORDER && SENSOR_3>BORDER) { START;} else if(SENSOR_1>BORDER){ LIGHT; } else if(SENSOR_3>BORDER){ RIGHT;} else{ STOP;Wait(150); //停止 START;Wait(100); //前進 STOP; //停止 turn; //回転 STOP; //停止 START;Wait(100); //前進 STOP; //停止 OnRev(OUT_B); //アーム操作 Off(OUT_B); BACK;Wait(100); //後退 turn; //回転 STOP; //停止 START;Wait(20);flag++; } } } STOP; //停止 } **マコトのプログラム [#y99d2434] #define go_front OnFwd(OUT_A+OUT_C); //前進 #define turn_left(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_A+OUT_C); //左折 #define turn_right(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C);//右折 #define stay Off(OUT_A+OUT_C);//止まる #define THRESHOLD 40//閾値 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサー SetSensor(SENSOR_2,SENSOR_TOUCH);//センサー2をタッチセンサー SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3を光センサー while(true)//whileは常に真 {start follow_line;//ライントレース開始 int n=0;//nの値を定義 while(n==1){//nが1の時 if(SENSOR_2==1)//タッチセンサーが反応 turn_left(200);//反転 n++;//nを1増やす } while(n==2){//nが2の時 if(SENSOR_2==1)//センサーが反応 go_front;//直進 n--;//nを1減らす} int turn_count=0;//turn_countを定義 task follow_line()//ライントレースのプログラム { while(turn_count<10){//9回交差点に当たったら停止 go_front;//直進 until((SENSOR_1<THRESHOLD)||(SENSOR_3<THRESHOLD))//光センサーが黒になるまで stay; if(SENSOR_1<THRESHOLD){//左の光センサーが黒 OnFwd(OUT_C);OnRev(OUT_A);//右折 until(SENSOR_1>THRESHOLD)//ライン上に戻るまで stay;} else if(SENSOR_3<THRESHOLD){//右の光センサーが黒 OnFwd(OUT_A);OnRev(OUT_C);//左折 until(SENSOR_3>THRESHOLD)//ライン上に戻るまで stay; else if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)){//両方のセンサーが黒 Wait(100);//一旦停止 turn_count++;//カウントを増やす go_front;//前進 until((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD))//両方のセンサーが白になるまで stay;} stay;} } } *全体の反省点 [#a3ea6c86] ・偶数回目、奇数回目というのがどうやればいいのか分からずに苦戦した。 マコト &br; ・カンを運ぶプログラムをどのように作ればいいか考えるのに苦労した。 カズ &br; ・止まり方を考えるのに苦労した。 しょうご *コメント [#lf62dd8b] - 失敗作と成功作との違い、問題点に対する改善策などを書いてください -- [[TAKA]] &new{2010-07-02 (金) 17:14:58}; #comment コメントをよろしくお願いします。