壁に沿うロボット program editer Hideshi†
機体概要†
- 機体概要
- 車輪の幅は狭いが機体自体の幅は広い、全体として長方形の横の辺を長くした形
- メリット なんとありません(センサーを横にもつけたので、このような形になってしまいました)
- デメリット 機体の旋回時にすぐに曲がると、機体の横が壁にぶつかり、完全に曲がれない→少し後退する必要がでてきた
基本プログラム†
sub Go(){OnFwd(OUT_A+OUT_C);}
//前進
sub Back(){OnRev(OUT_A+OUT_C);Wait(19);Off (OUT_A+OUT_C);}
//後退(後退は壁に接触した時に行なうが、そのまま曲がると機体の構造上
ぶつかってしまうので、少し後退する必要があった)
//Wait(19)という中途半端な数字を設定したのは、機体が曲がる時に、壁から離れすぎないように、
かつ、ぶつからないように微調整した結果
sub Left_Turn(){OnRev(OUT_A);OnFwd(OUT_C);Wait(60);}
//今回は機体の動力部を完全に分解して、車幅を狭めたので、始めの機体の時よりも Wait の値を小さくした
sub Right_Turn(){OnRev(OUT_C);OnFwd(OUT_A);Wait(60);}
//同上
- 基本的の動作(前進、後退、左折、右折)を、サブルーチンで定義 [#f8d7ae32]
実際に動かす(機体の前と右にセンサーを設置)†
task main()
{SetSensor(SENSOR_2,SENSOR_TOUCH);
//機体前部につけたタッチセンサー
SetSensor(SENSOR_3,SENSOR_TOUCH);
//機体の右側につけたタッチセンサー
while(true)
{Go();
//機体の右側につけたセンサーがオン状態の時、機体はまっすぐ進む
if(SENSOR_2==1){Back();Left_Turn();Go();Off(OUT_C);Wait(30);Go();Wait(80);};
//センサー2(機体前部の前部)が作動した場合
//1、下がって、左へ90°曲がる
//2、右側のモータを止め、左側のモータのみを動かし、機体の右側が壁に接地するようにする(詳しくは機体概略まで)
if(SENSOR_3!=1){Wait(80);Right_Turn();Go();Wait(50);Off(OUT_C);Wait(10);Go();Wait(80);};}
//機体の右側の壁がなくなった場合=右側のセンサーがオフになった場合
//1、すぐに曲がると壁にぶつかってしまうので、しばらく前進した後、右折
//2、センサー2と同じ
}
工夫点†
- Simple is best.
- センサーの感度が高いため、機体の右にあるセンサーがあまり作動しないようにプログラミングした。
- 機体が右折したりすると、どうしても機体が壁から離れてしまうので、曲がった直後のしばらくは壁よりに進むようにした。
- もし仮に壁から離れてしまっても、自動的に近づくようにした。
- もし何かの拍子に機体が壁から離れてしまっても、機体は自動的に壁に向かって動き、元通りの壁に沿う動きを始める (偶然にできてました)
コメントをお願いします†
- タッチセンサの感度はセンサ部分をどのようなメカニズムにするかに依存していますので、プログラムを工夫するのと同時に適度な感度になるようメカも工夫してください。可動部の支点の位置やゴムバンドの使い方も工夫してみてください。 -- 松本(教員)