机の周りを壁にそって走るプログラム(試作)†
sub straight(){
OnFwd(OUT_A+OUT_C);
}
sub turn_right(){
OnFwd(OUT_C);
}
sub turn_left(){
OnFwd(OUT_A);
}
void back(int t){
OnRev(OUT_A+OUT_C);
Wait(t);
Off(OUT_A+OUT_C);
}
task main(){
SetSensor(SENSOR_1,SENSOR_TOUCH);
SetSensor(SENSOR_3,SENSOR_TOUCH);
while(true){
if(SENSOR_3==1&&SENSOR_1!=1){//右が触れていたら
straight();//前進
}
if(SENSOR_3==1&&SENSOR_1==1){//両方触れていたら
turn_left();//右側のセンサーが壁に触れるまで左回転
until(SENSOR_3==1&&SENSOR_1!=1);
}
if(SENSOR_3!=1&&SENSOR_1==1){//左が触れていたら
turn_right();//右側のセンサーが壁に触れるまで右回転
until(SENSOR_3==1&&SENSOR_1!=1);
}
if(SENSOR_3!=1&&SENSOR_1!=1){//両方触れてなかったら
turn_right();//触れるまで右回転(ここを改良した方がよい)
until(SENSOR_3==1&&SENSOR_1!=1);
}
}
}
- うまく動かなかった。
- 両方触れてなかったとき前進もさせなければ触れないので改良してみたい
机の周りを壁に沿って走るプログラム(改良)†
task main()
{
SetSensor(SENSOR_1,SENSOR_TOUCH);
SetSensor(SENSOR_3,SENSOR_TOUCH);
while(true)
{
if ((SENSOR_1 == 0) && (SENSOR_3 == 0))//両方のセンサーが壁から外れていたら
{
OnFwd(OUT_A);//右回転
Float(OUT_C);
}
if ((SENSOR_1 == 1) && (SENSOR_3 == 0))//左のセンサーが触れていたら
{
OnFwd(OUT_C);//左回転(左が触れてるので左の車輪のバックもする)
OnRev(OUT_A);
Wait(50);
}
if ((SENSOR_1 == 0) && (SENSOR_3 == 1))//右のセンサーが触れていたら
{
OnFwd(OUT_C);//左回転
Float(OUT_A);
}
if ((SENSOR_1 == 1) && (SENSOR_3 == 1))//両方のセンサーが壁に触れていたら
{
OnFwd(OUT_C);//左側が外れるまで左回転
OnRev(OUT_A);
Wait(80);
}
}
}
- ロボットは普通の両側にセンサーをつけた物です
- 両側にセンサーをつけたので壁を見失いにくい物になりました。
- 残念ながら写真はとってありません。すいません。
- floatを使う事により関数を使わなくてもよいシンプルなプログラムになった
- Waitの調整が大変だった。
- 常に右側のセンサーが触れるようにプログラムしました。
- コメントどうぞ
- 改正版にも解説をお願いします。 -- ゆん(TAM)
- 見ました。プログラムと解説をもう少し離して書くともっと良くなると思いますよ。ロボットの解説もあると良いですね。 -- ゆん(TA)