*課題3 R5,R6の制作したロボット [#t0792ca3] #contents **1、ロボット本体 [#s0ce3f4a] ***ロボットの概要 [#n4ab1650] &ref(2017b/Member/smith/Mission3/kadai3-8.jpg,30%,ロボット本体); &ref(2017b/Member/smith/Mission3/kadai3-3.jpg,30%,アームが紙コップをつかんだ状態); &ref(2017b/Member/smith/Mission3/kadai3-1.jpg,30%,ロボット裏側 摩擦軽減のため、前部に相当する図上部に黒い半球状の部品が使われている); ・今回作成したロボットは、モータ2つを左右につけて各モータに1つずつ動作させるためのタイヤを取り付けたものである。(上図左) ・課題である紙コップをつかむために、本体の前にクワガタのようなアームをつけこの課題に対応した。(上図中央) ・これらのタイヤはどちらも後輪に対応しているため、本体前部の摩擦軽減のために、黒い半球状の部品を取り付けた。(上図右) ・このロボットのモータAには左タイヤを、モータBにはアームを、モータCには右タイヤを、センサ1には回転角を計るセンサを、センサ2には黒く塗られている紙コップを見つける光センサをそれぞれ対応させている。 ***ルート考案 [#e7b9a8ce] &ref(2017b/Member/smith/Mission3/2017b-mission3.jpg,80%,考えたルート); ・この班では、もともと2つある本体を分担させて、Aから出発するロボットは左上と中央上の紙コップをを、Dから出発するロボットは中央下の紙コップを回収する予定だった。しかし、アーム部分の作成に時間がかかり2台分作成する余裕がない、部品が足りないなど様々な理由でこの計画を断念した。今回本体を1台しか使ってないのもこの理由からである。 ・これにより、1台のみで課題を取り組まなければならなくなり、ある程度の妥協が必要になった。まず、上図のように中央下の紙コップを諦め、また、左上の紙コップも中のピンポン玉のみ得点の入る位置に置くようにした。その結果今回考えたルートはこのようになった。 1、Aから交差点Bあたりまで進んだ後、2回回転角・光センサ両方を使った紙コップの検知をして左上の紙コップ手前まで進む。 2、紙コップをつかんだ後、Xの方向を向き、そのまま前進。 3、中のピンポン玉を出した後、このマップの範囲外の本体の邪魔にならない場所でつかんでいる紙コップを排除。 4、排除後、中央上の紙コップの方向を向き、そのまま前進。ある程度進んだら2回ほど紙コップを検知し、軌道を補正。 5、中央上の紙コップをつかんだらXの方向を向き、そのまま前進。 6、ピンポン玉をX内に出した後つかんでいる紙コップをYに運んで置く。 ***紙コップを挟んで所定の位置で中にあるピンポン玉を出す機構 [#pb04c90d] &ref(2017b/Member/smith/Mission3/kadai3-5.jpg,30%,本体のアーム部分); &ref(2017b/Member/smith/Mission3/kadai3-6.jpg,30%,上部); &ref(2017b/Member/smith/Mission3/kadai3-10.jpg,30%,裏側); &ref(2017b/Member/smith/Mission3/kadai3-9.jpg,30%,アームの先); ・このアームの部分は今回一番苦戦した機構である。モータBが動くとクワガタ状のアームがつかむようになっていて、完全につかみきると上図一番左に見えている軸に取り付けられているギアが軸ごと回転し、アーム部分が上昇するようになっている。また、つかんだときに紙コップが滑り落ちないように上図一番右のように滑り止め用の小さなタイヤを取り付けた。これらが紙コップをつかむとき次のような動作になる。 &ref(2017b/Member/smith/Mission3/kadai3-12.jpg,30%,つかむ前); &ref(2017b/Member/smith/Mission3/kadai3-14.jpg,30%,つかんだ直後); &ref(2017b/Member/smith/Mission3/kadai3-13.jpg,30%,つかみきってアームが上昇する); ・これを作るのに結構な時間がかかり、また、この部分が簡単に取れやすかったので上図中央左のように補強することや使うギアが多かったことから部品が不足し、2台作成して分担することを諦めた。それぐらいこの機構を作るのが大変だった。 ***紙コップの大まかな位置を特定する機構 [#d2f6f722] &ref(2017b/Member/smith/Mission3/kadai3-7.jpg,30%,回転角を計るセンサ); &ref(2017b/Member/smith/Mission3/kadai3-4.jpg,30%,紙コップを検知する光センサ); &ref(2017b/Member/smith/Mission3/kadai3-11.jpg,30%,光センサを近くから見た図); ・本体をより精密に紙コップの近くまで移動させるために回転角を計るセンサと光センサを使い、紙コップを検知する機構を作った。紙コップの少し手前で本体を少し旋回させ、その範囲内で光センサが最も低いとき(紙コップが黒く塗られているため)の回転角を記録させて、検知後にその数値をもとにその方向に向く動作をする。 ・回転角を計るセンサは、上図右のように右側のタイヤのギアにかませるように配置した。こうすることで簡単に測定することができた。 ・光センサは、黒い半球状の摩擦軽減用の部品を取り付けた場所の少し上に配置した。もともと本体前部は、アームの機構が大半を占めていて、アームの動作の邪魔にならないかつ光センサが誤作動しない位置に取り付けるのが大変だった。 **2、プログラム [#j397a269] ***基礎部分 [#qe275de4] #define cup_getup OnFwd(OUT_B);Wait(15);Off(OUT_B);//紙コップをつかむ #define cup_putdown OnRev(OUT_B);Wait(30);Off(OUT_B);//紙コップをはなす #define turn_right(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_AC);//右旋回 #define turn_left(s) OnFwd(OUT_C);OnRev(OUT_A);Wait(s);Off(OUT_AC);//左旋回 ・このロボットの基礎となるプログラムである。モータBが前回転でつかみ、後回転ではなす動作をするようになっている。 ***紙コップを検知するサブルーチン [#p59fc8a7] sub search_cup() { SetSensor(SENSOR_1,SENSOR_ROTATION); SetSensor(SENSOR_2,SENSOR_LIGHT); int sun_MAX = 100;//明るさの値であり、のちに値を下げるものなので最初は少し高めに設定している int sensor_MAX = 0;//回転の値であり、のちに上がっていくものなので最初は0としてある ClearSensor(SENSOR_1); while(SENSOR_1 < 4)//回転センサーが4となるまで繰り返し { SetPower(OUT_AC,2); OnFwd(OUT_A); OnRev(OUT_C); if(SENSOR_2 < sun_MAX)//もし明るさがそれまでに記録した値より低くなった時以下のことをする { sun_MAX = SENSOR_2;//最低の明るさを更新 sensor_MAX = SENSOR_1;//最低の明るさを記録した時の回転センサーの値を更新 } } Off(OUT_AC); Wait(100); SetPower(OUT_AC,2); OnRev(OUT_A); OnFwd(OUT_C); until(SENSOR_1 < sensor_MAX);//先ほど最低の明るさを記録したところまで待つ Off(OUT_AC); Wait(100); OnFwd(OUT_AC);//紙コップがある方向に近づく Wait(40); Off(OUT_AC); } ・本体の説明で記した通り紙コップを検知するためのサブルーチンである。自身は今回プログラムを担当していないので詳しくはよくわからないが、まず記録する明るさの値を100とし、そこから光センサの値が低い場合、その場合の光センサと回転角の値をきろくして、検知の動作後に記録された回転角をもとにその方向をむいて紙コップに近づくようになっている。 ***タスクメイン [#tdfc5132] task main() { //手順1はじめ OnFwd(OUT_AC);//A地点から1つ目の紙コップ付近まで近づく Wait(140); Off(OUT_AC); int A; for (A=1; A<=2; A++)//以下のことを2回繰り返し { SetPower(OUT_AC,2); OnFwd(OUT_C);//紙コップを見つけるために一時的に左旋回 OnRev(OUT_A); Wait(20); Off(OUT_AC); Wait(100); search_cup();//紙コップを見つけて紙コップに近づく Wait(100); } //手順1おわり cup_getup;//手順2はじめ 紙コップをつかむ turn_right(185);//紙コップをつかんだ地点で右旋回し、X地点の方向を向く Wait(100); OnFwd(OUT_AC);//X地点に近づく Wait(50); Off(OUT_AC); //手順2おわり OnFwd(OUT_B);//手順3はじめ 紙コップを持ち上げる OnRev(OUT_AC);//紙コップを持ち上げながら下がり、紙コップからピンポン玉を出す Wait(100); Off(OUT_ABC); Wait(100); turn_left(150);//持っている紙コップを移動の邪魔にならない位置におくため左旋回 Wait(100); cup_putdown;//手順3おわり 紙コップをはなす turn_right(155);//手順4はじめ 2つ目の紙コップの方向を向くために右旋回 OnFwd(OUT_AC);//紙コップに近づく Wait(140); Off(OUT_AC); turn_right(40);//紙コップがある方向を向くため右旋回 OnFwd(OUT_AC);//更に紙コップに近づく Wait(40); Off(OUT_AC); int B; for (B=1; B<=2; B++)//以下のことを2回繰り返し { SetPower(OUT_AC,2); turn_left(20);//紙コップを見つけるために一時的に左旋回 Wait(100); search_cup();//紙コップを見つけて紙コップに近づく Wait(100); } //手順4おわり cup_getup;//手順5はじめ 紙コップをつかむ Off(OUT_AC); Wait(100); turn_right(160);//手順5おわり 紙コップをつかんだ地点で右旋回し、X地点の方向を向く OnFwd(OUT_B);//手順6はじめ 紙コップを持ち上げる OnRev(OUT_AC);//紙コップを持ち上げながら下がり、紙コップからピンポン玉を出す Wait(100); Off(OUT_ABC); turn_left(85);//X地点の方向を向いてる状態からY地点の方向をを向くため左旋回 OnFwd(OUT_AC);//Y地点に近づき、紙コップをY地点に置く Wait(160); Off(OUT_AC); //手順6おわり } ・このロボットのタスクメインである。ロボット本体の説明の「ルート考案」のように本体が動作する。詳しいことはこのプログラムのコメントに書いている。 ・このロボットのタスクメインである。ロボット本体の説明の「ルート考案」のように本体が動作する。詳しいことはこのプログラムのコメントに書いていて、コメントの手順の数字はルート考案の番号に基づいている。 **3、実行結果と反省 [#w43dca6a] ・本体の説明で記したように、時間が足りなくてあまり本体を改善する余裕がなかった。さらに、本番直前までXを仕切る割りばしを接着しておらずその割りばしの段差を考慮できていなかったので2つ目の紙コップをつかむことができずにさらにその上にある障害物に当たってしまい5点という結果となった。本番1週間前はテスト週間だったのである程度は仕方がなっかたが、同じキットでほぼ満点をとったグループがいたので、もう少し余裕をもって取り組んでいれば、時間や部品不足の問題は若干でも解決し、本体を2台使うことで紙コップ全てを回収でき、もう少し点数を伸ばせたと思う。もうこの授業は終わってしまい、この反省をこの授業ではいかすことはできないが、これからの専門の授業にはいかしていきたい。