#contents *課題について [#q739a056] 課題については[[2017a/Mission3]]こちらのページを参照。 班のメンバーはRyoma、Kawachan、rayonne、kkの四人 私達の班はロボットを2つに分けて缶を積むことにし、片方が缶を運び片方で積み上げるようにした。 Ryoma、[[Kawachan:http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMember%2FKawachan%2FMission3#t2394e7a]]は積み上げる側のロボットを作成した。 運ぶロボットについては[[rayonne:http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMember%2Frayonne%2FMission3]] , [[kk:http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMember%2Fkk%2FMission3]]のページへ &ref(IMG_1171.JPG);運ぶロボット *ロボット本体について [#te528e1c] &ref(IMG_1166.JPG);積むロボット 二つのタイヤを一つのモーターだけで回転させ、前後にのみ動ける仕組み。 缶を挟んでアームで持ち上げるようにしている。 &ref(IMG_1168.JPG); 缶との距離を測るために超音波センサーを取り付けた。 アームは平行四辺形を利用することで常にまっすぐなるようにしているが、アームの重さで傾いてしまう &ref(IMG_1173.JPG);もともとは底を四点で支えていた→ &ref(IMG_1167.JPG);後ろは側面を支えるだけにし、あえて傾けることで持ち上げたときにまっすぐになる &ref(IMG_1170.JPG); *プログラムについて [#m22e99f6] 缶を三段積めるようにプログラムを三つに分けた。 一つ缶を運び終わるごとに、運ぶ側から積む側にプログラムを起動させる命令を送り、一つずつ積み上げる方法を使った。 **taiki.rxe [#z54a64a7] ***マクロ、定数、サブルーチン [#x8a21358] この定義はどのプログラムでも同じように定義している #define SPEED 30 #define SPEED_SLOW 20 #define go_forward OnFwd(OUT_B,SPEED) float GetAngle(float d) // 距離dからタイヤの回転数を計算する関数 { const float diameter = 2.7; // タイヤの半径 const float pai=3.1415; // 円周率 float ang = d/(2*diameter*pai)*360.0; // 角度を計算する return ang; } sub can() // 缶に近づくサブルーチン { SetSensorLowspeed(S1); // 端子1に超音波センサー go_forward; until(SensorUS(S1) <=7);//七センチ以下で停止 Off(OUT_B); PlaySound(SOUND_UP); int angleA = GetAngle(2.5); // 2.5cm進むのに必要な回転角度 RotateMotor(OUT_B,SPEED_SLOW,angleA); //缶を正面に置くため少し前進 } ***メイン [#c752c86b] task main()//一つの缶を持ち上げて後ろで待機 { OnFwd(OUT_A,50);//アームを持ち上げる Wait(5000); OnFwd(OUT_A,20);//アームの状態を維持 can(); int angleA = GetAngle(10.0);//10.0cm進むのに必要な回転角度 RotateMotor(OUT_B,-20,angleA);//缶をつかめる位置までバックする RotateMotor(OUT_B,-20,300);//いったんさがる RotateMotor(OUT_A,-20,400);//アームを下げる Float(OUT_A); RotateMotor(OUT_C,-35,45);//アームを開く Wait(600); RotateMotor(OUT_B,20,300);缶まで進む RotateMotor(OUT_C,30,40);//缶をつかむ OnFwd(OUT_C,10);//つかみ続ける Wait(2400); OnFwd(OUT_A,60);//缶を持ち上げる Wait(6000); int angleB = GetAngle(30.0); // 30.0cm進むのに必要な回転角度 RotateMotor(OUT_B,-20,angleB); //バックする RotateMotor(OUT_A,-20,400);//アームを下して待機 Float(OUT_A); } **tumu.rxe [#r72ce10d] マクロ、定数、サブルーチン #define SPEED 30 #define SPEED_SLOW 20 #define go_forward OnFwd(OUT_B,SPEED) float GetAngle(float d) // 距離dからタイヤの回転数を計算する関数 { const float diameter = 2.7; // タイヤの半径 const float pai=3.1415; // 円周率 float ang = d/(2*diameter*pai)*360.0; // 角度を計算する return ang; } sub can() // 缶に近づくサブルーチン { SetSensorLowspeed(S1); // 端子1に超音波センサー go_forward; until(SensorUS(S1) <=7); Off(OUT_B); PlaySound(SOUND_UP); int angleA = GetAngle(2.5); // 2.5cm進むのに必要な回転角度 RotateMotor(OUT_B,SPEED_SLOW,angleA); // 指定した角度でモータを回転 } ***メイン [#sba63a3c] このプログラムでは、缶を積む動作と持ち上げて待機する、二つの作業が必要なためtask mainが長くならないように二つのサブルーチンに分けた。 sub tumu()//缶を積む { OnFwd(OUT_A,50);//アームを上げる Wait(5000); OnFwd(OUT_A,20);//アームの状態を維持 can(); int angleA = GetAngle(10.6); // 10.6cm進むのに必要な回転角度 RotateMotor(OUT_B,-20,angleA); // 缶を積める位置までバック Float(OUT_C); RotateMotor(OUT_A,-10,90);//アームを下げて缶に缶を乗せる OnFwd(OUT_A,20);//アームの状態を維持 Wait(500); RotateMotor(OUT_C,-20,60);//缶を離す int angleB = GetAngle(24.0); // 24.0cm進むのに必要な回転角度 RotateMotor(OUT_B,-20,angleB); // 24.0バック Off(OUT_A); RotateMotor(OUT_C,20,50);アームを閉じる } sub taiki2()//二段持ち上げて待機 { RotateMotor(OUT_A,-20,400);アームを下げる Float(OUT_A); RotateMotor(OUT_C,-30,50);アームを開く Wait(5000); int angleA = GetAngle(23.5); // 23.5cm進むのに必要な回転角度 RotateMotor(OUT_B,20,angleA); //缶が二段以上積まれていると距離が測れないためさがる距離に合わせて前進 RotateMotor(OUT_C,30,55);//缶をつかむ OnFwd(OUT_C,10);//つかみ続ける Wait(2000); OnFwd(OUT_A,60);//アームを上げる Wait(6000); int angleB = GetAngle(30.0); // 30.0cm進むのに必要な回転角度 RotateMotor(OUT_B,-20,angleB); // バック RotateMotor(OUT_A,-20,400);//アームを下す Float(OUT_A); RotateMotor(OUT_C,-30,50);//アームを開く RotateMotor(OUT_B,-20,30);//缶を置いて待機 } task main() { tumu(); taiki2(); } 二段積んだ後持ったまま次の命令を待つと缶がずれてしまうので一度置くようにしている。 **tumu2.rxe [#ka3eeec0] マクロ、定数、サブルーチン #define SPEED 30 #define SPEED_SLOW 20 #define go_forward OnFwd(OUT_B,SPEED) float GetAngle(float d) // 距離dからタイヤの回転数を計算する関数 { const float diameter = 2.7; // タイヤの半径 const float pai=3.1415; // 円周率 float ang = d/(2*diameter*pai)*360.0; // 角度を計算する return ang; } sub can() // 缶に近づくサブルーチン { SetSensorLowspeed(S1); // 端子1に超音波センサー go_forward; until(SensorUS(S1) <=7); Off(OUT_B); PlaySound(SOUND_UP); int angleA = GetAngle(2.5); // 2.5cm進むのに必要な回転角度 RotateMotor(OUT_B,SPEED_SLOW,angleA); // 指定した角度でモータを回転 } ***メイン [#ef34ff2b] task main() { RotateMotor(OUT_B,20,60); RotateMotor(OUT_C,30,50);//缶をつかむ OnFwd(OUT_C,10);//つかみ続ける OnFwd(OUT_A,50);//缶を持ち上げる Wait(5000); OnFwd(OUT_A,20);//アームを維持 can(); int angleA = GetAngle(11.0); // 11.0cm進むのに必要な回転角度 RotateMotor(OUT_B,-20,angleA); // 缶を積める位置までバック Float(OUT_C); RotateMotor(OUT_A,-10,90);//アームを下ろす OnFwd(OUT_A,20);//アームを維持 Wait(500); RotateMotor(OUT_C,-20,60);//缶を離す int angleB = GetAngle(24.0); // 24.0cm進むのに必要な回転角度 RotateMotor(OUT_B,-20,angleB); // 缶から離れる Off(OUT_A); RotateMotor(OUT_C,20,50); int angleC = GetAngle(20.0); // 20.0cm進むのに必要な回転角度 RotateMotor(OUT_B,-20,angleC); //離れた位置で動作終了 } *実際の動作 [#u1fc1e0c] [[動画:https://www.youtube.com/playlist?list=PL6A722G2H_cJ_0bifLx4loD4bZ6S1qKFi]] *発表の結果 [#c92f0a50] 本番でも三段積むことができ、基本点18点を取り一位をとれた。 *最後に [#n962fb6e] 二つに分けたことで集まりやすくなり、それぞれのロボット自体はスムーズに完成した。 しかし、考えていた通信が最後までうまくいかず当日にプログラムを少し変え、方法を変えざるを得なかった。 その結果成功率が大きく下がってしまった。