2018a/Member

課題

運搬ロボットの制作

空き缶をつかみ,所定の位置に移動させる.

得点方法

1.課題2で使用したものと同じコースを使用する.

コース

2.2種類の空き缶を用意し,上図のX,Yの位置に交互に重ねる.

初期位置

3.指定の位置に移動させ,円内に収める.

移動後

4.運んだ空き缶の数×3点.空き缶を積み重ねて置くことができた場合、2段目の空き缶一つにつき2点加算、3段目の空き缶一つにつき3点加算する. 円内からはみ出している場合、半分以下なら1点減点、半分以上なら2点減点。 間違った円内に空き缶を置いた場合は、1個につき1点減点。 間違った円内の2段目に空き缶を置いた場合は1個につき3点減点、その上にある空き缶は0点となる.

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

製作したロボット

全体像

全体像

この機体は以下の2つの部品(本体及びアーム)からできている.

本体

本体 本体横

本体下部 回転センサー

光センサー

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

アーム

アーム

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

本体とアームの接続方法

接続方法 接続方法

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

得点のためのプロセス

前日までは第一案,しかし実際には第二案で得点を目指した.

第一案

第一案では,交互に並べられた缶を一度中間地点にそれぞれの種類に分けて重ねて置き,その後それらを指定地点に運ぶということを目標にしていた.この際,三段目まで重ねて運ぶということが困難であったため,二段目まででこれを行った.この時,残ったひとつは重ねた缶を円内に入れる際に弾き飛ばすことにした.しかし,この精密操作の要となっていた回転センサーに毎回誤差が生じてしまっていたため,断念した.ちなみに,この案が完成していた場合の点数は16点であった.

第二案

第二案では,Y地点の缶上二段をそれぞれ指定地点に入れる,というものだった.この時ほかの缶はすべて弾き飛ばしている.これはとにかく6点を取るための作戦であった.本番ではこの作戦で行い,6点を獲得することができた.

プログラム

私たちの班は,ハードウェア担当が私とhirotaka君で,ソフトウェア担当がkan777ku君とDsuke君というようにそれぞれの担当を決めていた.そのため,詳細は彼らのページへ.コード及び端子の関係上,RISは2台使用している.自分には解読が難しいので実際に使った第二案のプログラムのみ掲載しておく.

上側のRIS

上側のRISの端子には,3番端子にタッチセンサー,A端子に開閉用モーター,C端子に上下用モーターが接続されている.

使用したマクロ

//上段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		//缶に接近を検知するセンサのしきい値

端子の入出力の定義

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);

3段目の缶の操作

ClearMessage();
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段目の缶の操作

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
}

サブルーチン・あげる

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);
}

サブルーチン・おろす

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

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

使用したマクロ

#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;

端子の入出力の定義

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の中間地点までの移動

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

上のRISに連動した移動1

SendMessage(201);		//メッセージを送りアームを開き3段目の位置まで移動させる
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

上のRISに連動した移動2

TURNL
SendMessage(201);		//アームを開けて2段目へ
until(101==Message());	//終わりを検知
TURNL
FCAN
until(102==Message());	//掴み終わったら
TURNL
SendMessage(202);
until(103==Message());	//
TURNR
BACK
BACK
SendMessage(203);	//置かせる
}

反省・感想

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


添付ファイル: file接続上部.png 25件 [詳細] file光センサー.png 28件 [詳細] file接続.png 21件 [詳細] file機体下部.png.jpg 26件 [詳細] file回転センサー.png.jpg 30件 [詳細] file差し込み部.png.jpg 30件 [詳細] fileアーム上下モーター.png.jpg 13件 [詳細] file本体.png.jpg 32件 [詳細] fileアーム3.png 34件 [詳細] file全体像3.png 27件 [詳細] file移動後.png 28件 [詳細] file初期位置.png 26件 [詳細] fileコース.png 25件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-08-13 (月) 17:43:35 (375d)