[[2018a/Member]]

#contents

*課題 [#qa5b444f]
**運搬ロボットの制作[#e9cf3a71]
空き缶をつかみ,所定の位置に移動させる.

**得点方法[#l850d578]
1.課題2で使用したものと同じコースを使用する.
#ref(./コース.png,70%,コース)
2.2種類の空き缶を用意し,上図のX,Yの位置に交互に重ねる.
#ref(./初期位置.png,70%,初期位置)
3.指定の位置に移動させ,円内に収める.
#ref(./移動後.png,70%,移動後)
4.運んだ空き缶の数×3点.空き缶を積み重ねて置くことができた場合、2段目の空き缶一つにつき2点加算、3段目の空き缶一つにつき3点加算する.
円内からはみ出している場合、半分以下なら1点減点、半分以上なら2点減点。
間違った円内に空き缶を置いた場合は、1個につき1点減点。
間違った円内の2段目に空き缶を置いた場合は1個につき3点減点、その上にある空き缶は0点となる.

2種類の空き缶は区別ができれば良い.また,そのために缶の周囲に紙を張ったり文字を書いたりしてもよい.

*製作したロボット [#t02581d5]
**全体像 [#m4d855c3]
#ref(./全体像3.png,70%,全体像)
この機体は以下の2つの部品(本体及びアーム)からできている.

**本体 [#g56d3e51]
&ref(./本体.png.jpg,70%,本体);
&ref(./差し込み部.png.jpg,70%,本体横);

&ref(./機体下部.png.jpg,70%,本体下部);
&ref(./回転センサー.png.jpg,70%,回転センサー);

&ref(./光センサー.png,70%,光センサー);

↑本体:小回りをしやすいよう2輪にした.左右に一つづつモーターをとりつけ,前後左右に動き,その場で旋回できるようにしている.また,バランスをとるために前後に支柱を取り付けている.旋回の中心付近にRIS本体を縦に取り付けることで,高さを稼ぎ,アームの上下運動の幅を増やしている.また,アーム上下用のモーターは重ねたRISの上部に取り付けるようにした.進行方向下部には,アームに干渉しないようにタッチセンサーが取り付けてある.そのほかに,車体下には光センサーを2つ,地面から1センチ程の位置に,回転センサーを左タイヤの軸の下部で接触するように取り付けている.

**アーム [#c89c52c7]
#ref(./アーム3.png,70%,アーム)
↑アーム:アームの上下にはラックを使用し,本体の上下用モーターと接続することで上下運動をする.ラックは右側の棒の後ろについている.また,つかむ動きをするためにモーターを1つ使用している.実際につかむ部分には,上図のようにタイヤを使用し,滑らないようにしている.開閉はモーター1つでおこなうため,ギアを使用している.片側に白いギアで直接動力を伝え,下側で普通のギアを使ってもう片方に動力を伝えた.白いギアは一定以上の力が加わると軸だけが回転するので,アームを締め続けてくれる.白いギアのみ,または白いギアと普通のギア1枚ずつで実行してみたが,その場合はアームが左右に揺れ続けてしまったためこの形になった.
**本体とアームの接続方法[#qe69361c]
&ref(./接続.png,70%,接続方法);
&ref(./接続上部.png,70%,接続方法);

上の図のようにアームを本体のスリットに滑り込ませるように接続する.接続した後の状態ではラックと上下用モーターがかみ合い,もう片方の棒はタイヤが支える(押し付ける).反対側の面は滑らかな面同士が接触している.また,本体側の接続部は左右にばらけないように固定がされている.

*得点のためのプロセス [#hb3bdd5a]
前日までは第一案,しかし実際には第二案で得点を目指した.
**第一案 [#y4819b09]
第一案では,交互に並べられた缶を一度中間地点にそれぞれの種類に分けて重ねて置き,その後それらを指定地点に運ぶということを目標にしていた.この際,三段目まで重ねて運ぶということが困難であったため,二段目まででこれを行った.この時,残ったひとつは重ねた缶を円内に入れる際に弾き飛ばすことにした.しかし,この精密操作の要となっていた回転センサーに毎回誤差が生じてしまっていたため,断念した.ちなみに,この案が完成していた場合の点数は16点であった.
**第二案 [#nb130581]
第二案では,Y地点の缶上二段をそれぞれ指定地点に入れる,というものだった.この時ほかの缶はすべて弾き飛ばしている.これはとにかく6点を取るための作戦であった.本番ではこの作戦で行い,6点を獲得することができた.

*プログラム [#d02dfa98]
私たちの班は,ハードウェア担当が私とhirotaka君で,ソフトウェア担当がkan777ku君とDsuke君というようにそれぞれの担当を決めていた.そのため,詳細は彼らのページへ.コード及び端子の関係上,RISは2台使用している.自分には解読が難しいので実際に使った第二案のプログラムのみ掲載しておく.
**上側のRIS [#q13e4c57]
上側のRISの端子には,3番端子にタッチセンサー,A端子に開閉用モーター,C端子に上下用モーターが接続されている.

***使用したマクロ [#t32ce4b9]
 //上段ris sendは100番代
 #define TOJIRU Wait(50);OnFwd(OUT_A);Wait(100);
 #define HIRAKU Wait(50);OnRev(OUT_A);Wait(30);Off(OUT_A);
 #define THR 1000		//缶に接近を検知するセンサのしきい値

***端子の入出力の定義 [#rdc6451b]
 SetSensor(SENSOR_1,SENSOR_LIGHT);
 SetSensor(SENSOR_2,SENSOR_ROTATION);
 SetSensor(SENSOR_3,SENSOR_LIGHT);
 SetSensorMode(SENSOR_1,SENSOR_MODE_RAW);
 SetSensorMode(SENSOR_3,SENSOR_MODE_RAW);
 SetPower(OUT_A,2);			//4か5
 SetPower(OUT_C,2);

***X,Yの中間地点までの移動 [#q207fb85]
*** 3段目の缶の操作[#q207fb85]
 ClearMessage();
 until(1==Message());  //移動開始
 OnFwd(OUT_AC);   //53センチ前進
 SendMessage(1);  //三段目Aの缶
 until(201==Message());	//移動終了を受信したらアームを開きアームを移動
 ageru(1);			//3段目の位置までアームを移動
 HIRAKU
 SendMessage(101);		//右に90度 前進させる
 until(THR>SENSOR_3);		//缶に接近したら
 SendMessage(100);		//缶に接近したメッセージ
 TOJIRU
 ageru(10);			//少し上げる
 SendMessage(102);		//少し下がって右に90
 until(202==Message());	//終了を受信 orosu
 orosu(1);
 SendMessage(103); 		//migi90
 until(203==Message());	//終了を受信 はなす
 HIRAKU
 SendMessage(104);		//少し下がらせる

***2段目の缶の操作 [#t131ffc9]
 until(201==Message());	//おいた後
 ageru(2);
 HIRAKU
 SendMessage(101);		//右に90度 前進させる
 until(THR>SENSOR_3);		//缶に接近したら
 SendMessage(100);		//缶に接近したメッセージ
 TOJIRU
 ageru(10);			//少し上げる
 SendMessage(102);		//少し下がって左に90度させる
 until(202==Message());
 orosu(2);			//2-1
 SendMessage(103);
 until(203==Message());
 HIRAKU
 }

***サブルーチン・あげる [#j99d81a2]
 void ageru(int a){
 OnFwd(OUT_C);
 switch (a){
 case 1:
 Wait(320);//1から3段目の時間		270-300の間 9.2Vで270は足りない
 break;
 case 2:
 Wait(130);//1から2へ			110-130  9.1Vで130が丁度いい
 break;
 case 10:
 Wait(55);//ちょっと上げる時間		30-50 9.1Vで30は足りない
 break;
 }
 Off(OUT_C);
 }

***サブルーチン・おろす [#c4518623]
 void orosu(int b){
 OnRev(OUT_C);
 switch (b){
 case 1:
 Wait(200);//3から1段目の時間		170➖200 9.1Vで170だと降り きらない
 break;
 case 2:
 Wait(80);
 break;
 case 3:
 Wait(60);//2から1.5へ			40➖55 9.1Vでは足りない
 break;
 case 20:
 Wait(20);//ちょっと下げる時間		20➖50 下がらなさすぎるよ りは多い方がいい
 break;
 }
 Off(OUT_C);
 Wait(100);
 }


**下側のRIS [#b2416641]
下側のRISの端子には1番及び3番端子に光センサー,2番端子に回転センサー,C端子に左タイヤ用モーター,A端子に右タイヤ用モーターが接続されている.

***使用したマクロ [#j8fa45a4]
//下段ris sendは200番代
 #define TURNL 
 Wait(80);OnFwd(OUT_C);OnRev(OUT_A);ClearSensor(SENSOR_2);until(SENSOR_2>=41);Off(OUT_AC);		//40で曲がり過ぎるときがある
 #define TURNR 
 Wait(80);OnFwd(OUT_A);OnRev(OUT_C);ClearSensor(SENSOR_2);until(SENSOR_2<=-41);Off(OUT_AC) ;
 #define FOR 
 Wait(80);OnFwd(OUT_AC);ClearSensor(SENSOR_2);until(SENSOR_2<=-23);Off(OUT_AC);	 //缶を置くときに少し前に進む
 #define BACK 
 Wait(80);OnRev(OUT_AC);ClearSensor(SENSOR_2);until(SENSOR_2>=23);Off(OUT_AC);	 //缶を置くときに少し前に進んだ分戻る
 #define FCAN 
 Wait(80);OnFwd(OUT_AC);ClearTimer(0);until(100==Message());Off(OUT_AC);time=Timer(0)*10; //接近の知らせを受けるまで前進 その時間をtime0に記録
 int S,time;

***端子の入出力の定義 [#i19214b8]
 SetSensor(SENSOR_1,SENSOR_LIGHT);
 SetSensor(SENSOR_2,SENSOR_ROTATION);
 SetSensor(SENSOR_3,SENSOR_LIGHT);
 SetSensorMode(SENSOR_1,SENSOR_MODE_RAW);
 SetSensorMode(SENSOR_3,SENSOR_MODE_RAW);
 SetPower(OUT_A,2);			//4か5
 SetPower(OUT_C,2);

***X,Yの中間地点までの移動 [#n28471be]
 ClearMessage();
 until(1==Message());	//移動開始	//53センチ前進
 OnFwd(OUT_AC);
 ClearSensor(SENSOR_2);
 until(SENSOR_2<=-165);
 Off(OUT_AC);
 TURNL//左に90度旋回  //真ん中まで前進
 TURNL//左に90度旋回	//真ん中まで前進
 OnFwd(OUT_AC);
 Wait(180);			//100から増やしていく
 until(SENSOR_1>777||SENSOR_3>777);
 Wait(10);
 Off(OUT_AC);  //移動終わり
 Off(OUT_AC);	//移動終わり
 PlaySound(SOUND_DOUBLE_BEEP);
 Wait(100);

***3段目の操作 [#z1bd61a3]
***上のRISに連動した移動1 [#p054ddec]
 SendMessage(201);		//メッセージを送りアームを開き3段目の位置まで移動させる
 until(101==Message());//左に90度 缶の直前まで前進
 until(101==Message());  //左に90度 缶の直前まで前進
 TURNL
 Wait(50);
 FCAN
 until(102==Message());
 OnRev(OUT_AC);
 Wait(time);
 Off(OUT_AC);
 TURNR
 SendMessage(202);
 until(103==Message());
 Wait(80);
 TURNR
 OnFwd(OUT_A);OnRev(OUT_C);ClearSensor(SENSOR_2);until(SENSOR_2<=-5);Off(OUT_AC);
 FOR
 SendMessage(203);		//はなす
 until(104==Message());	//おいたのを検知
 BACK

***2段目の操作 [#ge3b69b0]
***上のRISに連動した移動2 [#n611c5a5]
 TURNL
 SendMessage(201);		//アームを開けて2段目へ
 until(101==Message());	//終わりを検知
 TURNL
 FCAN
 until(102==Message());	//掴み終わったら
 TURNL
 SendMessage(202);
 until(103==Message());	//
 TURNR
 BACK
 BACK
 SendMessage(203);		//置かせる
 SendMessage(203);	//置かせる
 }

**下側のRIS [#b2416641]
下側のRISの端子には1番及び3番端子に光センサー,2番端子に回転センサー,C端子に左タイヤ用モーター,A端子に右タイヤ用モーターが接続されている.

***使用したマクロ [#j8fa45a4]
//下段ris sendは200番代
 #define TURNL 
 Wait(80);OnFwd(OUT_C);OnRev(OUT_A);ClearSensor(SENSOR_2);until(SENSOR_2>=41);Off(OUT_AC);		//40で曲がり過ぎるときがある
 #define TURNR 
 Wait(80);OnFwd(OUT_A);OnRev(OUT_C);ClearSensor(SENSOR_2);until(SENSOR_2<=-41);Off(OUT_AC) ;
 #define FOR 
 Wait(80);OnFwd(OUT_AC);ClearSensor(SENSOR_2);until(SENSOR_2<=-23);Off(OUT_AC);	 //缶を置くときに少し前に進む
 #define BACK 
 Wait(80);OnRev(OUT_AC);ClearSensor(SENSOR_2);until(SENSOR_2>=23);Off(OUT_AC);	 //缶を置くときに少し前に進んだ分戻る
 #define FCAN 
 Wait(80);OnFwd(OUT_AC);ClearTimer(0);until(100==Message());Off(OUT_AC);time=Timer(0)*10; //接近の知らせを受けるまで前進 その時間をtime0に記録
 int S,time;

*反省・感想 [#af4668bc]
本当は最初に考えていた第一案で競技に参加したかったのだが,回転センサーの誤差で断念することになったのは,調整に時間がかかっただけに残念で仕方なかった.機体のほうは担当であっただけに適宜改良をすることができてよかった.最終的には第二案で行うことになったが,しっかり6点を獲得できたので良かった.



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