2009a課題2 黒い線に沿って動くロボット

目次

メンバー紹介

  • まさと:主にホームページの作成担当
  • Y.Y:主にロボットの製作担当

課題内容

1.紙パックを迂回する、あるいは紙パックをもとの位置に戻したのちコースに戻って進む

2.紙パックを次の交差点まで運んで行き、その交差点に紙パックを残してさらに黒い線に沿って進む

*ただしどちらの場合においても速さと正確さを追求し、コースを3周したら自動的に止まらなければならない

コースの紹介

ロボが反応しやすいよう交差点を直交させ、できるだけシンプルなコースに。

そのため直線を多用したコースになっている。

090703_1558~01.jpg

ロボットの紹介

最終的なロボの全体像。少し大きくなり過ぎてしまった感は否めない。

そのため曲がる際に設置した紙パックを動かしてしまうこともしばしば。

090703_1620~01.jpg

初めはタイヤ4つでいこうと思っていたが、もう少しスムーズに曲がれるようにこのような形にした。

ただ、少し強度が弱かったので途中はずれてしまうこともあった。

090703_1620~02.jpg

最初は光センサーの反応が悪く、コースに沿って進むことができなかった。光センサーを紙面にできるだけ近づけることで解消された。

コース通りに進んでくれたときは少し感動した。

090703_1621~01.jpg

紙パックに対する反応の精度を上げるためにこのような形になった。以前はタッチセンサーが反応せずに、そのまま運んでいってしまっていた。

090703_1621~02.jpg

 

プログラムの紹介

まさとのプログラム

#define front(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);  //前進の定義
#define back(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);  //後退の定義 
#define turn_left OnFwd(OUT_C);OnRev(OUT_A);Wait(time);Off(OUT_A+OUT_C);  //左折の定義
#define turn_right OnFwd(OUT_A);OnRev(OUT_C);Wait(time);Off(OUT_A+OUT_C);  //右折の定義
task main ()
{
          SetSensor(SENSOR_1, SENSOR_LIGHT); 
          SetSensor(SENSOR_2, SENSOR_TOUCH);
          SetSensor(SENSOR_3, SENSOR_LIGHT);
          int n; //交差点を通った回数
          n=0; 

         
          
          while(n<12) 
{          
          if ((SENSOR_1>light)&&(SENSOR_3>light)) //左右両方が白の場合
{          
            OnFwd(OUT_A+OUT_C); //前進
}
          if ((SENSOR_1> light)&&(SENSOR_3<light)) //左が白、右が黒の場 合          
{
            OnFwd(OUT_A);
            OnRev(OUT_C); //右折  
}
          if ((SENSOR_1< light)&&(SENSOR_3>light)) //左が黒、右が白の場合                     
{ 
            OnFwd(OUT_C);
            OnRev(OUT_A); //左折
}
          if (SENSOR_2==1)  //タッチセンサーが作動する場合
{
   		front(50);            //0,5秒前進
		turn_left(90);             //左に180度旋回
		back(50);            //0,5秒後退し、牛乳パックを置く
		turn_left(90);             //左に180度旋回
}
}
        if((SENSOR_1<light)&&(SENSOR_3<light)) //左右両方黒の場合
{
          Off(OUT_A+OUT_C); //停止
          Wait(200); 
          OnFwd(OUT_A+OUT_C); //前進
          Wait(50);
          n=n+1; //関数nに+1する 
}                  
        
        
        Off(OUT_A+OUT_C); //停止
       
} 
}

Y.Yのプログラム (紙パック回避)

#define time 65
#define light 50 
#define front(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);  //前進の定義
#define back(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);  //後退の定義 
#define turn_left OnFwd(OUT_C);OnRev(OUT_A);Wait(time);Off(OUT_A+OUT_C);  //左折の定義
#define turn_right OnFwd(OUT_A);OnRev(OUT_C);Wait(time);Off(OUT_A+OUT_C);  //右折の定義





sub avoid() //紙パックを避ける
{
           back(50); //後退
           turn_right; //右折
           front(150); //前進
           turn_left; //左折
           front(250); //前進
           turn_left; //左折
           front(150); //前進
           turn_right; //右折
           
          
}
          

task main ()
{
           SetSensor(SENSOR_1, SENSOR_LIGHT); 
           SetSensor(SENSOR_2, SENSOR_TOUCH);
           SetSensor(SENSOR_3, SENSOR_LIGHT);
           int n; //交差点を通った回数をカウントする
           n=0; 
 
          
           
           while(n<12) 
{          
           if ((SENSOR_1>light)&&(SENSOR_3>light)) //左右両方が白の場合
{          
             OnFwd(OUT_A+OUT_C); //前進
}
           if ((SENSOR_1> light)&&(SENSOR_3<light)) //左が白、右が黒の場合          
{
             OnFwd(OUT_A);
             OnRev(OUT_C); //右折  
}
           if ((SENSOR_1< light)&&(SENSOR_3>light)) //左が黒、右が白の場合                     
{
             OnFwd(OUT_C);
             OnRev(OUT_A); //左折
}
           if (SENSOR_2==1)  //タッチセンサーが作動する場合
{
             avoid(); //紙パック回避
}
         if((SENSOR_1<light)&&(SENSOR_3<light)) //左右両方黒の場合
{
           Off(OUT_A+OUT_C); //停止
           Wait(200); 
           OnFwd(OUT_A+OUT_C); //前進
           Wait(50);
           n=n+1; //関数nに+1する 
}                  
         
         
         Off(OUT_A+OUT_C); //停止
        
}
}


感想

Mas:プログラミングにおいてもロボ作りにおいても、Y.Y氏に迷惑をかけっぱなしだった。ごめんなさい。

Y.Y:

今回も前回と同じでロボの制作に手間取ってしまい、なかなかプログラムが出来なかった。

4輪を3輪に変えたとき以前よりも遥かによく曲がるようになってびっくりした。

紙パックを避けるプログラムはあまり思い通りにいかないので大変だった。

コメント

コメントをお願いします

  • ぜひインデント(ifの階層などごとに入れる字下げ)を入れてください。どこからどこまでがどのifの中身なのかわかりやすくなります。シンプルでわかりやすいプログラムですが、nが何をカウントしているかなどもぜひ説明してください。 -- こさか? 2009-07-10 (金) 12:24:32
  • インデントで格段に見やすくなりました。nの説明もOKです(交差点4回で1周なんですよね?)。 -- こさか? 2009-07-17 (金) 04:05:24
  • はい、交差点4回で1周です。 -- Y.Y? 2009-07-17 (金) 16:37:13
  • シンプルでわかりやすくまとめられています。今のままで十分ですが、欲を言えば淡白すぎるかもしれません。内容はごちゃごちゃしてない方がいいのですが、説明は詳しい方がいいです。図や動画を使って、各部分がロボットのどのような動きと対応しているか、フローチャートなどを用いて全体の動きをわかりやすくするなどです -- FI? 2009-07-26 (日) 07:46:19


添付ファイル: file090703_1558~01.jpg 236件 [詳細] file090703_1620~01.jpg 244件 [詳細] file090703_1620~02.jpg 250件 [詳細] file090703_1621~01.jpg 256件 [詳細] file090703_1621~02.jpg 249件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-07-27 (月) 03:41:43