2011a

目次

課題内容

ランタンに向かってテニスボールを転がす(または運ぶ)ロボットの作成

1転がす(ライントレース)
2最短距離で運ぶ(自由走行)
ロボットを作成せよ。ただし、1の場合はテニスボールの置いてある場所から直接転がし、 2の場合はその場所から最短距離で運ぶこと。ボールを探す際にはラインに沿っても沿わなくてもよい。

メンバー

  • 中島
  • すがはら

今回のロボット

タッチセンサー

touch_sennsor2.JPG

アーム

 
  • モーターの回転でアームにつながる軸が回転することでアームが上下し、ボールをつかませた。
     
    arm.JPG
     
  • 左右の歯車の数を変えることで左右のアームにそれぞれ異なる回転をさせ、両方のアームが上下同じ向きに動くようにした。
     
    gia_zoom1.jpg
     
  • 上から見た歯車部分
     
    gia_highview.JPG
     

全体図

 
  • タッチセンサー→アーム、歯車部分→ランタンを探す光センサーと重ね、取り付けた。
     バランスをとるため黄色の本体はやや後ろにした。
     
    robotto.JPG
     
  • ↓ライントレースのセンサーが前に付かなかったため後ろにつけた。
     
    rign_sennsor.JPG
     

走行するコース

  • 課題2で使ったコースを今回も使用した。ライントレースは左回りで行い、ランタンはロータリーの中に置いた。
     
    cose.JPG
     

プログラム

すがはらのやつ

今回の課題のライントレースはセンサー1個で行うため、ライン上の時はライン外の白の部分を探させ、ラインから外れたらラインを探させた。そのためマシンはジグザグに進んでライントレースするようになった。

#define THRETHOLD 40	                         //ライントレースの閾値 40
#define SPIN 500	                         //一回転する時間

task main()
{
       repeat(3){                              //3回繰り返す
	SetSensor(SENSOR_1,SENSOR_TOUCH);	//センサー1をタッチセンサーに
	SetSensor(SENSOR_2,SENSOR_LIGHT);	//センサー2を光センサーに(ランタンを探す)
	SetSensor(SENSOR_3,SENSOR_LIGHT);	//センサー3を光センサーに(ライントレース)
	int l_max=0;		               //l_maxを定義(初期値0)
	int t_max=0;		               //t_maxを定義(初期値0)


	while(true){
	start follow_line;		      //follow_lineのタスク(ライントレース)を開始
	until (SENSOR_1==1);	             //ボールがセンサーに当たったら
	stop follow_line;		     //follow_lineのタスクを一旦停止

	OnFwd(OUT_B);		            //アームを閉じてボールを固定
	Wait(10);

	ClearTimer(0);
  	 while(FastTimer(0)<=SPIN)
	 {
	   OnFwd(OUT_A);
	   OnRev(OUT_C);		   //回転開始
	 if(SENSOR_2>l_max)		   //ランタンの位置(光の最大値)を探す
	  {l_max=SENSOR_2;		   //最大値をl_maxと定義
	   t_max=FastTimer(0);}	           //ランタンを見つけた時間(FastTimer(0)<=SPINの経過時間)をt_maxと定義
	 }

	    OnFwd(OUT_C);
 	    OnRev(OUT_A);
	    Wait(SPIN-t_max);	           //ランタンの向きへ方向転換
	    Off(OUT_A+OUT_C);	
	    Wait(50);
	    OnRev(OUT_B);
	    Wait(20);		           //アームを開き、ボールを蹴り出す準備
	    Off(OUT_B);
	    Wait(50);
	    OnFwd(OUT_A+OUT_C);
	    Wait(50);		           //キック!!
	    Off(OUT_A+OUT_C);
	    OnRev(OUT_A+OUT_C);
	    Wait(50);		           //元の位置に戻る
	    OnFwd(OUT_A);
	    OnRev(OUT_C);
	    Wait(SPIN-t_max);	           //元の向きに戻る
      }				        //while文の先頭に戻って再びライントレースを開始
      }                                     //repeat範囲
           Off(OUT_A+OUT_C);               //三回繰り返したら終了
}
task follow_line()			   //follow_lineのタスク(ライントレース)
{
	 while(true){
	  if(SENSOR_3<THRETHOLD)          //センサーがライン上(黒)のとき	
        {OnFwd(OUT_A); Off(OUT_C);}	  //右に曲がる
	  if(SENSOR_3>THRETHOLD)	  //センサーがライン外(白)のとき
        {OnFwd(OUT_C); Off(OUT_A);}	  //左に曲がる
	  
	 }
}

