*目次 [#r61547b2] #contents *課題2の内容 [#v95515a7] -各チームで作成したコースを1周するロボットを製作せよ。 -交差点以外のコース上に350mlの空の空き缶を2個以上おき、空き缶にぶつかった時には次のような動作するプログラムを作成せよ --1.空き缶をコース上に戻して再びコースに戻って進む --2.空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む -※ただし、 --速さと正確さを追求すること --コースを1周したら自動的に止まること --交差点では一時停止すること *メンバー紹介 [#h24ebdbc] -T.Y -静岡太郎 *コース紹介 [#k101d602] #ref(2010a/A3/課題2右/IMGP0028.JPG,50%,コ−ス) くねくねしていて曲がりくねった捻くれコース 規則的でないから難しい! さらによく見れば何かに見える!? *ロボット紹介 [#b662ce62] **各部位の説明 [#j1ea737f] ---- 正面 #ref(2010a/A3/課題2右/IMGP0021.JPG,50%,光センサー) 緑で囲まれた部分は光センサー。 ---- アーム #ref(2010a/A3/課題2右/IMGP0023.JPG,50%,アーム部位) オレンジの丸で囲まれた部分で缶を支える。 ---- タッチセンサー #ref(2010a/A3/課題2右/IMGP0024.JPG,50%,タッチセンサー部位) ピンクの丸で囲まれた部分はタッチセンサーに缶が当たり損ねないように補助を付けて、前方のどこに当たってもよくした。 **工夫した点 [#dfa5d585] -アームとタッチセンサーでうまく缶を固定できるようにした。 -アームの位置は高すぎず、低すぎない位置につけた。 -バックしても缶を移動できるようにアームの先に輪をつけた。 -タッチセンサーに当たり損ねるのを防ぐためにバンパーを付けて前方のどこに当たってもよくした。 -各パーツを持ち運びやすいように孤立させた。 -前輪を大きくすることで車体を安定させた。 -複雑そうに見えるが意外とシンプルにロボットを作った。 -光センサーとタイヤの位置を近くして線に沿って移動させやすくした。 **苦労した点 [#q1023dd0] -どうやって缶を移動させるか。 -アームと輪の部分をどうやって連結させるか。 -タッチセンサーにどうやって缶をうまくあてるか。 -光センサーをどこにつけるか。 -重心が前すぎないようにするためにはどうするか。 *プログラム紹介 [#m0575cc2] **T.Yのプログラム [#h9371237] #define arm_up OnFwd(OUT_C);Wait(13);Off(OUT_C); //アームアップ #define arm_down OnRev(OUT_C);Wait(16);Off(OUT_C); //アームダウン #define THRE 40 //閾値(光センサー1) #define THRE3 44 //閾値(光センサー3) #define go OnFwd(OUT_A+OUT_B); //前進 #define back OnRev(OUT_A+OUT_B); //後退 #define right(t) OnFwd(OUT_A);OnRev(OUT_B);Wait(100); //右に向く(tによって角度変化) #define left(t) OnFwd(OUT_B);OnRev(OUT_A);Wait(t); //左を向く(tによって角度変化) #define turn OnFwd(OUT_A);OnRev(OUT_B);Wait(200);Off(OUT_A+OUT_B); //180度回転 task main() { SetSensor(SENSOR_1,SENSOR_TOUCH);//1はタッチセンサ SetSensor(SENSOR_2,SENSOR_LIGHT);//2は光センサ SetSensor(SENSOR_3,SENSOR_LIGHT);//3は光センサ int flag=0; while (flag<6) { // if (SENSOR_2 > THRE) {if (SENSOR_3 > THRE3){go;} //光センサ2、3が白にある時 else{OnFwd(OUT_B);OnRev(OUT_A);} //光センサ3が黒線上にある時 } else {if (SENSOR_3 > THRE3){OnFwd(OUT_A);OnRev(OUT_B);} //光センサ2が黒線上にある時 else{if(flag==0){Off(OUT_A+OUT_B);Wait(100);go;Wait(150);turn(100);arm_up;back;Wait(60);right(100); flag++;} //最初の交差点に空き缶を置く else if(flag==2){Off(OUT_A+OUT_B);Wait(100);go;Wait(30);flag++;}//2回目の交差点 else if(flag==3){Off(OUT_A+OUT_B);Wait(100);go;Wait(150);turn(100);arm_up;back;Wait(60);right(100);flag++;}//三回目の交差点 else if(flag==4){Off(OUT_A+OUT_B);Wait(100);go;Wait(30);flag++;} else if(flag==5){Off(OUT_A+OUT_B);Wait(100);go;Wait(30);flag++;} } } if(SENSOR_1==1){if((flag==0)||(flag==3)){Off(OUT_A+OUT_B);Wait(100);arm_down;}//空き缶キャッチ else if(flag==1){Off(OUT_A+OUT_B);Wait(100);left(110);go;Wait(190);right(10); go;Wait(190);right(50);go;Wait(160);left(100);flag++;} //最初の交差点空き缶避ける } } Off(OUT_A+OUT_B); } ***工夫した点 [#zf3d1a2d] -コースが不規則で難しいコースなので、交差点で微調整してもなかなかうまくいかず、交差点一回一回微調整をしてようやくうまくいった。 -whileをつかって、最後の交差点が来たら止まるようにプログラムをした。 -ラインをトレースするとき、片方のタイヤを止まらせるだけではカーブがうまく回れないので、タイヤを別々反対の動きをしてそれを解消した。 -交差点で空き缶を残してしまうので、残した空き缶に当たったら空き缶をよけて、次に進むようにした。 -マクロを使って回転する角度を微調整をした。 ***反省点 [#p3bf4229] -もっとプログラムを簡略化できたのではないかと思った。 -コースアウトした時のプログラムを考えていなかった。 -あまり定数を使わないで、もっとロボットに任せられるプログラムを作れればと思った。 -空き缶をキャッチするのがなかなかうまくいかなかったので、今度はロボットをいろいろ工夫してみようと思った。 ***感想 [#lfcc46db] -一回目の課題と違って、とても難易度が上がっていて、時間がかかった。 -if文をつかっていると間違えが時々わからなくなって苦労した。 -今回の課題を通してだいぶロボットに愛着がわいた。 -プログラミングをやっていると、だんだんプログラミングがわかって、プログラミングが面白く感じた。 **静岡太郎のプログラム [#pde3a14a] #define arm_up OnFwd(OUT_C);Wait(10); //アームを上げる #define arm_down OnRev(OUT_C);Wait(10); //アームを下げる #define sensor 40 //閾値 #define sensor2 44 #define go OnFwd(OUT_A+OUT_B); //前進 #define back OnRev(OUT_A+OUT_B); //後退 #define right OnFwd(OUT_A);OnRev(OUT_B);Wait(100);Off(OUT_A+OUT_C); //右に向く #define lefr OnFwd(OUT_B);OnRev(OUT_A);Wait(100);Off(OUT_A+OUT_C); //左に向く #define crossing_right(t) Off(OUT_A+OUT_B);Wait(100);OnFwd(OUT_B);OnRev(OUT_A);Wait(20);OnFwd(OUT_A+OUT_B);Wait(t);kousaten++; //交差点の対処 #define crossing_left(t) Off(OUT_A+OUT_B);Wait(100);OnFwd(OUT_A);OnRev(OUT_B);Wait(20);OnFwd(OUT_A+OUT_B);Wait(t);kousaten++; //交差点の対処 #define turn OnFwd(OUT_A);OnRev(OUT_B);Wait(200);Off(OUT_A+OUT_B); //180度回転 task main() { SetSensor(SENSOR_1,SENSOR_TOUCH);//1はタッチセンサ SetSensor(SENSOR_2,SENSOR_LIGHT);//2は光センサ SetSensor(SENSOR_3,SENSOR_LIGHT);//3は光センサ while (true) { start follow_line; //ライントレース開始 until(SENSOR_1==1); //タッチセンサーが反応したら以下のプログラムを実行 stop follow_line; //ライントレース停止 arm_down; OnRev(OUT_A+OUT_B); //缶を掴みつつ回転,缶を後方へ OnFwd(OUT_C);Wait(180); Off(OUT_B); back;Wait(40); //位置修正 arm_up; back;Wait(50); //缶から離れる turn; } } task follow_line () //ライントレースのプログラム { int kousaten=0; while (kousaten<6) { if (SENSOR_2 > sensor) {if (SENSOR_3 > sensor2){go;} //光センサ2、3が白にある時前進 else{OnFwd(OUT_B);OnRev(OUT_A);} //光センサ3が黒線上にある時 } else {if (SENSOR_3 > sensor2){OnFwd(OUT_A); //光センサ2が黒線上にある時 OnRev(OUT_B);} else{if(kousaten==0){crossing_right(30);} //最初の交差点 else if(kousaten==1){crossing_left(40);} else if(kousaten==2){crossing_right(40);} else if(kousaten==3){crossing_left(30);} else if(kousaten==4){crossing_right(30);} else if(kousaten==5){crossing_left(30);} } } } Off(OUT_A+OUT_B); } ***工夫した点 [#c070d4d2] -コースが捻くれているので交差点の部分がかなり大変だったが、一回一回何度も試運転をしてその度に微調整を繰り返し、上手くいくように努力した。 -タッチセンサーとライントレースのプログラムを別々にはなして入力することでプログラム編集をしやすくした。 -できる限り動きがスムーズになるようにプログラムした。 -タッチセンサーが反応して缶を後ろに置くのにタイミングが難しく何度も頑張りちょうど良い時間をみつけた。 ***反省点 [#eb570f1c] -コースから外れたときのプログラムをしていなかった。 -プログラムを見た感じまだゴチャゴチャしているのでもっと簡略化ができたような気がする。 - - ***感想 [#ge5d43c6] *全体の反省 [#f26f747f] *コメント欄 [#ja96bab1] -コメントお願いします。 - 箇条書きで簡潔に述べられて良いと思います。苦労した点の原因なども書いてみてください -- [[TAKA]] &new{2010-07-02 (金) 17:26:39}; #comment