目次

メンバー

an

gomibakudan

nozomigo

gamigami

機構

本体の写真

コップを重ねる方の機体(本体)

機体の写真
・ギアを回してアームを閉じる
・コップを掴むとアーム部分が上がり,紙コップを持ち上げることができる

※この後にアームの改良を加えたので多少アームの形は変わる

アームの黒いパーツを上に付け、アーム部分のタイヤそれぞれを一つに減らした

ライントレースに使う光センサー

機体の写真
・両サイドに光センサーを付けることで二か所で判別できるようにする
・その後のかいりょうで光センサーを多少ずらして付け、判別の位置を揃えるようにした

紙コップの判別に使う光センサー

機体の写真
・アームを開いている時、紙コップを持ち上げた時、紙コップの近くに光センサーが行くようになるべく前に付けた
・アームが下りている時も光センサーが邪魔にならないように下側にセンサーを付けた

コップをずらす方の機体(サブ機)

全体図

機体の写真 機体の写真

・時間がなかったことと、複雑な動作が必要ないと思われたのでシンプルな機体になってしまった
・なるべく小さめのを作ろうと頑張った

アームの部分

機体の写真
・一回転しても紙コップがアームから出ないようにするため少し大きめのアームにした

課題

詳しくは2014a/Mission2をご覧ください

プログラムの内容

行動の図

本体の機体の動き

・赤の線の通りに動き、Aの位置の紙コップを掴む
・対応する紙コップに重ねる
・その後緑の動きを行う

緑の線での動きは掴んだ色次第で動作を変える

サブ機の動き

・青い線のように動き、紙コップを中央のラインに集める

青い点のところに紙コップ移動させる

プログラム

基本動作の定義付け

#define set_power_L        SetPower(OUT_A,1);SetPower(OUT_C,1);   //   速度を遅く設定する
#define THRESHOLD 45                         //   しきい値の設定
#define go_forward OnFwd(OUT_AC);                  //   前進
#define turn_right0 OnFwd(OUT_A);OnRev(OUT_C);                       //   右旋回
#define turn_right1 OnFwd(OUT_A);Off(OUT_C);                         //   右回転
#define turn_left1 Off(OUT_A);OnFwd(OUT_C);                          //   左回転
#define turn_left0 OnRev(OUT_A);OnFwd(OUT_C);                        //   左旋回
#define STEP 1                                                       //   動作を一回行う
#define U_turn    OnFwd(OUT_A);OnRev(OUT_C);Wait(180);Off(OUT_AC);   //   Uターンをする

コップを持ち上げるプログラムの定義付け

#define cup_up OnFwd(OUT_B);Wait(130);Off(OUT_B);                    //   コップを持ち上げる
#define cup_down OnRev(OUT_B);Wait(130);Off(OUT_B);                  //   コップを下す

変数

int number=0;                         //   グローバル変数。コップの色に応じて1〜3の値をとり、点Aからのパターン分岐を決める

サブルーチン

ライントレース

/*論理積を使ったライントレースのサブルーチン*/
sub line(){
	if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){
		go_forward;
		Wait(STEP);                                           //   センサーが2つともしきい値よりも大きい値をとった時、前進する
	}else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){
		turn_right1;
		Wait(STEP);                                           //   センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値をとった時、右回転をする
	}else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){
		turn_left1;
		Wait(STEP);                                           //   センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転をする
	}else{go_forward;
		Wait(STEP);                                           //   センサーの値が条件を満たさない時は前進
	}
}

紙コップを掴んだ後の動作

