目次 
#contents

*課題 [#y8345716]
○2台のロボットで紙コップを収集し、同じ番号の書かれている紙コップに重ねる~
○ルール~
◦競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。~
◦図の右上のスタートエリアからスタートする(課題1と同じ)。接地している部分がスタートエリア内に入って入ればよい。~
◦図の左半分にある紙コップを集めて、それぞれ右半分にある同じ番号の紙コップに重ねる。~
◦右半分の紙コップは10cm内の移動は認める~
◦開始の合図から5秒以内にスタートボタンを押す作業を完了すること。~
◦競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。~
◦途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。 :基本得点の計算方法~
◦同じ番号の紙コップに重ねることができれば、1組で10点~
◦番号が1違いの紙コップに重ねれば、1組で2点~
◦番号が2違いの紙コップに重ねれば、1組で0点~
◦最終的な紙コップの位置が10cm以上動いた場合は、その1組の点数を半分にする~

*メンバー [#a7bd6338]
秋山和哉(ayusaka)~
岩佐暁史(kanzaki)~
藤岡芳弥(fuji)~


*ロボット [#v57f11ea]
全体像~
&ref(image-01.jpg);~
センサー部分。ライントレース用、コップの判断用と写真の様に2つつけた~
&ref(image-02.jpg);~
コップを掴む機構。これに押しはめて持ち上げる。上についている突起に押し当ててはずす。~
&ref(image-03.jpg);~
掴む部分を上下させる機構。ギザギザの部分を歯車で駆け上がる。~
&ref(image-04.jpg);~
補助部分。前方につけてコップの位置を調整する~
&ref(image-05.jpg);~
コップを掴んだ様子~
&ref(image-06.jpg);~

*プログラム [#a9b65eea]

#define HIPOWER 1   //直線用のパワー
#define LOWPOWER 3    //カーブ用のパワー
#define set_power_H SetPower(OUT_AC,HIPOWER);
#define set_power_L SetPower(OUT_AC,LOWPOWER);
#define go_forward set_power_H; OnFwd(OUT_AC); //直進
#define turn_left1 set_power_L;\
 OnFwd(OUT_C); OnRev(OUT_A);           //左旋回
#define turn_left0 set_power_L;\  
 OnFwd(OUT_C); Off(OUT_A);      //左折
#define turn_right0 set_power_L;\
 OnFwd(OUT_A); Off(OUT_C);   //右旋回
#define turn_right1 set_power_L;\
 OnFwd(OUT_A); OnRev(OUT_C);  //右折
#define SIGNALON 13 
#define cross set_power_H; OnFwd(OUT_AC);Wait(20); //交差点を渡る
#define c1 if (SENSOR_3 < 37) {Off(OUT_AC); SendMessage(SIGNALON);Wait(80);} //黒い紙コップを見つけたらメッセージを送る。

task main() {
 SetSensor(SENSOR_2,SENSOR_LIGHT); //光センサーセット
 SetSensor(SENSOR_3,SENSOR_LIGHT); 
 
 int nl=0;
 int cc=0;
 go_forward;
 Wait(460);
 turn_left1;
 Wait(140);
 go_forward;
 Wait(280);
 

ここまでのプログラムで図のA地点まで来ます。ここA地点にある紙コップをとりあえずAとBの間にある交差点まで押していきます。
  
 ClearTimer(0);
 while (true) {
 
 while ((nl < 5) ||(FastTimer(0)<500)){
   if (SENSOR_2 < 37) {          //濃い黒を感知したら
     turn_left1;
      nl++;
   } else if (SENSOR_2 < 41) {    //薄い黒を感知したら
     turn_left0;   
nl=0;
   } else if (SENSOR_2 < 45) {  //灰色を感知したら
     go_forward;   
nl=0;
   } else if (SENSOR_2 < 50) {  //薄い白を感知したら
     turn_right0;  
   } else {                    //濃い白を感知したら
      turn_right1; 
nl=0;
   }
     
   Wait(1);
 }

上記のプログラムがライントレースです。 光センサーにより明るさを測って、明度の値により左右に曲がらせてライン上を進みます。  交差点は左旋回の回数を計ることで判別します。左旋回の回数はnlというカウンターで 計ります。上記の動作は一回あたり1/100秒間行われます。つまり連続で左旋回が行われて nlが加算されていった場合、nlが5になるのにかかる時間は0.5秒として考えることができます。 右旋回が0.5秒以上行われない限りは通常であると判断しライントレースを続けます。
 
 turn_right1; Wait(35);
 cross;
 cc++;
 if (cc == 1) {
 go_forward;
 Wait(50);
 c1;
 OnRev(OUT_AC);
 Wait(150);
 turn_left1;
 Wait(40);
 go_forward;
 Wait(280);
 c1;
 OnRev(OUT_AC);
 Wait(500);
 turn_left1;
 Wait(100);
 go_forward;
 Wait(200);
 c1;
 OnRev(OUT_AC);
 Wait(100);

交差点を通った後A地点にあった紙コップの色を判断して次にB地点に向かい紙コップの色を判断し最後にC地点の紙コップに向かい紙コップの色を判断します。その中から黒色だったものをつかみます。
 turn_left1;
 Wait(330);
 go_forward;
 Wait(1000);

C地点から1地点まで紙コップを運びます
 

} } }

未完成ですがここまでしかできませんでした。予定ではこのまま左のフィールドに戻り灰色の紙コップをつかんで2の地点へ行き、また戻って白の紙コップをつかみ3の地点へ行く予定でした。


コップを掴むプログラム †
#define SIGNALON 13
task main ()

{
 ClearMessage(); 
 while (true) {
   until (Message() == SIGNALON);
   OnFwd(OUT_AC);
 Wait(30);
 OnRev(OUT_AC);
 Wait(30);

Off(OUT_AC); } }


*工夫した点 [#jac4db70]
*反省・感想 [#h2ec0a25]



トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS