#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);}
目次
#contents

*課題 [#h911b358]

紙コップ収集分別ロボット

2台のロボットで紙コップを収集し、同じ番号の書かれている紙コップに重ねる

ロボコンのフィールド平面図

&ref(2014a/Member/kanzaki/Mission2/2014a-mission2.png,100%);


フィールドの説明

フィールドは課題1で使用した紙を2枚つなぎ合わせる (詳細な図面は課題1を参照のこと)。

図の右半分の黄色い地点には、その数字と同じ数字が書いてある紙コップが置かれている。 また左半分のA,B,Cの地点にも1から3までの数字が書かれている紙コップが置かれているが、 どのコップをどの地点に置くかは直前にサイコロを振って決める。

ルール 

基本ルール

&#9702;競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。

&#9702;図の右上のスタートエリアからスタートする(課題1と同じ)。

接地している部分がスタートエリア内に入って入ればよい。

&#9702;図の左半分にある紙コップを集めて、それぞれ右半分にある同じ番号の紙コップに重ねる。

&#9702;右半分の紙コップは10cm内の移動は認める

&#9702;開始の合図から5秒以内にスタートボタンを押す作業を完了すること。

&#9702;競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。

&#9702;途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。 :基本得点の計算方法

&#9702;同じ番号の紙コップに重ねることができれば、1組で10点

&#9702;番号が1違いの紙コップに重ねれば、1組で2点

&#9702;番号が2違いの紙コップに重ねれば、1組で0点

&#9702;最終的な紙コップの位置が10cm以上動いた場合は、その1組の点数を半分にする

*メンバー [#vf0c265c]

岩佐暁史(kanzaki) 秋山和哉(ayusaka) 藤岡芳弥(fuji)

*ロボット紹介 [#y8e62de9]
**ロボット全体像 [#tab8761a]


&ref(2014a/Member/kanzaki/Mission2/1.jpg,100%);

他のグループのロボットと比べてでかくなりすぎた。

**センサー [#va75bf7d]

&ref(2014a/Member/kanzaki/Mission2/2.jpg,100%);

正面を向いている青いブロックが紙コップを識別するためのセンサー


&ref(2014a/Member/kanzaki/Mission2/3.jpg,100%);

下を向いている青いブロックがライントレースをするためのセンサー

**紙コップのつかみ方 [#r6fc00e9]

&ref(2014a/Member/kanzaki/Mission2/4.jpg,100%);

前方についているこの部品が上下して

&ref(2014a/Member/kanzaki/Mission2/5.jpg,300%);

このようにコップをつかむ。





**紙コップのはずし方 [#r6fc00e9]

&ref(2014a/Member/kanzaki/Mission2/6.jpg,100%);

この部品を上に上げていくと赤い突起がついた所に紙コップがあたりコップが落ちる。








*プログラム [#p64a1e5d]

 #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);
  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) {
    if (SENSOR_2 < 37) {          //濃い黒を感知したら
      turn_left1;
       nl++;
    } else if (SENSOR_2 < 41) {
    } else if (SENSOR_2 < 41) {    //薄い黒を感知したら
      turn_left0;   
 nl=0;
    } else if (SENSOR_2 < 45) {
    } else if (SENSOR_2 < 45) {  //灰色を感知したら
      go_forward;   
 nl=0;
    } else if (SENSOR_2 < 50) {
    } else if (SENSOR_2 < 50) {  //薄い白を感知したら
      turn_right0;  
    } else {
    } 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の地点へ行く予定でした。


**もう一つのプログラム [#o4d3eaca]
 #define SIGNALON 13

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

紙コップをつかむプログラムです。

*失敗点 [#waef1d67]
&ref(2014a/Member/kanzaki/Mission2/4.jpg,100%);

前方が重すぎて傾いてしまった。そのせいで紙コップをつかむ制度が落ちた。


タイヤとタイヤとの間の距離をあけなかったことで不安定になった。

*工夫点 [#bf2f18f7]
&ref(2014a/Member/kanzaki/Mission2/8.jpg,100%);

このパーツを前方につけることにより紙コップが来る位置が固定でき、紙コップをつかむためのプログラムの微調整が必要なくなった。

*感想 [#weaea348]
今回は特に大変だった。ロボットが完成したと思いプログラムを作って走らせてみるとロボットに色々な欠点が見つかったりしてかなり時間がかかった。プログラムが最後までに完成しなかったのが残念だった。初めにロボットとプログラムに使う時間は同じにしろと言われていたがロボットのほうばかりに時間を使ってしまった。大変だったが考えているときはなかなか楽しかった。ロボットはなかなか思い通りに動かないなと実感した。


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