[[2013a/Member]] *作品の説明 [#w2547922] **機体について [#z0077bd3] クワガタのような大きなアームを装備している。&br; &ref(20130710_204817.jpg);&br;&br;&br; ライントレースの様子&br; &ref(20130710_204754.jpg);&br; **プログラム概要 [#u820f1b7] 半時計周りの空き缶運び。&br; ラインの右側をトレースしながら8.5秒間(空き缶を掴むまで)前進する。&br; ↓&br; 空き缶を掴む。&br; ↓&br; ラインの左側を前進。&br; ↓&br; 十字路通過。&br; ↓&br; ラインの左側を前進しながら3回十字路を通過する。&br; ↓&br; 20.5秒間ラインの左側を前進する。&br; ↓&br; 右旋回をして、180°機体の向きを回転させる。&br; ↓&br; 空き缶を置く。&br; ↓&br; 少しバックして、向きを前進方向に戻す。&br; ↓&br; ラインの右側を前進して、ゴールに向かう。&br; ↓&br; ゴール(終了)。&br;&br; *基本動作原理 [#xe8b782d] **プログラムの説明 [#mbb67ccf] 基本的な動作は至って簡単で、黒ラインの縁をトレースするものである。まず、ライントレースするにあたって光センサでラインの高度を読み取りながら走行するようにした。ラインの縁に差し掛かったときだけ直進するプログラムを作った。つまり、ラインの右側を走行する場合は白(紙の色)のとき左折をする。このとき黒ラインにどれだけ近いかで旋回と片輪をを軸にした回転に分割した。黒ラインから大きく離れているときは片輪を軸にした左回転。黒ラインに比較的近いときは左旋回とした。黒ラインの中に収まっているときは、黒色の濃さによって右折の度合いを判断している。黒ラインの中心部に機体が居るとき、センサーは一番小さな値を返して来る。この値に近いときは、片輪を軸とした右回転をする。中心部から外れた明るい黒(センサーの値が中心部より高い)時には、右旋回をする。&br; これがこのプログラムの前進部の動作原理である。&br; 次に十字路について解説する。十字路では前進するプログラムを続けると片輪の回転を連続して繰り返すことになる。つまり、回転した分のキョリを戻ることによって十字路の中心部に戻ることになる。中心に戻った後一度前進してから前進のプログラムに切り替える。&br; この前進と十字路のプログラムを合わせることによってコースを完走することが出来する。 *工夫・苦労した点 [#lf415756] **機体について [#z1270d58] 機体は初め使っていたライントレース専門の機体を空き缶を掴めるようにするために改造した。しかし、改造に使える時間が時間が短く、大部分の構造は変更することが出来まかった。そこで、もともと機体の制御部の位置を高い位置にすることによって空き缶を掴むアーム部分を取り付けることが出来た。 **プログラムについて [#g42b3626] 十字路の進入角度が鈍角のものと鋭角のものがあり、鈍角のときに中心部に差し掛かる時間が少なくなり、十字路をうまく曲がることが出来なかった。しかし中心部分に差し掛かる時間を短くすることで十字路と認識させることができうまくいった。 *反省・感想 [#ea95419d] 初めてプログラムを書いて動かしたときは課題をうまくこなせず、中間ロボコンに挑戦することがとても不安だった。しかし、徐々に機体の性質やセンサーの感度を理解でき最終的に完走まで持っていけることが出来てよかった。全体的にぎこちなく、またうまくいったりいかなかったと不安要素がとても多いプログラムを作ってしまった。&br; 今回のプログラミングを通してアルゴリズムを考えることも大切だが、何よりも動くものとして形にするときには、まず動くことが大切だと言うことが分かった。&br; 今回経験を生かしたプログラミングができるよう、残りの授業を楽しみたい。 *動作プログラム添付 [#h53f41e6] #define CENTER 45 #define CCC 20500 #define SPEED_H 52 #define SPEED_L 32 #define turn_R Off(OUT_B); OnFwd(OUT_C,SPEED_L); #define turn_L Off(OUT_C); OnFwd(OUT_B,SPEED_L); #define turn_SR OnRev(OUT_B,SPEED_L); OnFwd(OUT_C,SPEED_L); #define turn_SL OnRev(OUT_C,SPEED_L); OnFwd(OUT_B,SPEED_L); #define go_F OnFwd(OUT_BC,SPEED_H); #define STEP 1 #define nMAX 300 #define short_break Off(OUT_BC);Wait(300); #define CROSS_TIME 400 #define cross_line OnFwd(OUT_B,SPEED_L);OnFwd(OUT_C,SPEED_L);Wait(CROSS_TIME);short_break; #define cross OnFwd(OUT_C,SPEED_L);OnFwd(OUT_B,SPEED_L);Wait(CROSS_TIME+200);short_break; #define go_b OnFwd(OUT_B,-50);OnFwd(OUT_C,-50); //右側前進 sub trace_R() { int n; while(true) { while(n < nMAX) { if(SENSOR_1 < CENTER-12) { turn_SR; n++; } else { if(SENSOR_1 < CENTER-6) { turn_R; } else if(SENSOR_1 < CENTER+6) { go_F; } else if(SENSOR_1 < CENTER+12) { turn_L; } else { turn_SL; } n=0; } Wait(STEP); } short_break; turn_SL;Wait(nMAX*STEP); cross; n=0; break; } } //左側前進 sub trace_L() { int n; while(true) { while(n < nMAX) { if(SENSOR_1 < CENTER-12) { turn_SL; n++; } else { if(SENSOR_1 < CENTER-6) { turn_L; } else if(SENSOR_1 < CENTER+6) { go_F; } else if(SENSOR_1 < CENTER+12) { turn_R; } else { turn_SR; } n=0; } Wait(STEP); } short_break; turn_SR;Wait(nMAX*STEP); cross; n=0; break; } } task main() { SetSensorLight(S1); SetSensorTouch(S3); int n=0,count = 0; long t = 0; if(t >= 0){ t = CurrentTick(); //右側前進 while(true){ if(SENSOR_1 < CENTER-9){ if(SENSOR_1 < CENTER-19){ turn_R; }else{ turn_SR; } }else if(SENSOR_1 < CENTER+2){ go_F; }else{ if(SENSOR_1 < CENTER){ turn_SL; }else{ turn_L; } } Wait(STEP); if(CurrentTick() - t > 8500){ break; } } } //空き缶を掴む short_break; OnFwd(OUT_A,-30); trace_R(); trace_L(); trace_L(); trace_L(); //左側前進 t=CurrentTick(); while(true){ while(CurrentTick()-t <= CCC) { if(SENSOR_1 < CENTER-12) { turn_SL; } else { if(SENSOR_1 < CENTER-6) { turn_L; } else if(SENSOR_1 < CENTER+6) { go_F; } else if(SENSOR_1 < CENTER+12) { turn_R; } else { turn_SR; } } } break; } //180°向きを変える turn_SR; Wait(2700); //空き缶を離す OnFwd(OUT_A,30); Wait(300); Off(OUT_A); //後方へさがる go_b; Wait(600); //元の向きに直る turn_SL; Wait(1100); Off(OUT_BC); //右側前進 while(true) { while(n < nMAX) { if(SENSOR_1 < CENTER-12) { turn_SR; } else { if(SENSOR_1 < CENTER-6) { turn_R; } else if(SENSOR_1 < CENTER+6) { go_F; } else if(SENSOR_1 < CENTER+12) { turn_L; } else { turn_SL; } n=0; } Wait(STEP); } } //ゴール }