2005/C1/練習問題2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*2.壁に沿って動くロボット [#z1505e57]
#ref(2005/C1/練習問題2/imgp0124.jpg,50%,セバスチャン)
**プログラム [#wdf0d4bb]
+初めに設定したプログラム
task main()
{
SetSensor(SENSOR_1, SENSOR_TOUCH);
SetSensor(SENSOR_3, SENSOR_TOUCH);
while(true)
{
OnFwd(OUT_A+OUT_C) ;
if(SENSOR_1==1)
{
OnRev(OUT_A+OUT_C) ; Wait(25); /*直進中に左センサーがオンになったら左に約90度曲がる。そのまま曲がると引っ掛かるから少し下がる。
OnFwd(OUT_C) ; Wait(130);
}
if(SENSOR_3==0)
{
OnFwd(OUT_A+OUT_C) ;Wait(70); //すぐに曲がると右に曲がるときに引っ掛かるから0.7秒直進
Off(OUT_C) ;
until(SENSOR_3==1); //壁に戻る
OnFwd(OUT_C); //壁に戻ったら直進
}
}
}
-このプログラムだと直進中にSENSOR_3がオフになって0.7秒たたない内にSENSOR_1がオンになったときに、すぐ左に曲がれずに止まったり、壁に乗り上げたりした。
+次に設定したプログラム
task main()
{
SetSensor(SENSOR_1, SENSOR_TOUCH);
SetSensor(SENSOR_3, SENSOR_TOUCH);
start straght;
start monit; //タスクを二つ作った。
}
task straght()
{
while(true)
{
OnFwd(OUT_A+OUT_C) ;
if(SENSOR_3==0)
{
OnFwd(OUT_A+OUT_C) ;Wait(70);
Off(OUT_C) ;
until(SENSOR_3==1); //壁に戻るまで左のタイヤだけ動かす。
OnFwd(OUT_C); //壁に戻ったら直進する。
}
}
}
task monit()
{
while(true)
{
if(SENSOR_1==1)
{
stop straght; //壁に当たったらtask straghtが例え実行中でも停止する。
OnRev(OUT_A+OUT_C) ; Wait(25);
OnFwd(OUT_C) ; Wait(130);
start straght;
}
}
}
-このプログラムなら、SENSOR_3の命令が実行中であってもSENSOR_1の命令を実行できる。これにより、左折は問題なくなったが右折のときは、壁が無くなる前にセンサーが外れたりして、少し強引になってしまう。
-プログラムのコメントや、ロボットの説明がないとどのように壁をつたっているのかがわかりません。 -- [[まいける(TA)]] &new{2005-12-02 (金) 18:00:55};
-もう一歩です。実際にロボットを見ていない人にも分かるように工夫してみましょう。 -- [[かとりーぬ(TA)]] &new{2005-12-09 (金) 18:17:21};
#comment
終了行:
*2.壁に沿って動くロボット [#z1505e57]
#ref(2005/C1/練習問題2/imgp0124.jpg,50%,セバスチャン)
**プログラム [#wdf0d4bb]
+初めに設定したプログラム
task main()
{
SetSensor(SENSOR_1, SENSOR_TOUCH);
SetSensor(SENSOR_3, SENSOR_TOUCH);
while(true)
{
OnFwd(OUT_A+OUT_C) ;
if(SENSOR_1==1)
{
OnRev(OUT_A+OUT_C) ; Wait(25); /*直進中に左センサーがオンになったら左に約90度曲がる。そのまま曲がると引っ掛かるから少し下がる。
OnFwd(OUT_C) ; Wait(130);
}
if(SENSOR_3==0)
{
OnFwd(OUT_A+OUT_C) ;Wait(70); //すぐに曲がると右に曲がるときに引っ掛かるから0.7秒直進
Off(OUT_C) ;
until(SENSOR_3==1); //壁に戻る
OnFwd(OUT_C); //壁に戻ったら直進
}
}
}
-このプログラムだと直進中にSENSOR_3がオフになって0.7秒たたない内にSENSOR_1がオンになったときに、すぐ左に曲がれずに止まったり、壁に乗り上げたりした。
+次に設定したプログラム
task main()
{
SetSensor(SENSOR_1, SENSOR_TOUCH);
SetSensor(SENSOR_3, SENSOR_TOUCH);
start straght;
start monit; //タスクを二つ作った。
}
task straght()
{
while(true)
{
OnFwd(OUT_A+OUT_C) ;
if(SENSOR_3==0)
{
OnFwd(OUT_A+OUT_C) ;Wait(70);
Off(OUT_C) ;
until(SENSOR_3==1); //壁に戻るまで左のタイヤだけ動かす。
OnFwd(OUT_C); //壁に戻ったら直進する。
}
}
}
task monit()
{
while(true)
{
if(SENSOR_1==1)
{
stop straght; //壁に当たったらtask straghtが例え実行中でも停止する。
OnRev(OUT_A+OUT_C) ; Wait(25);
OnFwd(OUT_C) ; Wait(130);
start straght;
}
}
}
-このプログラムなら、SENSOR_3の命令が実行中であってもSENSOR_1の命令を実行できる。これにより、左折は問題なくなったが右折のときは、壁が無くなる前にセンサーが外れたりして、少し強引になってしまう。
-プログラムのコメントや、ロボットの説明がないとどのように壁をつたっているのかがわかりません。 -- [[まいける(TA)]] &new{2005-12-02 (金) 18:00:55};
-もう一歩です。実際にロボットを見ていない人にも分かるように工夫してみましょう。 -- [[かとりーぬ(TA)]] &new{2005-12-09 (金) 18:17:21};
#comment
ページ名: