*ライン・トレースロボット [#dba9122f] #contents **チームメンバー及び番号 [#w5548558] 番号:R3 ~メンバー ~・梅木 ~・桜井 ~・藤村 **課題の説明 [#r427d8fc] 今回の課題は、あらかじめ指定されたコース(以下のURL先にコース画像がある)を黒線で書き、その上をロボットに走らせ、ライン上のボールをゴールまで持っていくというものである。ルートはA→B、B→A、C→Aの3通りあり、各チームのメンバー一人ひとりが別々のルートをロボットに走らせる。なお三叉路Pおよび交差点Qでは2秒間停止しなければならない。今回私はAからBのルートを担当した。 (http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2015a%2FMission2&openfile=2015a-mission2.png) **ロボット [#fb341a2e] ***全体 [#v9ace547] #ref(./s_IMG_0299.JPG) 完成図 #ref(./s_IMG_0301.JPG) 分解図 ~このように簡単に分解でき、簡単に箱にしまうことができ、持ち運びも簡単。ただしその分多少もろくなってしまった。 ***アーム [#c1667e61] #ref(./new_IMG_0301.jpg,100%,アーム) アームはモータとギアで回す。アームの両方にギアをつけ、片方のアームのギアをモーターで回すことで、もう片方のアームのギアが反対に回り、アームの開閉が行えるようになっている。 ***センサー [#k226cf44] #ref(./s_IMG_0300.JPG,100%,前方) 光センサーは正面向かって左側にある。光センサーは地面ギリギリにすることで色を感知しやすくした。 ~少し中心よりも左側につけることで、少しだけ光センサーが振れるようになり、ロボットの動きを細かくできる。 **プログラム [#hb92b51e] #define THRESHOLD 42//閾値を42に設定 #define turn_leftA Off(OUT_A); OnFwd(OUT_C);//左に回転 #define turn_leftB OnFwd(OUT_C); OnRev(OUT_A); Wait(20);//その場で左に回転 #define turn_rightA OnFwd(OUT_A); Off(OUT_C);//右に回転 #define turn_rightB OnFwd(OUT_A); OnRev(OUT_C);//その場で右に回転 #define go_foward1 OnFwd(OUT_AC); Wait(8);//少し前に進む #define go_back1 OnRev(OUT_AC); Wait(10);//少し後ろに進む #define go_back2 OnRev(OUT_AC); Wait(100);//後ろに進む #define nMAX1 10//三叉路Pを認識するカウンタの回数 #define nMAX2 50//交差点Qの前で角度調整を行うことを認識するカウンタの回数 #define nMAX3 10//交差点Qを認識するカウンタの回数 #define nMAX4 8//直角カーブを認識するカウンタの回数 #define nMAX5 2//B地点についたことを認識するカウンタの回数 #define BallCatch 120//三叉路Pからボールをキャッチする場所に行ったことを認識するカウンタの回数 #define armopen OnFwd(OUT_B); Wait(7);// #define armclose OnRev(OUT_B); Wait(7);// task main(){ SetSensor(SENSOR_2,SENSOR_LIGHT); int nOnline=0;//三叉路Pを認識するカウンタ int nOnline1=0;//交差点Qの前で角度調整を行うことを認識するカウンタ int nOnline2=0;//交差点Qを認識するカウンタ int nOnline3=0;//直角カーブを認識するカウンタ int nOnline4=0;//B地点についたことを認識するカウンタ int ball=0;//三叉路Pからボールをキャッチする場所に行ったことを認識するカウンタ while(nOnline < nMAX1){//三叉路Pまで移動 if(SENSOR_2 < THRESHOLD){ turn_leftA; nOnline++; turn_leftA; nOnline++; } else { turn_rightA; nOnline=0; } turn_rightA; nOnline=0; } Wait(1); } Off(OUT_AC);//三叉路Pで2秒間停止 Wait(200); turn_rightB;//進む角度のズレを調整 Wait(18); go_foward1;//進む角度のズレを調整 nOnline=0; while(ball < BallCatch){//ボールをキャッチするところまで移動 if (SENSOR_2 < THRESHOLD) { turn_leftA; ball++; turn_leftA; ball++; } else { turn_rightA; ball++; } turn_rightA; ball++; } Wait(1); } Off(OUT_AC);//停止して Wait(200); armclose;//アームを閉じてボールをキャッチ Off(OUT_B); while(nOnline1<nMAX2){//ボールをつかんだところから交差点Qの少し前まで移動 if (SENSOR_2 < THRESHOLD) { turn_leftA; nOnline1=0; } else { turn_rightA; nOnline1++; } } Wait(1); } go_back1;//交差点Qの直前でロボットの構造上生じたズレを調整 turn_rightB; Wait(20); nOnline1=0; while(nOnline2<nMAX3){//ズレを修正し終わったところから交差点Qまで移動 if (SENSOR_2 < THRESHOLD) { turn_leftA; nOnline2++; } else { turn_rightA; nOnline2=0; } } Wait(1); } Off(OUT_AC);//交差点Qで2秒間停止 Wait(200); turn_rightB;//進む角度のズレを調整 Wait(50); go_foward1; nOnline2=0; while(nOnline3<nMAX4){//交差点Qから直角カーブまで移動 if (SENSOR_2 < THRESHOLD) { turn_leftA; nOnline3=0; } else { turn_rightA; nOnline3++; } } Wait(1); } turn_rightB;//直角カーブを曲がる Wait(90); while(nOnline4 < nMAX5){//直角カーブからBまで移動 if (SENSOR_2 < THRESHOLD) { turn_leftA; nOnline4=0; } else { turn_rightA; nOnline4++; } } Wait(1); } go_back2;//B地点でゴールの方へ角度を調整 turn_leftB; armopen;//アームを開き、少し後ろに下がったあと少し前に行くことでボールを転がしシュート Off(OUT_B); go_back2; go_foward1; Off(OUT_AC);//停止して終了 } **工夫点 [#w910cb33] ・タイヤとタイヤの幅をある程度狭くすることで、小回りが利くようにした。 ~・光センサーを地面ギリギリに持ってくることで、感知しやすくし、精度を高めた。 ~・光センサーを向って正面左側につけることで、ロボットの動きが細かくなるようにした。 **感想と反省 [#y550e953] ・割と時間ギリギリまでかかってしまった。予定が合わなかったり、ロボットの設計をミスしたりして、予定よりも時間がかかってしまったためだと思う。次の最終課題では、メンバーが6人になるので、さらに予定を合わせるのが難しくなる。できるだけ授業中にロボットの構成について話し合い、各自が作るパーツを決め、それぞれのパーツを作り、最後にそれらを組み合わせるという形で作っていきたい。 ~・ロボットがもろくなってしまった。走らせる分には問題ないのだが、少しの衝撃で壊れてしまったり、アームの時間調整を間違えると、外れてしまったりすることもあった。今度のロボットはその点を特に工夫したい。 ~・アームのギア調整がうまくいかず、小さいギアから大きいギアへ持っていくことができず、時間調節が大変だった。 ~・いろいろと大変なことがあったが、最後は何とか完成させられた。大変だったがやはりその分できた時の喜びが大きかった。次回の最終課題では、満足のいくものを完成させたい。