目次
#contents

*課題 [#t9d706e9]
1.スタート地点から出発し、黒い線にそって動く。~
2.一つ目の十字の交差点と二つめの十字の交差点の間に置かれたピンポン玉をつかむ。~
3.さらに黒線に沿って動いてゴール地点を目指す。~
4.ゴールに向けてピンポン玉をシュートする。~
*ロボット本体 [#hdd958bd]
&ref(robo-01.jpg);
&ref(robo-02.jpg);
&ref(robo-03.jpg);~
ロボットとの前にタイヤをつけ、ピンポン玉を飛ばせるようにした
ロボットの前にタイヤをつけ、ピンポン玉を飛ばせるようにした

*プログラム [#g5e0b9ce]
 #define HIPOWER 4
 #define LOWPOWER 2
 #define set_power_H SetPower(OUT_AC,HIPOWER);
 #define set_power_L SetPower(OUT_AC,LOWPOWER);
 #define GF set_power_H; OnFwd(OUT_AC);
 #define TL1 set_power_L;\
 OnFwd(OUT_C); OnRev(OUT_A);
 #define TL0 set_power_L;\
 OnFwd(OUT_C); Off(OUT_A);
 #define TR0 set_power_L;\
 OnFwd(OUT_A); Off(OUT_C);
 #define TR1 set_power_L;\
 OnFwd(OUT_A); OnRev(OUT_C);
 #define CR set_power_H; OnFwd(OUT_AC);Wait(20); 
#define HIPOWER 4
#define LOWPOWER 2
#define set_power_H SetPower(OUT_AC,HIPOWER);
#define set_power_L SetPower(OUT_AC,LOWPOWER);
#define GF set_power_H; OnFwd(OUT_AC);
#define TL1 set_power_L;\
  OnFwd(OUT_C); OnRev(OUT_A);
#define TL0 set_power_L;\
  OnFwd(OUT_C); Off(OUT_A);
#define TR0 set_power_L;\
  OnFwd(OUT_A); Off(OUT_C);
#define TR1 set_power_L;\
  OnFwd(OUT_A); OnRev(OUT_C);
#define CR set_power_H; OnFwd(OUT_AC);Wait(20); 

 task main()
 {
 SetSensor(SENSOR_2,SENSOR_LIGHT);
 int nl=0; //nlは黒線の上を通った回数
 int x=0; //xは交差点を判断し、渡った回数
task main()
{
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  int x=0;  //xは連続した黒の回数
  int y=0; //yは交差点を渡った回数及び、無視した回数
  GF;
  Wait(100);
  ClearTimer(0);
  

 OnFwd(OUT_B);


 while (true) {
 
 while ((nl < 3)||(FastTimer(0)<300)||(FastTimer(1)<700)){ //最初のカーブ、2回の公差点の後のカーブは無視する~
 if (SENSOR_2 < 43) {
 TL1;
 x++;
 } else if (SENSOR_2 < 46) {
 TL0;
 x=0;
 } else if (SENSOR_2 < 49) {
 GF;
 x=0;
 } else if (SENSOR_2 < 53) {
 TR0;
 x=0;
 } else {
 TR1;
 x=0;
 }
 

 while (nl < 5){
   if (SENSOR_2 < 37) {
     TL1;
      nl++;
   } else if (SENSOR_2 < 39) {
     TL0;   
 nl=0;
   } else if (SENSOR_2 < 45) {
     GF;   
 nl=0;
   } else if (SENSOR_2 < 47) {
     TR0;  
   } else {
     TR1; 
 nl=0;
   }

   Wait(1);
 Wait(1);
 }
   while(x < 4){
   TR1; Wait(35);
   CR;
   x++;
 if (SENSOR_2 < 43){
  nl=0;
 } else {
 OnRev(OUT_AC);
 

 TR1; Wait(35);CR;
 y++;//交差点を渡った回数をカウント
 x=0;
 
 while (y==2){
 ClearTimer(1);//二回交差点を渡った後、タイマーを起動して7秒間判断を無視
 y++;
 }

 while (y==4){
 OnFwd(OUT_C);
 OnRev(OUT_A);
 Wait(30);
   TL1;
 Wait(42); 
 OnFwd(OUT_AC);
 until(SENSOR_2 < 42);
 y++;
 } //3番目の交差点は「工夫した点」にあるような現象が起きてしまうのでy=4(差し掛かった段階)で急旋回する。

 nl=0;
 }

 while (y==6){
 Off(OUT_AC);
 OnRev(OUT_B);
 OnRev(OUT_B); //ここで動きを止め、前方のタイヤ(ピンポン玉が収まっている)を逆回転させることでシュートする
 }
 }
 }

*工夫した点 [#d789f40b]
ヘアピンカーブや直角を交差点と勘違いしないよう、タイマーを使ってある点から数秒間判断を無視するようにした。
三番目の交差点が難関で、円状のカーブを曲がるときに若干通り過ぎてしまいセンサーが線上に来てしまう。そのために方向が変わってしまい紙から出るようにして渡ってしまう。
それを避けるために、その交差点に差し掛かった段階で急旋回して方向を調整するようにした。
*反省・感想 [#e850dbf7]
プログラムは難しかったが、完成してみたら簡素なものとなった。
今回はコースが完全にわかっているため秒数を測って動きを調節できたが、
そうでない場合大変だなと思った


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