[[2016a/Member]]

*目次 [#i0d6b39b]
#contents

*はじめに [#xf9492f0]
今回の課題はかなり試行錯誤したため使わなくなった機体システム、プログラムが多く存在する&br;
それらも紹介しなければ、せっかく作ったのにかわいそうなので別ページにてそれらを紹介する。&br;

&size(30){[[過去の産物:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2Frin331%2FMission3%2Fold_idea]]};
*課題と自分チームの考え [#ae5afe92]
今回の課題3は模擬的なロボコンということで2つのマイコンを用いての課題だったが、
自分たちのチームは
&color(red){1つのロボットのみ};
でほぼ全体の処理を行う。&br;
%%のこりの1つは音楽でも流せればよかったなぁ。%%

今回このような形になった理由には2つ理由が存在する。&br;
1つ目 センサーが1つに集結させることができ、より正確な動作ができる&br;
2つ目 3つのモータで処理全体がカバーできた&br;
これらの理由から一体型でなくても処理できると判断したため、重さを考慮して1台のみで行うこととした。


*機体の説明 [#b380836f]
説明が細分化するため分けて記述する。
**全体像 [#t48321e5]
全体像としてこんな感じになっている。
先ほど書いたがマイコンは1つだ。&br;
&ref(./機体01.jpg,45%,機体画像 全体);


**パーツ [#kff1a7ff]
パーツとしては&br;
・車体&br;
・紙コップ処理部分&br;
・マイコン &br;
&ref(./機体02.jpg,45%,機体画像 パーツ);&br;
の3つとなる。

**タイヤ [#y3831b02]


タイヤの幅はライントレースをするため、できる限り狭くなっている。&br;
また、前回先生にアドバイスをもらった通りタイヤは薄いものを使用した。&br;
&ref(./機体03.jpg,45%,機体画像 タイヤ);



**センサ [#rbf386e7]
センサに関しては&br;
1.光センサ     (ラントレース)&br;
2.光センサ     (紙コップがあるのかの判定)&br;
3.タッチセンサ (上下にどこまで上がっているのかの判別)&br;
の3つを使用している。&br;
画像はよいモノがなかったのでなし。


1は前回の課題のため省き、3は後述する。
2は書いてある通り紙コップが手前にあるかを判定しているが最初に自分の考えで紙コップを黒くして
判別しようとした。だが実際は白で判別したほうがよくこれはミスといえる。&br;
%%コップは買いなおした。(140円)%%

**上下の動作と掴む動作を1つのモータで行うシステム [#b7a97bc6]
今回の機体の一番大変だった部分である。&br;
なお正直自分のみで説明が十分できる自信がないと思うので制作者のURLを載せておく。&br;
製作者:「[[RaikouRK:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2FRaikouRK%2FMission3]]」


*プログラムの仕組みについて [#c50d9608]
今回のプログラムは過去最大のためもちろん分けて話す。&br;
また今回はプログラムをパーツ化し、分担し作ろうということでメンバーで分担して作った。&br;
そのためそのプログラムはだれが作ったのかも記述する。
**レース用プログラム  [#md0edf53]
製作者:「[[RaikouRK:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2FRaikouRK%2FMission3]]」
彼には悪いが省略 読みたきゃ過去の自分のを見てほしい。

** 上下に動かすプログラム[#wfd9c2e8]
製作者:「自分」
 sub up()
 //上に上げる動作
 { 
 	while(SENSOR_2==0)
 		OnFwd(OUT_B);
 	Off(OUT_B);
 }
 
 sub down()
 //下に下げる動作
 {
     while(SENSOR_2==0) 
 	    OnRev(OUT_B);
 	Off(OUT_B);
 }

センサー2にはタッチセンサが入っている。&br;
down()にFwdが書いてあって動かなかったときは申し訳なかった。&br;


**180度回転するプログラム [#x12ea7d4]
製作者:「[[Yamada:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2FYamada%2FMission3]]」

 sub TURN_180()
 //180ど回転
 {
 	OnFwd(OUT_AC);
 	Wait(70);
 	Off(OUT_AC);
 	
 	OnRev(OUT_A);
 	Wait(125);
 	while(SENSOR_1>40)
 	{
 		OnFwd(OUT_C);
 		OnRev(OUT_A);
 	}
 	Off(OUT_AC);
 }

説明として180度回転と書いているが実際にしていることは少し違う。&br;
まず3行で後ろに後退する。&br;
その後Aのモータのみ一定時間動かし回転し、その後センサが一定になるまでもう一度回転を行う。&br;
一見して簡単なプログラムだがこのプログラムの凝っている点は&br;
一回目と二回目で回転の半径が違うという点だ!&br;
これによって大きな回転でだいたいの位置を決め、&br;
小さな回転で正確な位置を決めるということを可能にしている。

*プログラムの全体 [#wf4f2eaf]
#define Middle 45

task main() {

	setting();
	STARTING_OPERATION();
	repeat(2)
	{
		TRACE();
		zensin();
	}
	//交差点からDへ向かう
	TRACE();	
	OnRev(OUT_C);
	Wait(25);
	TRACE();
	//誤差修正
	OnRev(OUT_A);
	Wait(95);
	Off(OUT_AC);
	//dに到着
	OnFwd(OUT_B);//コップつかむ
	Wait(250);
	start keep;
	/*
	TURN_180();//180°回転
	
      TRACE();
	zensin();
	TRACE();
	OnRev(OUT_A);
	Wait(80);
	Off(OUT_AC);
	stop keep;
      down();
	OnFwd(OUT_B);
	Wait(250);
	start keep;
	*/
	OnFwd(OUT_A);//Qの方向を向く
	OnRev(OUT_C);
	Wait(200);
	Off(OUT_AC);
	
	OnRev(OUT_AC);//進む
	Wait(100);
	Off(OUT_AC);
	
	//センサー使って進む
	while(SENSOR_1 > Middle-4)
	  OnRev(OUT_AC);
	stop keep;
	//放す
	Off(OUT_AC);
	down();
}

sub setting() {

	//初期設定(パワー、センサー)	
	SetSensor(SENSOR_1,SENSOR_LIGHT);			
	SetSensor(SENSOR_2,SENSOR_TOUCH);//モータB止める用
	SetSensor(SENSOR_3,SENSOR_LIGHT);	
	SetPower(OUT_AC,4);//タイヤ
	SetPower(OUT_B,7);//上下、開き
}

sub zensin() {

      OnRev(OUT_A);
      Wait(106);
      Off(OUT_A);
}

sub copjugde() {

   while(SENSOR_3 < 46)
	OnRev(OUT_AC);
	Off(OUT_AC);
	Wait(100);
/*

	OnFwd(OUT_AC);
	Wait(5);
	Off(OUT_AC);
/ †
}

task keep() {

	while(1)
       {
		OnRev(OUT_B);
		Wait(1);
		OnFwd(OUT_B);
		Wait(1);
	}
}

sub TRACE() {

	ClearTimer(0);
	while(FastTimer(0)<=42){
		if(SENSOR_1>Middle+4)//白 左旋回
		{
			OnFwd(OUT_C);
			OnRev(OUT_A);
			ClearTimer(0);
		}
		else if(SENSOR_1>Middle+2)//やや白 左折
		{
			Off(OUT_C);
			OnRev(OUT_A);
			ClearTimer(0);
		}
		else if(SENSOR_1>Middle)//直進
		{
			OnRev(OUT_AC);
			ClearTimer(0);
		}
		else if(SENSOR_1>Middle-2)//やや黒 右折
		{
			Off(OUT_A);
			OnRev(OUT_C);
		}
		else //黒 右旋回
		{
			OnFwd(OUT_A);
			OnRev(OUT_C);
		}	
	}
	Off(OUT_AC);
	PlaySound(SOUND_FAST_UP);//トレース終了、交差点認識
}

sub down() {

	OnRev(OUT_B);
      Wait(200);
}

sub STARTING_OPERATION() {

	while(SENSOR_1<Middle)
	{
		OnRev(OUT_AC);
	}
	while(SENSOR_1>Middle)
	{
		OnRev(OUT_AC);
	}
	OnRev(OUT_AC);
	Wait(50);
	Off(OUT_C);
	OnRev(OUT_A);
	Wait(40);
	while(SENSOR_1<Middle)
	{
		OnRev(OUT_AC);
	}
	Off(OUT_AC);
}

sub TURN_180() {

	OnFwd(OUT_AC);
	Wait(80);
	Off(OUT_AC);
	
	OnRev(OUT_A);
	Wait(130);
	while(SENSOR_1>40)
	{
		OnFwd(OUT_C);
		OnRev(OUT_A);
	}
	Off(OUT_AC);
}

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