各チームで次のようなコースを作成し、コースを2周するロボットを製作せよ。
・黒い線の幅は15〜25mmの範囲で一定にすること ・交差点が3箇所以上あること ・直角のコーナーを2箇所以上設置すること ・近道を2箇所 (直角のコーナーをショートカットしてもよい) ・スタート地点にはコースに直角に横5cmのラインを描く ・速さと正確さを追求すること ・2周目はスタート地点の直前で自動的に止まること ・近道を選択するプログラムとそうでないプログラムを2人で分担して作成すること
・ヒカル ・小柳
今回の課題ではスピードも求められていたので、できるだけ軽量化することにしました。初めは、後ろに小さい車輪をつけて機動力を上げようと考えていたのですが、何度か走らせているうちに、車輪がなくても機動力が変わらないことに気付きました。なので、ロボット本体のほうは速さを求める事にしました。なので、最終的には初めの土台にタイヤをつけただけにして重さを最小限にしました。
ロボット本体で工夫したことは、軽量化した機体にどう回転センサや光センサを取り付けるかというところです。写真でわかるように回転センサは機体の中心部分に埋め込み、光センサを機体の前方部分に取り付けました。初めは取れないように光センサも内側に取り付けようとしましたが、取り外しがめんどくさくなるのとコードがごちゃごちゃしてしまうので、外に取り付けることにしました。そして、写真からは少し見づらいかもしれませんが、光センサは簡単に取り外しができ、ずれないように固定するようにしたことが、一番苦労したところでした。
単純な作りですが、きっちりと条件を満たすように努力しました。ショートカットの部分はもう少しコマ割りにしてみたかったのですが、それだとロボットを走らせたときにその動きが分かりづらいと思いましたので、少し大回りを意識してみました。一周の距離は少し短めですが、カーブや90度の右左折が多いので時間的にはちょうどいいと思います。
#define Right(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C);//右に回る #define Left(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_A+OUT_C); //左に回る #define THRESHOLD1 40 // 閾値1 #define THRESHOLD2 50 // 閾値2 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); // センサ端子1と3に接続されたセンサが SetSensor(SENSOR_3,SENSOR_LIGHT); // 光センサであると宣言 SetSensor(SENSOR_2,SENSOR_ROTATION);// センサ端子2に接続されたセンサが回転センサであると宣言 while(SENSOR_2 > -528){ OnFwd(OUT_A+OUT_C); if(SENSOR_1 < THRESHOLD1){ //右に逸れたとき左に戻る Left(5); } else if(SENSOR_3 < THRESHOLD2){ //左に逸れたとき右に戻る Right(5); } while((SENSOR_1 < THRESHOLD1)&&(SENSOR_3 < THRESHOLD2)){//交差点ではまっすぐ進む OnFwd(OUT_A+OUT_C); } if((SENSOR_2 == -87)||(SENSOR_2 == -352)){ //1周目と2周目の1回目の近道を曲がる Right(30); OnFwd(OUT_A+OUT_C); Wait(30); } if((SENSOR_2 == -133)||(SENSOR_2 == -398)){ //1周目と2周目の2回目の近道を曲がる Left(30); OnFwd(OUT_A+OUT_C); Wait(30); } } Off(OUT_A+OUT_C); //滑走を終える }
#define Right(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C);//右に曲がる #define Left(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_C+OUT_A); //左に曲がる #define THRESHOLD1 40 //閾値1 #define THRESHOLD2 50 //閾値2 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ端子1、3に接続されたセンサが SetSensor(SENSOR_3,SENSOR_LIGHT); //光センサであると宣言 SetSensor(SENSOR_2,SENSOR_ROTATION); //センサ端子2に接続されたセンサが回転センサであると宣言 while(SENSOR_2>-647){ OnFwd(OUT_A+OUT_C); if(SENSOR_1<THRESHOLD1){ Left(5); } else if(SENSOR_3<THRESHOLD2){ Right(5); } while((SENSOR_1<THRESHOLD1)&&(SENSOR_3<THRESHOLD2)){ OnFwd(OUT_A+OUT_C); } }Off(OUT_A+OUT_C); }
今回の課題では前回の反省を生かし、少しこれたプログラミングができたと思いました。前回は初めてだったので勝手がわからず、かなり単純なプログラミングになってしまいました。しかし、今回は繰り返しや回転センサなどつかえる道具がふえたので、それらをうまく使ってプログラミングを組むことができました。しかし、近道での判断では回転センサに頼りすぎて、たまにずれた位置で曲がってしまうことがあったので、そこでのプログラミングを強化したいと思いました。
今回のロボットの課題は、できるだけコンパクトにすると言うことだったので、センサー類をうまくドライブベースに納めるのに苦労しました。今回のプログラミングに関しては、使える技術も増えて、相方から色々とアドバイスをもらうことが出来たので、前回に比べてとてもすっきりとしたプログラムになりました。ただ、ロボットのスピードが遅く、二周するとだいぶ時間がかかってしまうので、もう少しスピードが上げられるとよかったと思います。
ご自由にお書きください