/*紙コップを掴んだ後に「点A」に辿り着いてから行う操作のサブルーチン*/
sub carry_cup(){
     if(number==1){
	while((SENSOR_2<47)&&(SENSOR_2>35)){
                  if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){
                    go_forward;
                    Wait(STEP);                                     //   センサーが2つともしきい値よりも大きい値をとった時、前進する
           }else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){
                    turn_right1;
                    Wait(STEP);                    //   センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値、右回転する
           }else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){
                    turn_left1;
                    Wait(STEP);                                     //   センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転する
           }else{
                    go_forward;
                    Wait(STEP);                                     //   センサーの値が条件を満たさない時は前進
           }
                  }
		go_forward;
		Wait(10);                                //   紙コップに完全に接触するまで前進
		Off(OUT_AC);
		cup_down;
		U_turn;
		while((SENSOR_2<47)&&(SENSOR_2>35)){                           //  紙コップBかCを認識するまで前進させる
			if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){
				go_forward;
				Wait(STEP);                                    //   センサーが2つともしきい値よりも大きい値をとった時、前進する
			}else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){
				turn_right1;
				Wait(STEP);                                    //   センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値をとった時、右回転をする
			}else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){
				turn_left1;
				Wait(STEP);                                    //   センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転する
			}else{
				go_forward;
				Wait(STEP);                                    //   センサーの値がそれ以外の時は前進
			}
		}
	}else if(number==2){
		while((SENSOR_1>THRESHOLD)||(SENSOR_3>THRESHOLD)){             //   交差点を認識するまで前進させる
			if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){
				go_forward;
				Wait(STEP);                                    //   センサーが2つともしきい値よりも大きい値をとった時、前進する
			}else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){ 
				turn_right1;
				Wait(STEP);                                    //   センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値をとった時、右回転をする
			}else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){
				turn_left1;
				Wait(STEP);                                    //   センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転する
			}else{
				go_forward;
				Wait(STEP);                                    //   センサーの値が条件を満たさない時は前進
			}
		}
		turn_right0;
		Wait(75);                                 //   コップ2の逆方向を向かせる
		go_forward;
		Wait(10);
		U_turn;                                   //   交差点でそのまま左折するとコップ2を押してしまう為
		while((SENSOR_2<47)&&(SENSOR_2>35)){      //   紙コップ2を認識するまで前進させる
			if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){
	                        go_forward;
				Wait(STEP);               //   センサーが2つともしきい値よりも大きい値をとった時、前進する
			}else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){
				turn_right1;
				Wait(STEP);               //   センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値をとった時、右回転をする
			}else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){
				turn_left1;
				Wait(STEP);               //   センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転する
			}else{
				go_forward;
				Wait(STEP);              //   センサーの値が条件を満たさない時は前進
			}
		}
		go_forward;
		Wait(20);              //   紙コップに完全に接触するまで前進
		Off(OUT_AC);
		cup_down;
		OnRev(OUT_AC);
		Wait(130);
		while((SENSOR_1>THRESHOLD)||(SENSOR_3>THRESHOLD)){           //  交差点を認識するまで前進させる
			if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){
				go_forward;
				Wait(STEP);           //   センサーが2つともしきい値よりも大きい値をとった時、前進する
			}else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){
				turn_right1;
				Wait(STEP);           //   センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値をとった時、右回転をする
			}else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){
				turn_left1;
				Wait(STEP);           //   センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転する
			}else{
				go_forward;
				Wait(STEP);                                  //   センサーの値が条件を満たさない時は前進
			}
		}
		turn_left0;
		Wait(75);                       //   軸にそって紙コップBかCに向かせる
		while((SENSOR_2>35)&&(SENSOR_2<47)){         //   紙コップを認識するまで
			if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){
				go_forward;
				Wait(STEP);           //   センサーが2つともしきい値よりも大きい値をとった時、前進する
			}else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){
				turn_right1;
				Wait(STEP);           //   センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値をとった時、右回転をする
			}else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){
				turn_left1;
				Wait(STEP);           //   センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転する
			}else{
				go_forward;
				Wait(STEP);           //   センサーの値が条件を満たさない時は前進
			}
		}
	}else{
		while((SENSOR_1>THRESHOLD)||(SENSOR_3)>THRESHOLD){    //   交差点を認識するまで前進させる
			if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){
				go_forward;
				Wait(STEP);           //   センサーが2つともしきい値よりも大きい値をとった時、前進する
			}else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){
				turn_right1;
				Wait(STEP);           //   センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値をとった時、右回転をする
			}else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){
				turn_left1;
				Wait(STEP);           //   センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転する
			}else{
				go_forward;
				Wait(STEP);           //   センサーの値が条件を満たさない時は前進
			}
		}
		go_forward;
		Wait(10);
		while((SENSOR_1>THRESHOLD)||(SENSOR_3)>THRESHOLD){     //   交差点を認識するまで前進させる
			go_forward;
		}
		turn_right0;
		Wait(75);
		while((SENSOR_2>35)&&(SENSOR_2<47)){     //   紙コップを認識するまで
			go_forward;
		}
		go_forward;
		Wait(25);
		Off(OUT_AC);
		cup_down;
		OnRev(OUT_AC);
		Wait(110);
		while((SENSOR_1>THRESHOLD)||(SENSOR_3)>THRESHOLD){       //   交差点を認識するまで前進させる
			OnRev(OUT_AC);
			}
		turn_right0;
		Wait(75);
		}
		while((SENSOR_2<47)&&(SENSOR_2>35)){                  //   紙コップを認識するまで
			if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){
				go_forward;
				Wait(STEP);               //   センサーが2つともしきい値よりも大きい値をとった時、前進する
			}else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){
				turn_right1;
				Wait(STEP);                //   センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値をとった時、右回転をする
			}else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){
				turn_left1;
				Wait(STEP);                //   センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転する
			}else{
				go_forward;
				Wait(STEP);                //   センサーの値が条件を満たさない時は前進
		}
	}
}
		

