*課題2 右側 : 黒い線に沿って動くロボット[#cc86e3b4] **ロボットの特徴 [#e6c59b5f] このロボットは、光センサ2つ、タッチセンサ1つを車両の前方に搭載している。&br; 光センサは、コースを示す黒い線を認識するために使用。&br; バンパーにはタッチセンサが取り付けてあり、バンパーが前車に接触するとタッチセンサが押され、前車に接触したことが分かる。&br; 走行にはモータを2つ使用している。使用するギアを付け替えることで、高速(減速比1)でも低速(減速比5)でも動かすことができる。 &ref(kadai02-pic01.jpg); &ref(kadai02-pic02.jpg);&br; &ref(2006a/C4/課題2右/kadai02-mov02.mpg,ライントレースのテストの様子(MPEG動画)); **ロボットの製作過程 [#e62ce08b] -6月2日:光センサとタッチセンサを搭載したロボットを作り始める。とりあえずテキストに載っているベースを使用して、試作ロボットが完成する。&br; -6月9日:先週完成したロボットを使って、実際にコースを走らせてみる。しかし、問題が発生!! ロボットがラインをトレースをしてくれない。ここで試作ロボットの改造計画始める。改造の計画は、ベースそのものの変更、光センサの取り付け位置の変更の二つである。&br; まず、光センサをどの位置に取り付けるかを考えた。考えた結果、ロボットの中央に取り付けてみることにした。ベースは、光センサを搭載するために幅を広くするなどして工夫を凝らした。&br; 遂に完成!! そして、緊張しながらも新しいロボットでテストをしてみる。・・・トレースするどころか、試作ロボットよりも悪くなってしまった。プログラムを変更するなどいろいろしたが、問題点を見つけることが出来なかった。&br; 斬新なアイデアで考えだされたロボットだったが、結局却下され分解された。&br; -6月13日:もう一度、一からの製作。光センサを中央に取り付けるのは失敗だったため、前方に取り付けることにした。ラインを光センサの光で挟む方式ではなく、ライン上に光を当て、ラインから外れたら方向修正する方式にした。&br; ベースも少し改良、強度もupさせ三代目のロボットが完成する。早速テストをしてみると、しっかりとトレースしていた。高速ギアにするとかなりの速さでトレースしながら走行した。&br; 多くの時間をロボットに費やし、何度も試行錯誤してやっとロボットが完成した。 **プログラム [#a6eeb503] 完成版プログラム&br; -課題2-1 前車に接触したら反転する 作成日 2006/06/13 =================== #define THRESHOLD 40 //閾値を定義 task main() { int i;i=0; //整数型変数iを宣言し、0を代入 SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ1が光センサであることを宣言 SetSensor(SENSOR_2,SENSOR_TOUCH); //センサ2がタッチセンサであることを宣言 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ3が光センサであることを宣言 Wait(100); //すぐに動き出さないように待機 while(true) //以下無限ループ { SetPower(OUT_A+OUT_C,6); //速度が速くなりすぎないように出力を調整 if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) //センサ1,3共に黒線を認識した場合 { //直進する OnFwd(OUT_A+OUT_C); } if((SENSOR_1>=THRESHOLD)&&(SENSOR_3<THRESHOLD)) //センサ3のみが黒線を認識した場合 { //右モータのみを正回転 i=1; Float(OUT_C); OnFwd(OUT_A); } if((SENSOR_1<THRESHOLD)&&(SENSOR_3>=THRESHOLD)) //センサ1のみが黒線を認識した場合 { //左モータのみを正回転 i=2; Float(OUT_A); OnFwd(OUT_C); } if((SENSOR_1>=THRESHOLD)&&(SENSOR_3>=THRESHOLD)) //センサ1,3共に黒線を認識しなかった場合 { //直前に動いているモータの反対側のモータを逆回転 if(i==1){OnRev(OUT_C);} if(i==2){OnRev(OUT_A);} } if(SENSOR_2==1) //センサ2が押された場合、反転する { SetPower(OUT_A+OUT_C,3); //出力を下げ、速度を落とす OnRev(OUT_A+OUT_C); //一旦後退 Wait(25); OnFwd(OUT_C); //少し右に回転 Wait(35); while((SENSOR_1>=THRESHOLD)&&(SENSOR_3>=THRESHOLD)) {OnRev(OUT_A);OnFwd(OUT_C);} //黒線を認識するまで回転を続ける } } } -課題2-2 前車に接触したら前車を避ける 作成日 2006/06/13 ==================== #define THRESHOLD 40 //閾値を定義 task main() { int i;i=0; //整数型変数iを宣言し、0を代入 SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ1が光センサであることを宣言 SetSensor(SENSOR_2,SENSOR_TOUCH); //センサ2がタッチセンサであることを宣言 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ3が光センサであることを宣言 Wait(100); //すぐに動き出さないように待機 while(true) //以下無限ループ { SetPower(OUT_A+OUT_C,6); //速度が速くなりすぎないように出力を調整 if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) //センサ1,3共に黒線を認識した場合 { //直進する OnFwd(OUT_A+OUT_C); } if((SENSOR_1>=THRESHOLD)&&(SENSOR_3<THRESHOLD)) //センサ3のみが黒線を認識した場合 { //右モータのみを正回転 i=1; Float(OUT_C); OnFwd(OUT_A); } if((SENSOR_1<THRESHOLD)&&(SENSOR_3>=THRESHOLD)) //センサ1のみが黒線を認識した場合 { //左モータのみを正回転 i=2; Float(OUT_A); OnFwd(OUT_C); } if((SENSOR_1>=THRESHOLD)&&(SENSOR_3>=THRESHOLD)) //センサ1,3共に黒線を認識しなかった場合 { //直前に動いているモータの反対側のモータを逆回転 if(i==1){OnRev(OUT_C);} if(i==2){OnRev(OUT_A);} } if(SENSOR_2==1) //センサ2が押された場合、右によける { SetPower(OUT_A+OUT_C,3); //出力を下げ、速度を落とす Off(OUT_A+OUT_C); OnRev(OUT_A+OUT_C); //一旦後退 Wait(25); OnFwd(OUT_C); //右に方向転換 Wait(40); OnFwd(OUT_A); //直進 Wait(50); ClearTimer(0); while((SENSOR_1>=THRESHOLD)&&(SENSOR_3>=THRESHOLD)&&(FastTimer(0)<=20)&&(SENSOR_2==0)) {OnRev(OUT_C);} //黒線を認識するまで回避を続ける PlaySound(SOUND_CLICK); ClearTimer(0); while((SENSOR_1>=THRESHOLD)&&(SENSOR_3>=THRESHOLD)&&(FastTimer(0)<=50)&&(SENSOR_2==0)) {OnFwd(OUT_C);} PlaySound(SOUND_CLICK); //音を鳴らしているのはただの動作完了確認 ClearTimer(0); while((SENSOR_1>=THRESHOLD)&&(SENSOR_3>=THRESHOLD)&&(FastTimer(0)<=20)&&(SENSOR_2==0)) {OnRev(OUT_C);} PlaySound(SOUND_CLICK); ClearTimer(0); while((SENSOR_1>=THRESHOLD)&&(SENSOR_3>=THRESHOLD)&&(FastTimer(0)<=60)&&(SENSOR_2==0)) {OnFwd(OUT_C);} //回避が終わっても黒線を認識できない場合とにかく走り回る PlaySound(SOUND_CLICK); ClearTimer(0); while((SENSOR_1>=THRESHOLD)&&(SENSOR_3>=THRESHOLD)&&(FastTimer(0)<=20)&&(SENSOR_2==0)) {OnRev(OUT_C);} PlaySound(SOUND_CLICK); while((SENSOR_1>=THRESHOLD)&&(SENSOR_3>=THRESHOLD)&&(SENSOR_2==0)) {OnFwd(OUT_C);} PlaySound(SOUND_CLICK); } } } [[改良前の初期バージョンはこちら。>2006a/C4/Nori#kadai2-1-1]]&br;&br; 完成版は高速ギアを使用した場合、初期版は低速ギアを使用した場合の数値が入っているので、違うギアを使用する場合、転回・回避時のモータ回転時間を変える必要がある。&br;&br; プログラムの改良点 -トレース中、急コーナーにさしかかった(両方のセンサが黒線から外れた)ときに、もう一方のタイヤを逆回転させるようにした。 -転回・回避時に黒線を認識した場合の動作を追加。 -数値の調整 **工夫した点 [#mc5445cb] -コーナーが急なときは、一方のタイヤを回転させるだけでなくもう一方のタイヤも逆回転させるようにした。&br; コーナーが急かどうかは、コーナーリング中に2つの光センサが黒線を認識しなくなることで判断し、その前にどちらのタイヤを動かしていたかは、変数iに記憶している。 -転回や回避の最中でも黒線を認識したときはライントレースを再開するようにし、転回や回避が原因でコースを見失う可能性を低くした。 -他車に接触することを考え、強度を高くした。&br; &ref(kadai02-pic04.jpg); **苦労した点 [#z4b375ae] -前車を回避するときのモータの回転時間を調整するのに、何度も数値を変えてテストしなければならなかった。&br; 特に高速ギア使用時は動きが不安定なため、値を変えなくてもテストするたびに結果が変わることがあった。 -光センサの位置の調整。急なコーナーを曲がらせようとしてセンサを車体の中央に持っていったり、逆に少しタイヤを動かすだけで進行方向修正ができるように中央から離したり、&br; 細い線でも直進できるようにふたつのセンサの受光部をできるだけ近づけたりするなど、いくつかの方法を試みた。&br; 最終的に車体前部に、ふたつのセンサの底面を合わせて取り付けた。&br; &ref(kadai02-pic03.jpg);&br; **残っている問題点 [#kb39e430] -高速ギア使用時は走行速度が速いため、転回や回避のように、急に動作を変えると揺れたり跳ねたりする。 -コースアウトしにくくなるよう考えてプログラムを作ったが、それでもコースアウトすることがある。 **反省 [#j28b0623] ロボット本体の製作に時間をかけすぎてしまい、プログラムの数値の調整や走行テストが少ししかできなかった。 [[2006a/C4 に戻る>2006a/C4]]