中島のやつ

#define arm_down OnFwd(OUT_B);Wait(20);Off(OUT_B);     //アームを下ろす
#define arm_up OnRev(OUT_B);Wait(25);Off(OUT_B);      //アームを上げる
#define go_straight(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);  //直進
#define turn_right OnFwd(OUT_A);OnRev(OUT_C);Wait(110);Off(OUT_A+OUT_C); //右曲り
#define turn_left OnFwd(OUT_C);OnRev(OUT_A);Wait(110);Off(OUT_A+OUT_C);  //左曲がり


task main()

{
 SetSensor(SENSOR_1,SENSOR_TOUCH);    //センサー1はタッチセンサー
 SetSensor(SENSOR_2,SENSOR_LIGHT);    //センサー2はタッチセンサー
 SetSensor(SENSOR_3,SENSOR_LIGHT);    //センサー3はタッチセンサー
 int l_max=0;                         //光の最大値を記憶させる変数を定義
 int t_max=0;                         //ランタンを認識した時間を定義


 repeat(4)                           //4回繰り返す
 {
  start ziguzagu;          //ジグザグにすすむ
  until(SENSOR_1 == 1);    //タッチセンサーが押されるまで実行する
  stop ziguzagu;           //進むのをやめる
  start carry_boll;        //ランタンを探し、ボールを運び、最初にもどる
  until(SENSOR_2 < 40);    //光センサーが認識するまで実行
  stop carry_boll;         //運ぶのをやめる
 }
}
 task ziguzagu()           //ジグザグにすすむプログラム
 {
 while(true)
  {
  go_straight(350);
  turn_right;
  go_straight(80);
  turn_right;
  go_straight(350);
  turn_left;
  go_straight(80);
  turn_left;;
  }
 }
 task carry_boll()        //ボールを運ぶプログラム
 {
 int l_max=0;            //光の最大値を記憶させる変数を定義
 int t_max=0;            //ランタンを認識した時間を定義
 
 arm_down;
   
 ClearTimer(0);                       //タイマー0をリセット
 while(FastTimer(0)<=450)             //4.5秒間繰り返し
 {
 OnFwd(OUT_A); 
 OnRev(OUT_C);
 if(SENSOR_2>l_max)                   //センサー2が最大値を感知したとき

  l_max=SENSOR_2;                     //l_maxを最大値とする
  t_max=FastTimer(0);                 //t_maxを記憶     
 }
  OnFwd(OUT_C);
  OnRev(OUT_A);
  Wait(450-t_max);          //t_maxの時間回転
 } 
  OnFwd(OUT_A+OUT_C);
  until(SENSOR_3 < 40);
  arm_up;
  OnRev(OUT_A+OUT_C);
  until(SENSOR_3 < 40);
  OnFwd(OUT_A);
  OnRev(OUT_C);
  Wait(450-t_max);
  }

反省・感想

  • アームの動かし方、取り付けにとても苦労した。横に開閉するアームを取り付けたかったが、うまく取りつかなく断念してしまった。
  • ランタンを探すセンサーの周りを囲ったりして精度を上げる工夫ができず、うまくランタンを探してくれなかった。でも部屋を暗くしたときはほぼ成功したのでよかったと思う。
  • ロボットはいろいろ苦労したが、アーム部分など工夫したいいものが作れたと思う。
  • 複数のタスクを使ってプログラムしたが、途中でフォロータスクを止めたりできて便利だった。またメインタスクもすっきりして見やすい気がしたので、ロボコンでも使っていきたい。

コメント

  • 細かなところですが、すがはらさんのプログラムで、SetSensor文はrepeatの外のほうがよいですね。 -- 松本 2011-07-29 (金) 15:31:28


添付ファイル: filecose.JPG 167件 [詳細] filearm.JPG 249件 [詳細] filegia_zoom1.jpg 182件 [詳細] filegia_highview.JPG 244件 [詳細] filerign_sennsor.JPG 258件 [詳細] filerobotto.JPG 243件 [詳細] filetouch_sennsor2.JPG 221件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-07-29 (金) 15:31:28