開始直後の紙コップAを掴み振り向くまでの動き

void start_dash(){
	go_forward;
	Wait(120);            //   スタート地点から出る為の動き
	while((SENSOR_1>THRESHOLD)||(SENSOR_3)>THRESHOLD){
		go_forward;          //   交差点を認識するまで前進
	}
	turn_right0;
	Wait(75);
	while((SENSOR_2<47)&&(SENSOR_2>35)){          //   紙コップを認識するまで
		if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){
			go_forward;
			Wait(STEP);                   //   センサーが2つともしきい値よりも大きい値をとった時、前進する
		}else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){
			turn_right1;
			Wait(STEP);                   //   センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値をとった時、右回転をする
		}else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){
			turn_left1;
			Wait(STEP);                   //   センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転する
		}else{
			go_forward;
			Wait(STEP);                   //   センサーの値が条件を満たさない時は前進
		}
	}
	go_forward;
	Wait(100);              //   コップに接触するまで
	Off(OUT_AC);
	if(SENSOR_2>47){
		number=1;
	}else if((SENSOR_2<47)&&(SENSOR_2>37)){
		number=2;
	}else{
		number=3;
	}                       //     紙コップの色を感知したセンサーの値に応じてnumberに値を入れる
	cup_up;
	U_turn;
}

全体としてのプログラム

