[[戻る>2013b/Member]] #contents *課題 [#f8d8effa] 自作したコース(下図)に沿って一周するロボットを作成せよ。 -次のステップでプログラムを作成すること。 --交差点をきちんと認識し、正しく判断して通過できるようにする。 --確実に一周できるようにする。スタート地点から出発して元にもどるようにする。 --空き缶を交差点から10cm以上離した線上に起き、それを一旦どけて再び元の位置にもどすように改良する。 --1個の空き缶でうまくいったら、2個の空き缶でやってみる。 ~(下図は、授業で示された松本先生画のコース図)&br; #ref(zu.jpg)&br; 筆者は反時計回りを担当した。 *ロボット [#r5a0698c] -ドライブベースを小型化した。 -光センサーをより駆動部に近づけた。 -車輪を2つに減らした。 ~→小回りがきくようになった。&br; -支えとして、車輪ではなく底の丸いパーツを使用した。 ~→可動部を減らし、故障しうる箇所を減らした。&br;&br;(ドライブベースの写真) #ref(image_1.jpeg) #ref(image_2.jpeg) (ロボットの写真) #ref(image.jpeg) *プログラム [#s5e6edef] #define THRESHOLD 45 //ライントレースの閾値 #define set_H SetPower(OUT_AC,7); //直進用速度 #define set_L SetPower(OUT_AC,1); //カーブ用速度 #define turn_l1 set_L;OnFwd(OUT_C);OnRev(OUT_A); //反時計回り旋回 #define turn_l0 set_L;OnFwd(OUT_C);Off(OUT_A); //反時計回り移動 #define turn_r0 set_L;OnFwd(OUT_A);Off(OUT_C); //時計回り移動 #define turn_r1 set_L;OnFwd(OUT_A);OnRev(OUT_C); //時計回り旋回 #define go_fwd set_H;OnFwd(OUT_AC); //前進 #define go_rev set_H;OnRev(OUT_AC); //後退 #define STEP 1 //ライントレースの各動作時間 #define C1 1200 //1つ目の交差点までの時間(仮) #define C2 2200 //2つ目の交差点までの時間(仮) #define C3 2400 //3つ目の交差点までの時間(仮) #define TROAD_G 5150 //ゴール探索を始めるまでの時間(仮) #define TURN_T 72 //90°回転するにあたっての所要時間 #define CAN_T 61 //缶を動かすときに用いる時間 #define cross PlaySound(2);go_fwd;Wait(100);ncross+=1; //交差点を渡るために1秒前進 #define Clock FastTimer(0)-AFT+BEF //缶を動かした時間を除いた時刻 #define MOR 4 //交差点判定の猶予期間 task main() { SetSensor(SENSOR_1,SENSOR_TOUCH); SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); //タイマースタート int n=0; //停止用カウンタ int BEF=0; //缶を動かす前の時刻を記録する変数 int AFT=0; //缶を動かした後の時刻を記録する変数 int ncross=0; //交差点を渡った回数を記録する変数 go_fwd;until(SENSOR_2>=THRESHOLD+6);PlaySound(2);Wait(5);Off(OUT_AC); //スタート直後の交差点を超えるまで前進 turn_r0;until(SENSOR_2<=THRESHOLD-5);PlaySound(2);Off(OUT_AC); //黒いところを感知するまで時計回り移動 while(n==0){ //ゴールを感知するまで if(Clock>=C1-MOR&&Clock<=C1+MOR&&ncross==0){cross;} //交差点を渡る else if(Clock>=C2-MOR&&Clock<=C2+MOR&&ncross==1){cross;} else if(Clock>=C3-MOR&&Clock<=C3+MOR&&ncross==2){cross;} else if(FastTimer(0)>TROAD_G&&SENSOR_2<THRESHOLD+3){ //ゴール前の直線部に入る時間になったらゴール探索,ラインから外れたら通常のライントレースに戻す PlaySound(2);turn_r1;Wait(TURN_T);Off(OUT_AC); //90°回転 if(SENSOR_2<THRESHOLD-3){PlaySound(3);go_fwd;Wait(100);n++;} //ゴールを発見したら向きを変えずに直進し、停止用のカウンタに+1 else{turn_l1;Wait(TURN_T);Off(OUT_AC);go_fwd;Wait(10);} //ゴールを発見できなければ元の向きに戻って探索を続行 } else if(SENSOR_1==1){ //缶を動かす PlaySound(5); go_fwd;Wait(CAN_T); //缶と一緒にドライブ長だけ進む BEF=FastTimer(0); //実行前の時刻を記録 turn_l1;Wait(2*TURN_T); //缶と一緒に180°半時計回り旋回 go_rev;Wait(CAN_T);turn_r1;Wait(2*TURN_T); //缶を置いてライントレースの位置へ戻る AFT=FastTimer(0)+CAN_T; //実行後の時刻+αを記録 } else{ //ライントレース if(SENSOR_2<THRESHOLD-7){turn_l1;} //黒い部分を感知したら反時計回り旋回 else if(SENSOR_2<THRESHOLD-5){turn_l0;} //黒寄りの境界を感知したら反時計回り移動 else if(SENSOR_2<THRESHOLD+3){go_fwd;} //境界を探知したら直進 else if(SENSOR_2<THRESHOLD+5){turn_r0;} //白寄りの境界を感知したら時計回り移動 else{turn_r1;} //白い部分を感知したら時計回り旋回 Wait(STEP); //決定した動作を10ミリ秒間行う } } while(n>0){Float(OUT_AC);} //停止用カウンタが0でなくなったら停止する } *反省点 [#s5f73126] -プログラム制作の所要時間を甘く見積もりすぎた結果、プログラムが完成しなかった。 --交差点を判別するプログラムが出来ず、時間による判定となってしまった。 --缶を移動するプログラムが出来なかった。