2011a

メンバー

hiros

ソースコードの各行の頭にスペースくっつけるプログラム貼っておきます。誰か使いたい方添付ファイルからどうぞ。

:example
./wik < kadai3.rcx

まえだ

マシン

CIMG0110.JPG

工夫したところ

センサ

テニスボールにマシンが当たったとき、ボールが転がってしまい、センサが反応しにくかった。 なので、少しの力がかかっただけで反応するよう、てこの原理を使って敏感なセンサを実現した。

CIMG0108.JPG

拡大図。黄色の棒にものが当たったとき、テコの原理で黒の棒の先端にあるセンサが強く押される様になっている。これにより、ボールが転がる前に機体を止めることができるようになった。

CIMG0107.JPG

光センサ

明るさの最大値を求める際に余計な光が入ってこないようにカバーをつけた。 写真ではカバーの一部を外している。

CIMG0103.JPG

アームとその制御

ボールを投げる/ボールを運ぶという二つのタスクがあったので、どちらも実現できるようにこの形のアームにした。ボールを掴んだまま光が最大になる方向を探索した後、ボールを投げるときはボールを離してバックしつつくことで転がし、ボールを運ぶ時にはそのままつかんだ状態でひこずっていくことにした。光の最大値を探す際にボールを離してしまわないように両脇に黒の部品をつけたことでストッパーの役割を果たしてもらった。このアームは上下する必要があったので、モータをつけなければならなかったが、付ける場所を機体の後ろに付けることで前をすっきりさせ、いろいろな拡張を容易にした。

CIMG0109.JPG

機体の背面と機体の内部。単純な構造なので改造が簡単だった。

CIMG0106.JPG

プログラミング

hiros

目的:ボールを見つけて、そのあとそのボールを光の方へ一定距離まで運んでいく。

考え方: 真っすぐ進み、ボールが当たったら止まり、アームを下ろす。これでボールが取れるので、その状態で一周回り、その間に光の最大値を求め、変数に格納しておく。その後、もう一度回り、その値以上を取る位置で停止、光が一定以上強くなるまで直進する。これで光の方に進み、一定の距離で停止できる。

工夫: 機能をまとめたので急な機体の変化にも耐えられた。 main関数内がすっきりと見通せ、おかげでプログラミングにはそこまで時間を取られることがなかった。 最大値を求めるとき、最初は光の強さを、係数がマイナスの2次関数のようなイメージをもっていたので、光センサが返す数値が下がった瞬間にそれを最大値としていた。しかし、現実には様々な光があるため、正確に最大値の方向に進むのは難しく、結局時間がかかっても現在のもののように正確に判定できる方が良いと考えた。

#define WaySensor SENSOR_2
#define BottomSensor SENSOR_1
#define TouchSensor SENSOR_3
#define RIGHT OUT_A
#define LEFT OUT_C
#define HAND OUT_B

void turnRight(){
	OnFwd (LEFT);
	OnRev (RIGHT);
}

void turnLeft(){
	OnFwd (RIGHT);
	OnRev (LEFT);
}

void goStraight(){
	OnFwd (RIGHT+LEFT);
}

void go_back_and_continue(){
	Off(RIGHT+LEFT);
	Wait (100);
	OnRev(RIGHT);
	OnRev(LEFT);
	Wait (DIS);
	turnRight();
	Wait(60);
	Off(RIGHT+LEFT);
}

void take(){
	OnRev (HAND);
	Wait(300);
	Off (HAND);
}

void release(){
	OnFwd (HAND);
	Wait (400);
	Off (HAND);
}

task main (){
	SetSensor (BottomSensor, SENSOR_LIGHT);
	SetSensor (WaySensor, SENSOR_LIGHT);
	SetSensor (TouchSensor, SENSOR_TOUCH);
	
	while (1) {
		goStraight();
		if (TouchSensor){
			Off(RIGHT+LEFT);
			PlaySound(SOUND_CLICK);
			Wait (100);
			goStraight();
			Wait (10);
			Off(RIGHT+LEFT);
			take();
			PlaySound(SOUND_DOWN);
			int max = 0;
			// destination
			/* while (1){
				turnRight();
				if (WaySensor < max) break;
				max = WaySensor;
			}
			*/
                       /*
			ClearTimer(0);
			while (Timer(0) <= 60){
				turnRight();
				if (WaySensor > max){
					max = WaySensor;
				}
			}
			while (WaySensor <= max) turnLeft();
			*/
                       ClearTimer(0);      
                       while(FastTimer(0) < 172){
                               OnFwd(RIGHT);
                               OnRev(LEFT);
                               if(WaySensor > roll){
                                       roll = WaySensor;
                                       tmax = FastTimer(0);
                               }
                       }  	
			OnRev(RIGHT);
                       OnFwd(LEFT);
                       Wait(172 - tmax);
			Off (RIGHT+LEFT);
			Wait (100);
			goStraight();
			while (WaySensor < 75) Wait (1);
			Off (RIGHT+LEFT);
			release();
			// goback
			go_back_and_continue();
		}
	}
}