task main(){
	SetSensor(SENSOR_1,SENSOR_LIGHT);
	SetSensor(SENSOR_2,SENSOR_LIGHT);
	SetSensor(SENSOR_3,SENSOR_LIGHT);
	set_power_L;
	int cross=0;      //   交差点通過回数のカウンタ
	start_dash();     //   コップAを掴む
	carry_cup();
	go_forward;
	Wait(50);         //   コップBに接触するまで
	Off(OUT_AC);
	if(SENSOR_2>47){
		number=1;
	}else if((SENSOR_2>35)&&(SENSOR_2<47)){
		number=2;
	}else{
		number=3;
	}                 //   センサーの値に応じてnumberに値を入れる
	cup_up;
	U_turn;
	ClearTimer(0);    //   タイマー設置
	while(Timer(0)<40){
		if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){
			go_forward;
			Wait(STEP);            //   センサーが2つともしきい値よりも大きい値をとった時、前進する
		}else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){
			turn_right1;
			Wait(STEP);            //   センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値をとった時、右回転をする
		}else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){
			turn_left1;
			Wait(STEP);            //   センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転する
		}else{
			go_forward;
			Wait(STEP);            //   センサーの値が条件を満たさない時は前進
		}
	}
	carry_cup();
	go_forward;
	Wait(50);   //   コップCに接触するまで
	Off(OUT_AC);
	if(SENSOR_2>47){
		number=1;
	}else if((SENSOR_2>35)&&(SENSOR_2<47)){
		number=2;
	}else{
		number=3;
	}           //   センサーの値に応じてnumberに値を入れる
	cup_up;
	U_turn;
	ClearTimer(0);
	while(Timer(0)<20){
		if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){
			go_forward;
			Wait(STEP);            //   センサーが2つともしきい値よりも大きい値をとった時、前進する
		}else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){
			turn_right1;
			Wait(STEP);            //   センサー1がしきい値よりも大きい値、センサー3がしきい値よりも小さい値をとった時、右回転をする
		}else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){
			turn_left1;
			Wait(STEP);            //   センサー1がしきい値よりも小さい値、センサー3がしきい値よりも大きい値をとった時、左回転する
		}else{
			go_forward;
			Wait(STEP);            //   センサーの値が条件を満たさない時は前進
		}
	}
	carry_cup();
	Off(OUT_AC);
}

サブ機のプログラム

         task main()
                    {
                      OnFwd(OUT_AC);
                      Wait(540);
                      OnFwd(OUT_C); OnRev(OUT_A); Wait(100);  //   左旋回
                      OnFwd(OUT_AC);
                      Wait(150);                              //   紙コップをライン上に置く
                      OnRev(OUT_AC);
                      Wait(100);                              //   回転した時にアームが紙コップに当たらないようにするためバックする
                      OnFwd(OUT_C); OnRev(OUT_A); Wait(160);  //   左旋回
                      OnFwd(OUT_AC);
                      Wait(155);
                      OnFwd(OUT_A); OnRev(OUT_C); Wait(150);  //   右旋回
                      OnFwd(OUT_AC);
                      Wait(350);
                      OnFwd(OUT_A); OnRev(OUT_C); Wait(270);  //   紙コップを持ちながら一回転
                      OnFwd(OUT_AC);                          //   紙コップをライン上に置く
                      Wait(90);
                      OnRev(OUT_AC);
                      Wait(100);
                      Off(OUT_AC);                            //   もう一つの機体の邪魔にならないようにラインから離れる
                     }

反省・感想

・今回はプログラムを仲間に任せてしまったため、その負担を大きくしてしまった
・機構の完成までに時間をかけすぎてしまい、プログラムにかける時間が少なくなってしまった
・サブ機に付けた回転センサーが意味のないものになってしまい、調整が手さぐりになってしまった
・サブ機の調整がすべて位置で調整しなければならないプログラムにしてしまったため動きが安定しなかった

今回の失敗は実際に試してみるということがなかなかできなかったことで、もっと機構を早めに作ってプログラムにかける時間を増やすべきだった。機構も大事であるがプログラムを入れて実際に動かしてみないとどのような誤作動があるかわからないので実際に動かすことの大切さがわかった。

今回はプログラム関わることが少なかったのでどのようなプログラムなのかわからないまま機構を作っていたため、どのように作ればいいか迷ってしまった。また、授業最終日にサブ機のファームが飛んでしまい、かなりあせってしまった。


添付ファイル: filesub3.jpg 255件 [詳細] filesub2.jpg 290件 [詳細] filesub1.jpg 241件 [詳細] filemain3.jpg 274件 [詳細] filemain2.jpg 245件 [詳細] filemain1.jpg 275件 [詳細] fileplan.png 261件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-08-11 (月) 21:52:46