[[2018a/Member]]
目次
#contents
*課題3:空き缶運搬ロボット [#b3a97cf0]
空き缶を分別して所定の場所に運ぶ。
#ref(./ルート.png,50%,コース)
**フィールドの説明 [#ma202b54]
-フィールドは課題2で使用した紙を使用する。
-2種類の空き缶(Aタイプ,Bタイプ)をそれぞれ3個づつ用意し、円XにABA、円YにBABとなるように3段づつ積み上げる。
-空き缶には色をつけたり文字や記号を書いてもよい。あるいは周囲に紙を張ってもよい。&br;
#ref(./缶の移動1.png,60%,移動1)
缶の初期配置を横から見た図で簡略的に表してみた。缶の移動時に説明をしやすいようにA1、A2...と区別して表示してある。また、缶の色は実際に色を着けたわけでなく、わかりやすいようにするためである。
**ルール [#jb4d4a51]
-基本得点の計算方法&br;
運んだ空き缶の数×3点
空き缶を積み重ねて置くことができば場合、2段目の空き缶一つにつき2点加算、3段目の空き缶一つにつき3点加算する。&br;
円内からはみ出している場合、半分以下なら1点減点、半分以上なら2点減点。&br;
間違った円内に空き缶を置いた場合は、1個につき1点減点。&br;
間違った円内の2段目に空き缶を置いた場合は1個につき3点減点、その上にある空き缶は0点&br;
ルールについて詳しくは[[こちら>2018a/Mission3]]。
*機体の説明 [#k7ad3995]
これが機体の全体像です。アームのついてる方が前になります。&br;
#ref(./全体像.jpg,70%,全体像)
この機体は本体とアームの2つの部品に分けることができます。
それぞれに分けて説明していきます。&br;
&ref(./本体側.jpg,70%,本体);
&ref(./アーム.jpg,70%,アーム);
**本体部分の説明 [#l5b4a9e7]
以下の写真で示しているところにセンサーとモータが取り付けられています。&br;
&ref(./本体センサー類.png,50%,本体センサー類1);
&ref(./本体センサー類2.png,50%,本体センサー類2);
***車輪まわり [#yd04b7cf]
車輪は左右それぞれにモーターを取り付け二輪駆動にした。その片側にロータリーセンサーを取り付け直進距離や回転角度を正確に制御できるようにした。また、ロータリーセンサーを着けた側のモーターは抵抗が大きくなっており、直進ができなくなってしまった。だがセットパワーを調整することで直進をすることが可能になった。電池の出力でセットパワーの比が変化してしまうことが欠点である。&br;
ロータリーセンサーは以下のように取り付けておりモーターの回転と同じ回転数を認識するようになっている。
#ref(./ロータリーセンサー.png,40%,ロータリーセンサー)
***タッチセンサー [#z46d7cd1]
てこの原理を使って小さな衝撃で反応するようにした。また、缶を置く動作の邪魔にならないようにストッパーを取り付けた。
#ref(./タッチセンサー.png,55%,タッチセンサー)
***アームの上下機構 [#q5383f13]
ラックを使って上下動作を行った。上下の高さ制御は時間で行っているため電池の出力で変化してしまうことが欠点である。また、3段目の缶の高さまで上げるためにはモーターをある程度の高さに設置する必要があり、軽量のまま高さを稼ぐことが困難だった。&br;
&ref(./アーム上下機構.png,30%,アーム上下機構);&ref(./アーム上下機構2.png,40%,アーム上下機構2);
***光電センサー [#k8f04808]
左右方向の中心から離すことで線に対して垂直に停止できるようにした。
**アーム部分の説明 [#vb7e5cdd]
小さいタイヤを取り付けることで摩擦を増やし、缶が滑り落ちるのを防いだ。また、クラッチギア(白いギア)を使うことで回りすぎを防いでいる。このため缶をつかんでいる間中、モーターを回転させ続けられるため、よりしっかりとつかむことができる。始めは以下の写真のようにギアをかませていたが、下の図のように左右のアームの力が異なってしまいどちらかによってしまうという問題が発生した(図での青いギアがクラッチギア)。
#ref(./アームの歯車1.png,50%,アームの歯車1)
#ref(./アームの歯車3.png,35%,アームの歯車3)
解決するために下の写真のようにギアを組み替えることで解決した。
#ref(./アームの歯車2.png,35%,アームの歯車2)
**接続 [#o110e594]
アーム側にラックを取り付けた柱と距離をとって支柱を取り付けている。本体側でそれぞれを挟むように柱とタイヤを取り付けている。タイヤにしているのは軽量化とアームを好きな高さで停止しておけるようにするためである。ラック側の柱はタイヤでは支えていない。モーターと柱で挟んで固定している。支柱側は以下の図のように固定されている。
#ref(./接続1.png,35%,接続1)
*作戦 [#n39dde8a]
前日までは第一案で構想していたが、成功率が安定しないため当日は第二案で行った。&br;
以下はそれぞれの案について説明する。
**第一案 [#z99acf5f]
目標得点を16点(1段目×2本+2段目×2本)として以下の図のような配置でフィニッシュする作戦を立てた。
#ref(./缶の移動2.png,60%,移動2)
1番上の缶から分別を行い、最下段の缶はエリア外から出して減点されないようにしようと考えた。&br;
下の図と合わせて、機体の移動と缶の移動方法について詳しく説明する。
-機体はまずスタート地点Aから出発し、交差点Gへ移動する。
-地点Yの3段目にあるB1缶をつかみ、青の円の中に置く� �
-�◆銑い眛韻犬茲Δ帽圓な�別させる。
#ref(./機体と缶の移動経路.png,50%,経路1)
この方法で制御をしようと考えたが、ロータリーセンサーの精密さや、タッチセンサーの感度があまり良くなく、缶の認識と回転角度の制御が困難だったためこの作戦は断念した。
**第二案 [#g783430b]
目標点を6点(1段目×2)として以下の図のような配置でフィニッシュする作戦に変更した。機体については、ほとんど変更しなかった。
#ref(./缶の移動3.png,60%,移動3)
地点Yの上から2つの缶をそれぞれ分別を行い、それ以外の缶は円の中からはじき出すようにした。&br;
下の図と合わせて、機体と缶の移動について詳しく説明する。
-機体はまずスタート地点Aから出発し、交差点Gへ移動する。
-地点YのB1缶をつかみ、地点Xにある缶を機体ごと体当たりして枠外にはじき出したのち、つかんでいたB1缶を置く。��
-地点Yに戻りA2の缶をつかみ、その下にあるB3の缶を同じようにはじき出し、A2の缶を地点Y置く。��
#ref(./機体と缶の移動経路2.png,50%,経路2)
*プログラム [#xda09de5]
プログラムはメンバーのkan777君とDsuke君が作ってくれました。そのため内容については詳しくは説明できません。詳しい説明は彼らのページで見ることを薦めます([[kan777>2018a/Member/kan777/Mission3]],[[Dsuke>2018a/Member/Dsuke/Mission3]])。
Risの機体を2つ使い制御をしているのでそれぞれの分けて掲載します。&br;
**上の段のRis [#rd90f144]
接続されているコード&br;
入力側&br;
ータッチセンサー(3)&br;
出力側&br;
ーアームの上下モーター(C)&br;
ーアームの開閉モーター(A)&br;
&br;
//上段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 //缶に接近を検知するセンサのしきい値
task main(){
SetSensor(SENSOR_3,SENSOR_TOUCH);
SetSensorMode(SENSOR_3,SENSOR_MODE_RAW);
SetPower(OUT_A,7);
SetPower(OUT_C,7);
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); //少し下がらせる
//二段目Aの缶
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 [#he8b1f20]
接続されているコード&br;
入力側&br;
ー光電センサー1(1)&br;
ー光電センサー2(3)&br;
ーロータリーセンサー(2)&br;
出力側&br;
ー左タイヤのモーター(C)&br;
ー右タイヤのモーター(A)&br;
&br;
//90度のローテーションセンサの調整 缶をとってからの時間制御での後退の調整
//下段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;
task main(){//下のRIS用、移動と回転
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);
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);
//三段目Aの缶をCの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
//2段目Aの缶をAの1段目へ
TURNL
SendMessage(201); //アームを開けて2段目へ
until(101==Message()); //終わりを検知
TURNL
FCAN
until(102==Message()); //掴み終わったら
TURNL
SendMessage(202);
until(103==Message()); //
TURNR
BACK
BACK
SendMessage(203); //置かせる
}
*反省・感想 [#ld604967]
うまくいかないことが多く、前日からオールして制作をし、とてもつかれました。でも、ロボコンでは思い通りに動いてくれて、2位になることができて喜びと達成感を感じました。
今回、機体をメインで制作に関わりました。課題1,2に比べ素材が莫大に増え、様々な機構を構想して作ることがとても楽しかったです。また、プログラマーの要望に沿った機構を作れた時はやりがいを感じました。制作で1番大変だったところはアームの部分です。安定したアームの上げ下げ、コードが引っかからないような構造、缶が途中で落ちないようにする工夫など、最善を尽くした構造になっていると思います。
最後に、この4人のチームで取り組めて良かったと思っています。それぞれ違った強みがあり、それぞれがその能力を存分に発揮できたと感じてます。この課題を通して協力することの大切さを改めて感じました。
うまくいかないことが多く、前日からオールして制作をし、とてもつかれました。でも、ロボコンでは思い通りに動いてくれて、2位になることができて喜びと達成感を感じました。&br;
今回、機体をメインで制作に関わりました。課題1,2に比べ素材が莫大に増え、様々な機構を構想して作ることがとても楽しかったです。また、プログラマーの要望に沿った機構を作れた時はやりがいを感じました。制作で1番大変だったところはアームの部分です。安定したアームの上げ下げ、コードが引っかからないような構造、缶が途中で落ちないようにする工夫など、最善を尽くした構造になっていると思います。&br;
最後に、この4人のチームで取り組めて良かったと思っています。それぞれ違った強みがあり、それぞれがその能力を存分に発揮できたと感じてます。この課題を通して協力することの大切さを改めて感じました。