2010a 目次
各チームで作成したコースを1周するロボットを製作せよ。交差点以外のコース上に350mlの空の空き缶を2個以上おき、空き缶にぶつかった時には次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する)
1.空き缶をコース上に戻して再びコースに戻って進む
2.空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む
3.奇数回目に空き缶に遭遇したら、その場で反転して進み、偶数回目に遭遇したら、空き缶を押しのけて進む ただし、
•速さと正確さを追求すること
•コースを1周したら自動的に止まること
•交差点では一時停止すること
舩山 蔵
鎌倉 竜馬
・より安定なロボットを制作する。
・確実に読み取れるロボットを作る。
・コースはシンプルかつ単純すぎないやつにした。
・紙ぎりぎりに書いてしまったために、ロボットがはみ出してしまい、読みとってくれないときがあって大変だった。
・一回目の失敗 この構造では、タッチセンサーに当たらないので失敗。
・二回目の本体もいまいちうまくいかず失敗。タッチセンサーもアームも失敗であった。
・これでもだめだった。アームが上の位置にありすぎた。しかし、↓のアーム三回目で成功
・一回目のアーム↑と二回目のアーム↓どちらもうまく空き缶を運べなかった。幅が狭かったせいかもしれない。
↓三回目
・これでやっと空き缶をとってくれる。掴まなくてもちゃんと運んでくれた。
・光センサーはここにつけることですぐに成功した。だが二つのセンサーで読み取る値が違うので上下にずらした。
・一つのセンサーが壊れていたため一つで挑戦したが、反応せず・・・
・シングルバンパーだとうまく、反応してくれたが、さらにゴムで補助。
・アームを作る際、車体から大きく外れてアームが飛び出るため強度が小さくなってしまうのでブロックを車体全体で組みバランスをとった。
・タッチセンサーを反応しやすく、ゴムで固定した。
・壊れていて長いのを使ったがこれにより邪魔にならない。
・光センサーを二つ使用してライントレースを試みたのだが二つのセンサーで光の感度が異なっていたことである。
・「一回目の失敗」であるようにタッチセンターに空き缶があたらず感知できないという問題が発生。
・直線を進む場合は比較的に想像通りに進むが、カーブでコースアウトする。
・うまく缶を運んでくれない。
・センサーの高さを揃えずに白い所で同じ値になるような高さに設置した。
・タッチセンサーの位置を前にだして缶に当たるようにした。
・カーブのところでコースアウトしないように、光センサーの値を調節した。
・アームのところを太くしたりして、缶に接触する面積を広くしたことで安定して缶を運ぶことに成功した。
//1.空き缶をコース上に戻して再びコースに戻って進む// #define a OUT_A #define c OUT_C #define THRESHOLD 38//光センサーの値 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT);//センサー1を光センサー左とする SetSensor(SENSOR_2,SENSOR_TOUCH);//センサー2をタッチセンサーとする SetSensor(SENSOR_3,SENSOR_LIGHT);//センサー3を光センサー右とする int x;変数x x=0;初期値0とおく while(true){ if(SENSOR_2==1){ //タッチセンサーが反応した時 OnFwd(c);OnRev(a);Wait(250);OnRev(a+c);Wait(200);Off(a+c);//空き缶をとり、反転して元の位置に戻す OnFwd(a);OnRev(c);Wait(150);Off(a+c);} //その後コース上に戻る if (SENSOR_1>THRESHOLD){ //光センサー左が白の位置にある時 if (SENSOR_3>THRESHOLD){ //両方のセンサーが白の位置にある時 OnFwd(a+c);} //直進 else{ //右が黒の位置にある時、右に曲がる OnFwd(a); Wait(7); Off(a); OnRev(c); Wait(2); Off(c); } } else{ //左が黒の位置にある時 if(SENSOR_3>THRESHOLD){ //右が白の位置にある時、左にまがる OnFwd(c); Wait(7); Off(c); OnRev(a); Wait(2); Off(a); } else{ //交差点上の時 Off(a+c);Wait(40); //一時停止 OnFwd(a+c); //前進 Wait(10); Off(a+c); x = x + 1; //交差点ごとにカウント } if(x >= 12)break; //カウントが一周分すると終了 } } }
・今回の課題のプログラムを制作するのは大変だった。何回も光センサーの値を変え、これに至った。
task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //1のセンサーに光センサーを定義 SetSensor(SENSOR_3,SENSOR_LIGHT); //2のセンサーにタッチセンサーを定義 SetSensor(SENSOR_2,SENSOR_TOUCH); //3のセンサーに光センサーを定義 ClearTimer(0); int cx; //intについては別途記します while(Timer(0)<=950) { //ライントレース開始!
if(SENSOR_1 < 40){OnFwd(OUT_C);OnRev(OUT_A);Wait(4); } //光センサー1が40より小さい値をとると左のタイヤをリバースして左に進路を修正
else if(SENSOR_3 < 40){ OnFwd(OUT_A);OnRev(OUT_C);Wait(4); } //光センサー2が40より小さい値をとると右のタイヤをリバースさせて右に進路を修正 if((SENSOR_1 < 40) && (SENSOR_3 < 40)){Off(OUT_A+OUT_C); Wait(200); //両方のセンサーが40より小さい値を同時にとると交差点に差し掛かったので2秒一時停止 OnFwd(OUT_A+OUT_C);Wait(50);cx=cx+1;} else{ OnFwd(OUT_A+OUT_C); Wait(4);} 方向修正が必要ないとき、光センサーがラインを割ってないときは直進
ここより空きかんを使った課題
if(SENSOR_2==1){ Off(OUT_A+OUT_C); Wait(90); //タッチセンサーで空き缶を感知したら一時停止をして if(SENSOR_1 < 40){OnFwd(OUT_C);OnRev(OUT_A);Wait(4); } else if(SENSOR_3 < 40){ OnFwd(OUT_A);OnRev(OUT_C);Wait(4); } //空き缶を運びつつライントレース if((SENSOR_1 < 40) && (SENSOR_3 < 40)){OnFwd(OUT_A+OUT_C);Wait(150); //交差点を感知したら反転したときに空き缶が交差点に来るように前進 Off(OUT_A+OUT_C); Wait(100); //一旦停止 OnFwd(OUT_A);OnRev(OUT_C);Wait(170); //反時計回りに180° OnRev(OUT_A+OUT_C);Wait(150); //バックして缶を置く OnFwd(OUT_A);OnRev(OUT_C);Wait(170); // 向きを直して OnFwd(OUT_A+OUT_C);Wait(10);} } //ライントレース再開 }if int cx=6{Off(OUT_A+OUT_C);}}
プログラム中にint cx と出てきましたがこれについて説明します。 交差点に差し掛かると、カウントと数えるようにします。これは一周して止まるためです。どういうことかというと、一周するには6回交差点をまたぎます。そこで六回目に止まらせるためにint でカウントをして6になったら停止するようにした。
・「if」、「else」をつかったプログラムはなかなか慣れずに思うような動きをするプログラムが組めなかった。
・ライントレースを最初うまくできずに苦戦したが、試行錯誤の上なからプログラムができた。
・アーム、タッチ、光の構造や配置などに苦労したが、二人で意見を出し合って完成できた。
・一回目の課題とはかなりの違いで難しかった。だけど、やっとロボットをやっている感じがして面白かった。
・難しいからこそのできた時の喜びが大きかった。
・タッチセンサーを三種類考えた。鎌倉が二つ。舩山一つ。鎌倉のは二つとも缶を感知しなかったり、接触しなかったりと最終的に舩山の案を採用した。