[[2017a/Member]] 目次 #contents *課題3 [#h83b06ee] **内容 [#xeee8fa9] 空き缶収集&積み上げロボット コースは課題2で使用したコースを使用する。 今回私たちは赤いところに空き缶を置き青いところには何も置かなかった。 #ref(2017a/Member/sassa/Mission3/2017a-mission3.png,100%); **基本ルール [#mdbb7436] ◦競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。 ◦図のA地点または(および)PQRSで囲まれた中央部の円からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。 ◦空き缶を集めて図のT地点を含む「ゴール」と書かれた3/4円と2線分で囲まれる領域に空き缶を運ぶ ◦なるべく高く空き缶を積み上げる ◦運び終わった後、あるいは積み上げた後はロボットはゴールの領域から外に出ること。また空き缶と接触していてはいけない。 ◦開始の合図から5秒以内にスタートボタンを押す作業を完了すること。 ◦競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。 ◦ロボットスタート後、速やかに1〜3の数字が記されたくじを引き、中身の入った缶を引いたくじの位置に設置する。 ◦途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。 課題2で使ったコースの指定されたところに空き缶を置き、空き缶を収集してゴール地点に空き缶を積む。 *ロボットについて [#k6c2b83a] 今回私達は二つのキットを合わせ、1台のロボットを作った。動きはライントレース&空き缶を持ち上げるという動作と空き缶をつかむという動作を分けてそれぞれにプログラムを送った。 **ロボットの構造 [#c367dfa3] ロボットの全体像は写真のとおりである。 センサーは光センサーと超音波センサーを使用しており、写真真ん中やや下の部分に取り付けている。超音波センサーは縦にする方が精度が増すとのことなので縦に取り付けた。 #ref(2017a/Member/sassa/Mission3/IMG_0330-1.jpg,60%); 私たちは缶が横ずれないようにするためにレールを取り付けた。 また、先端部分は缶を集めやすくするため幅を開いた。 #ref(2017a/Member/sassa/Mission3/IMG_0332.JPG,60%); アームの上げ下げは当初はモーターを軸にしていたがバランスが全く取れずアームが上がったままにならなかった。 なので下の写真のように歯車を組み合わせアームの後ろにモーターを取り付けることでバランスをとった。※全体像参照 #ref(2017a/Member/sassa/Mission3/IMG_0334.JPG,80%); さらに今回私たちがこだわったのは大きいロボットなのでコックピットを作ったことである。 私たちが今回のロボコンで3位をとることが出来たのはこのユーモアあふれるコックピットのおかげかもしれない・・・。 ただし、このコックピットはアームとともに上下するので実際に乗るのは遠慮したいところだ。 #ref(2017a/Member/sassa/Mission3/IMG_0331.JPG,60%); *プログラム [#w94d8e47] **マスターのプログラム [#w46ace11] ***定義 [#w6e24a02] #define THRESHOLD 50 //しきい値 #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); #define go_forward; OnRL(SPEED, SPEED); //前進 #define go_back OnRL(-SPEED,-SPEED); 後退 #define turn_left1; OnRL(SPEED, -SPEED); //左旋回 #define turn_left0; OnRL(SPEED, 0); //左折 #define turn_right0 OnRL(0, SPEED); //右折 #define turn_right1 OnRL(-SPEED, SPEED); //右旋回 #define SPEED 45 ***タスクメイン [#e987115a] task main() { SetSensorLight(S3); SetSensorLowspeed(S1); until(BluetoothStatus(1)==NO_ERR); int nKan=0; //つかんだ缶の個数 while (nKan < 2) { //積んだ缶が2個未満 while(SensorUS(S1)>15){ //缶までの距離が15センチ以上の時にはライントレースする if (SENSOR_3 < THRESHOLD-10) { //境界線よりやや黒よりのとき turn_left1; } else if (SENSOR_3 < THRESHOLD-5) { //ライン上のとき turn_left0; } else if (SENSOR_3 < THRESHOLD+5) { //境界線上のとき go_forward; } else if (SENSOR_3 < THRESHOLD+10) { //境界線よりやや白よりのとき turn_right0; } else { //ラインから外れたとき turn_right1; } } Wait(1); //一回の動作の時間 } until(SensorUS(S1)<=12){ //センサーと缶との間の距離が12センチ以下になるまで go_forward; } if (SensorUS(S1)<=12){ //センサーと缶との間の距離が12センチ以下のとき Off(OUT_BC); RemoteStartProgram(1,"sss1.rxe"); //スレイブに缶をつかみ,上げるプログラムを開始させる Wait(2000); RotateMotorEx(OUT_BC,45,100,0,true,true); //BとC(後ほど説明)を45の速さで100°回転 Wait(6000); nKan++; //缶を1つカウント } while(nKan<3){ //積んだ缶が3個未満のとき RotateMotor(OUT_B,-SPEED,200); go_forward; //ライントレースを止め,ゴールへ直進 Wait(2500); Off(OUT_BC); RemoteStartProgram(1,"sss2.rxe"); //缶を置く Wait(5000); go_back; Wait(3000); Off(OUT_BC); nKan++; //プログラムを終了させるためのもの } } **スレイブのプログラム [#nacf7484] ***缶をつかんであげるプログラム [#ma80e89d] 上記の「sss1.rxe」にあたる。 Bは缶をつかむためのアームの開閉,Cはアーム全体の上下である。 task main() { RotateMotor(OUT_C,-30,30); //アームが下がる RotateMotor(OUT_B,30,30); //アームを開く RotateMotor(OUT_C,-30,150); //アームが下がる Wait(2000); OnFwd(OUT_B,-30); //缶をつかむ Wait(3000); Off(OUT_B); RotateMotor(OUT_C,50,180);アームが上がる(缶を持ち上げる) } ***缶を置くプログラム [#ya898ecb] 上記の「sss2.rxe」にあたる。 task main() { RotateMotor(OUT_C,-30,180); //アームを下げる RotateMotor(OUT_B,30,90); //アームを開く(缶を放す) } *感想 [#ec654e92] **結果 [#te6519d4] 私たちの班は当初缶を3段積む予定だったが時間が足りず、無理矢理3段積もうすると失敗することよりも安全に2段積むということになった。さらに当日にゴールラインの線上にある空き缶はロボットが触れさえすれば特典になるというルールが追加され、結果私たちの班は12点を獲得し、技術点を合わせ総合で3位となった。 **感想&この授業を振り返って [#pda47670] 3位を取れたことは大変嬉しかったが個人的には3段積みたかった。この授業は授業外学習が大変多かったが、授業が終わってしまうと少し寂しい感じがする。私は将来エンジニアになろうと思っておりこの授業でプログラミングに触れることができ、より一層ロボットの面白さを知れたのでこの授業を履修して本当によかった。