まえだ

#define BLACKLINE 40  //閾値を定義
#define go_left OnFwd(OUT_C);  //左に進む
#define go_right OnFwd(OUT_A);  //右に進む
#define turn_right OnFwd(OUT_A);OnRev(OUT_C);  //右に曲がる

sub ball_out()  //ボールを光のほうへ投げ出すプログラミング
{
 OnFwd(OUT_B); Wait(150); Off(OUT_B);  //ボールを離す
 OnRev(OUT_A+OUT_C); Wait(150); Off(OUT_A+OUT_C);  //後ろに下がる
 OnRev(OUT_B); Wait(150); Off(OUT_B);  //アームを下す
 OnFwd(OUT_A+OUT_C); Wait(150); Off(OUT_A+OUT_C);  //下がった分進む
 OnFwd(OUT_B); Wait(150); Off(OUT_B);  //アームを上げ、ボールを投げ出す
}

task main()
{
 SetSensor(SENSOR_1,SENSOR_LIGHT);
 SetSensor(SENSOR_2,SENSOR_LIGHT);
 SetSensor(SENSOR_3,SENSOR_TOUCH);

 while(true)
 {
  if(SENSOR_3==0)  //ボールを探して黒線上を進むプログラミング
  {
   if(SENSOR_1<BLACKLINE)
   {
    go_left
   }
   else
   {
    go_right
   }
  }
  else  //ボールを見つけた時のプログラミング
  {
   PlaySound(SOUND_UP);  //確認のために音を流す
   Off(OUT_A+OUT_C); Wait(100); //動作の安定のために一旦動きを止める
   OnRev(OUT_B); Wait(150); Off(OUT_B); //ボールを掴む

   int max=0;  //光の最大値を求めるプログラミング
   ClearTimer(0);
   while(FastTimer(0)<=60)
   {
    turn_right
    if(SENSOR_2>max)
    {
     max=SENSOR_2;
    }
   }
   while(SENSOR_2<=max)
   {
    turn_right
   }

   Off(OUT_A+OUT_C); Wait(100);  //動作の安定のために止める
   PlaySound(SOUND_UP);  //確認のための音声
   ball_out();  //上記で定義したボールを投げ出すプログラミング
   PlaySound(SOUND_UP);  //確認のための音声
  }
 }
}

感想と考察

hiros

今回は非常に大変だった。一人ひとりの予定の管理、把握の大切さや、責任というものがつきまとう、グループワークの難しさを実感した。

まえだ

今回は相方に任せっきりで申し訳なかった。課題はプログラミングはまだできたが、ロボットに相当時間をもっていかれ、辛かった。が、なんとか形にはできた。

コメント

コメントをお願いします。

  • 今日の授業中に借りたテニスボール、借りたままになってしまいました。本当にごめんなさい。どうしたらいいでしょうか? -- A8右? 2011-07-15 (金) 18:19:37
  • なぜか画像の倍率を変えると表示が不可能になるので見づらくなりました。 -- hiros? 2011-08-07 (日) 20:12:03
  • 画像倍率直しました -- まえだ? 2011-08-09 (火) 16:19:25

今日: 1

昨日: 0

全て: 925


添付ファイル: fileCIMG0109.JPG 193件 [詳細] fileCIMG0106.JPG 225件 [詳細] fileCIMG0103.JPG 211件 [詳細] fileCIMG0107.JPG 209件 [詳細] fileCIMG0108.JPG 205件 [詳細] fileCIMG0110.JPG 196件 [詳細] filewik 103件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-08-20 (土) 15:33:37 (2925d)