index #contents *ロボットの説明 [#l0ebd109] &ref(2013b/Member/dtb/Mission1/mimi.gif,100%,ロボット説明); -タッチセンサー 私達の考えたタッチセンサーは軽い空き缶に対してちゃんと反応するために、タッチセンサーの前にハサミをつけることで敏感にさせた。このハサミにはモーターはついておらずハサミのどちらか片一方に空き缶を引っ掛けることでどかすことができる。 -ハサミ ハサミにはモーターはついておらずハサミのどちらか片一方に空き缶を引っ掛けることでどかすことができる。 -光センサー なるべく本体に近づけるようにした。そのおかげでより本体が黒いラインを走っているかのようになった。しかしその代償としてセンサー周りの地面が暗くなってしまい、黒白の判定が難しくなってしまった。 *コース攻略 [#k1b5328d] -コースを5分割する。詳しくは図より。それに伴いプログラムも多いくくりで見ると5つの構成になっている(ゴールの動作は省く)。 &ref(2013b/Member/dtb/Mission1/bk201.gif,100%,経路説明); (なお走る順番は�、��□���→�あ��ア�ゴールで、吹き出しの中の数字は交差点の番号である。) **交差点判断 [#d5bb0210] 交差点4つとゴール(コースの図を参照)に差し掛かる時の大体の時間をはかる。そこに差し掛かったら0.01刻みで白黒を判断するプログラムで、3連続で真っ黒(光センサーの値にすると THRESHOLD -2)のところになったら交差点と判断。なお真っ黒(光センサーの値にすると THRESHOLD -2)のとこでは「ピッ」という音が鳴り、0.5秒待つようにして分かりやすくしている。交差点を渡る時のプログラムはcross_line(p,q)でp,qはそれぞれ右に旋回、左に旋回する時間の関数。 **空き缶をどかす動作 [#i05120f7] 2つの缶の位置はコースの図を参照。まず缶が目の前に来た時それが缶であると判断するときの方法は、タッチセンサーで行う。タッチセンサーはてこの原理を利用して反応を良くしている。どかす方法はロボットのハサミで缶をひっかけるようにしてやる。紙からロボットや缶がはみ出てしまう、缶がハサミから抜けてしまうなどの問題があったためどかす動作は缶の位置ごとに違う。 &ref(2013b/Member/dtb/Mission1/k_k_d.gif,70%,カンの動きその1); &ref(2013b/Member/dtb/Mission1/kagero.gif,70%,カンの動きその2); &ref(2013b/Member/dtb/Mission1/k_k_d.gif,60%,カンの動きその1); &ref(2013b/Member/dtb/Mission1/kagero.gif,60%,カンの動きその2); *プログラム [#lcf8f042] #define THRESHOLD 37 #define set_power_H SetPower(OUT_AC,5);//強い力を設定 #define set_power_L Set Power(OUT_AC,1);//弱い力を設定 #define turn_left set_power_L;Off(OUT_A);OnFwd(OUT_C);//左回り #define senkai_left set_power_L;OnRev(OUT_A);OnFwd(OUT_C);//左旋回 #define turn_right set_power_L;Off(OUT_C);OnFwd(OUT_A);//右回り #define senkai_right set_power_L;OnRev(OUT_C);OnFwd(OUT_A);//右旋回 #define go_forward set_power_H;OnFwd(OUT_AC);//直進 #define STEP 1//0.001秒ごとに白黒を判断 #define SAIDAI 3//交差点に差し掛かった時、3回真っ黒になったら交差点と判断 #define short_break Off(OUT_AC);Wait(80); //小休憩 #define CROSS_TIME 60 //交差点を渡る時間 #define cross_line(p,q) short_break;senkai_right;Wait(p);senkai_left;Wait(q);go_forward; Wait(CROSS_TIME);Off(OUT_AC);//交差点渡る #define counter3 PlaySound(SOUND_CLICK);Off(OUT_AC);Wait(50);//3回鳴ると交差点と判断 #define GOOL short_break;go_forward;Wait(50);senkai_left;Wait(210);go_forward;Wait(100); Off(OUT_AC);//最後のゴールのプログラム ここまでが数値や基本動作の定義。 sub akikan_1() //1回目に缶をどかすプログラム { if(SENSOR_3==1){ Off(OUT_AC);Wait(60); turn_right;Wait(510); go_forward;Wait(45); senkai_left;Wait(470); OnRev(OUT_AC);Wait(50); senkai_right;Wait(150);} } sub akikan_2() //2回目に缶をどかすプログラム { if(SENSOR_3==1){ Off(OUT_AC);Wait(60); turn_right;Wait(1400); senkai_left;Wait(750); go_forward;Wait(50); OnRev(OUT_AC);Wait(50); senkai_right;Wait(200);} } sub line_race() //交差点がないところを走るプログラム { if(SENSOR_2 < THRESHOLD -2){ senkai_left; }else if(SENSOR_2 <= THRESHOLD -1){ turn_left; }else if(SENSOR_2 <= THRESHOLD){ go_forward; }else if(SENSOR_2 < THRESHOLD +2){ turn_right; }else{senkai_right;} Wait(STEP);} } sub before_cross_line() //交差点付近を走るプログラム { int nOnline=0; while (nOnline < SAIDAI){ if(SENSOR_2 < THRESHOLD -2){ counter3; senkai_left; nOnline++; }else{ if(SENSOR_2 <= THRESHOLD -1){ turn_left; }else if(SENSOR_2 <= THRESHOLD){ go_forward; }else if(SENSOR_2 < THRESHOLD +2){ turn_right; }else{senkai_right;} nOnline=0; } Wait(STEP); } } ここまでがサブルーチン。 task main() { SetSensor(SENSOR_3,SENSOR_TOUCH);//タッチセンサーを設置 SetSensor(SENSOR_2,SENSOR_LIGHT);//光センサーを設置 int nCross=0;//交差点を渡った回数(nCross=5,6は例外) int nOnline=0;//黒を判断した時の回数 ClearTimer(0);//タイマー(0)を0に設定 while(nCross<6){ これ以降からロボットの動作のプログラム if(nCross==0){ while(FastTimer(0)<3000){ line_race();akikan_1(); } if(FastTimer(0)>=3000){ //この時間から交差点警戒 before_cross_line(); cross_line(60,0); } PlaySound(SOUND_DOWN); nCross++; nOnline=0; ClearTimer(0); } //nCross0終わり ここまでが一個目の空き缶をどかし、一回目の交差点を渡る時のプログラム。(上の図の�,冒蠹�) else if(nCross==1){ while(FastTimer(0)<1200){ line_race(); } if(FastTimer(1)>=1200){ //この時間から交差点警戒 before_cross_line(); cross_line(0,0); } PlaySound(SOUND_DOWN); nCross++; nOnline=0; ClearTimer(0); } //nCross1終わり ここまでが二回目の交差点を渡るプログラム。(上の図の�△冒蠹�) else if(nCross==2){ while(FastTimer(0)<170){ line_race(); } if(FastTimer(0)>=170){ //この時間から交差点警戒 before_cross_line(); cross_line(0,0); } PlaySound(SOUND_DOWN); nCross++; nOnline=0; ClearTimer(0); } //nCross2終わり ここまでが三回目の交差点を渡るプログラム。(上の図の��に相当) else if(nCross==3){ while(FastTimer(0)<1000){ line_race(); } if(FastTimer(1)>=1000){ //この時間から交差点警戒 before_cross_line(); cross_line(0,20); } PlaySound(SOUND_DOWN); nCross++; nOnline=0; ClearTimer(0); } //nCross3終わり ここまでが四回目の交差点を渡るプログラム。(上の図の�い冒蠹�) else if(nCross==4){ while(FastTimer(0)<3500){ line_race();akikan_2(); } if(FastTimer(0)>=3500){ //この時間から交差点警戒 before_cross_line(); } PlaySound(SOUND_UP); nCross++; } //nCross4終わり ここまでが2個目の空き缶をどかし、ゴールする直前までのプログラム。(上の図の�イ冒蠹�) else{ GOOL; nCross++; } //ゴール } //while(nCross<6)の終わり } //task main()の終わり *プログラムの補足 [#d7b6111a] -nCross=5,6が例外というのはnCross=5はゴールと認識させるものでnCross=6はプログラムを終わりを告げるためのもの。なぜ他の4つとくっつけたのかというと変数はできるだけ少なくしたほうが、ロボットにプログラムを入れるときの時間短縮になり、電池の消耗を防げると思ったから。 -cross_lineのプログラムがそれぞれ違うのは交差点ごとにロボットの向きが異なり、調整しなければならなかったため。 *反省すべき点 [#eb2a5e59] +ペアーの人と講義以外の時間に一緒にやることが少なく、個人作業が多くなってしまった。もっとペアーの人と連絡をを取り合うようにしたい。 +ロボットのハサミの作りがあまり良くなくプログラムで何とかしようとしたらプログラムが複雑になってしまった。ロボットの改造の時間をもっと取り入れば良かった。 +ロボットのスピードが遅い。