2018a/Member/haya/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2018a/Member]]
*課題 [#e2b82ceb]
-下の図の黒い線に沿って空き缶を移動させる。
#ref(http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2018a%2FMission2&openfile=2018a-mission2.png)
Aをスタート
Bを右折
Jで一時停止の後、Yの空き缶をキャッチしてJに戻る
JからKに向かい、Kを直進
Lを直進
Iを左折
Hで一時停止の後、左折
Gで一時停止の後、右折
Fで一時停止の後、右折
Eを直進
Dで一時停止の後、空き缶をXに置いてDに戻り、Cに向かう
Cで一時停止の後、直進
Bを直進
Aで停止
*ロボット [#t389e4a6]
#ref(robo2.jpg)
#ref(robo1.jpg)
-2枚目の写真で分かるように、小さなタイヤを内側につけている。
**工夫した点 [#pf79b874]
-センサーとタイヤの間隔が大すぎると進まなくなり、大きすぎると急なカーブがあるところをトレースできないためロボットの真下、タイヤの少し前にライトセンサーを取り付けた。
-ハサミを大きくしないと、缶をつかめないが、大きすぎるとつかむ前に缶にぶつかってしまうため、ハサミを右側に寄せて左回りで缶をつかむようにした。
-タイヤとタイヤの間隔が広すぎると急なカーブをトレースできないためタイヤを小さくしてロボットの内側につけた。
-ハサミの間にゴムをつけることでつかみやすくした。
*プログラム [#pb521fea]
-黒い線の右、または左の境界を明るさの差によって赤外線センサーで認識させる。
**交差点の認識 [#pcef75aa]
-赤外線センサーが交差点の内側にくる(右折する交差点なら、赤外線センサーが黒い線の右側にある状態)ようにあらかじめプログラムしておき、内側をトレースさせる。そうすることで、交差点にさしかかったときに赤外線センサーが黒を連続で認識するようになる。
-nという変数を使い、赤外線センサーが黒(黒い線の上に乗っている状態)を連続で認識したときにカウントし、黒をいくつかの値まで(交差点Jなら270)認識すると、交差点と判断させる。
**プログラム [#j200ef3c]
#define llt OnRev(OUT_A,50); OnFwd(OUT_C,30); Wait(1);//大きく左に回る
#define lrt OnFwd(OUT_A,30); OnRev(OUT_C,50); Wait(1);//大きく右に回る
#define ternleft OnRev(OUT_A,50); OnFwd(OUT_C,10);//左に回る
#define ternright OnFwd(OUT_A,10); OnRev(OUT_C,50);//右に回る
#define go OnRev(OUT_A,50); OnRev(OUT_C,50);//直進する
#define back OnFwd(OUT_A,50); OnFwd(OUT_C,50);//後退する
#define close RotateMotor(OUT_B,50,90);
#define open RotateMotor(OUT_B,50,-90);
task main()
{
SetSensorLight(S3);
int n=0;
while(n<=250) //bまで
{
if(SENSOR_3<45) //B
{
lrt; n++;
}
else if(SENSOR_3<52) //G
{
go; n=0;
}
else
{
llt; n=0; // W
}
}
Off(OUT_AC);
Wait(1000);
RotateMotor(OUT_C,50,-200);
while(n<=270) //Jまで
{
if(SENSOR_3<45) //B
{
lrt; n++;
}
else if(SENSOR_3<52) //G
{
go; n=0;
}
else
{
llt; n=0; // W
}
}
Off(OUT_AC);
Wait(1000);
close; //缶を掴む
RotateMotor(OUT_A,50,-350);
n=0;
while(n<=200)
{
if(SENSOR_3<45) //B
{
llt; n++;
}
else if(SENSOR_3<51) //G
{
go; n=0;
}
else
{
ternright; n=0; // W
}
}
Off(OUT_AC);
Wait(1000);
RotateMotor(OUT_C,50,-90);
Off(OUT_C);
n=0;
while(n<=210)
{
if(SENSOR_3<45) //B
{
llt; n++;
}
else if(SENSOR_3<51) //G
{
go; n=0;
}
else
{
ternright; n=0; // W
}
}
Off(OUT_AC);
Wait(1000);
RotateMotor(OUT_C,50,-90); //L通過
Off(OUT_C);
n=0;
while(n<=200)
{
if(SENSOR_3<45) //B
{
llt; n++;
}
else if(SENSOR_3<51) //G
{
go; n=0;
}
else
{
ternright; n=0; // W
}
}
Off(OUT_AC);
Wait(1000); //H stop
n=0;
while(n<=400)
{
if(SENSOR_3<45) //B
{
llt; n++;
}
else if(SENSOR_3<51) //G
{
go; n=0;
}
else
{
ternright; n=0; // W
}
}
Off(OUT_AC);
go;
Wait(500); //s1
n=0;
while(n<=400)
{
if(SENSOR_3<45) //B
{
lrt; n++;
}
else if(SENSOR_3<52) //G
{
go; n=0;
}
else
{
llt; n=0; // W
}
}
Off(OUT_AC);
go;
Wait(500); //s2 stop
n=0;
while(n<=200)
{
if(SENSOR_3<45) //B
{
llt; n++;
}
else if(SENSOR_3<52) //G
{
go; n=0;
}
else
{
lrt; n=0; // W
}
}
Off(OUT_AC);
Wait(1000); //G stop
RotateMotor(OUT_C,50,-310);
n=0;
while(n<=200)
{
if(SENSOR_3<45) //B
{
lrt; n++;
}
else if(SENSOR_3<52) //G
{
go; n=0;
}
else
{
llt; n=0; // W
}
}
Off(OUT_AC);
Wait(1000);
RotateMotor(OUT_C,50,-90); //F通過
n=0;
while(n<=200)
{
if(SENSOR_3<45) //B
{
lrt; n++;
}
else if(SENSOR_3<52) //G
{
go; n=0;
}
else
{
llt; n=0; // W
}
}
Off(OUT_AC);
Wait(1000);
RotateMotor(OUT_C,50,-90); //E通過
n=0;
while(n<=200)
{
if(SENSOR_3<45) //B
{
lrt; n++;
}
else if(SENSOR_3<52) //G
{
go; n=0;
}
else
{
llt; n=0; // W
}
}
Off(OUT_AC);
Wait(1000); //D stop
RotateMotor(OUT_C,50,90);
Off(OUT_C);
open;
back;
Wait(250);
RotateMotor(OUT_A,50,60);
Off(OUT_A);
go;
until(SENSOR_3 <= 45);
n=0;
while(n<=250)
{
if(SENSOR_3<45) //B
{
lrt; n++;
}
else if(SENSOR_3<52) //G
{
go; n=0;
}
else
{
llt; n=0; // W
}
}
Off(OUT_AC);
Wait(1000);
while(n<=250) //bまで
{
if(SENSOR_3<45) //B
{
lrt; n++;
}
else if(SENSOR_3<52) //G
{
go; n=0;
}
else
{
llt; n=0; // W
}
}
Off(OUT_AC);
Wait(1000);
RotateMotor(OUT_A,50,-130);
while(n<=250) //bまで
{
if(SENSOR_3<45) //B
{
lrt; n++;
}
else if(SENSOR_3<52) //G
{
go; n=0;
}
else
{
llt; n=0; // W
}
}
Off(OUT_AC);
}
**工夫した点 [#g9a6f3cd]
-交差点を認識するため、トレースする白と黒の境界を交差点がある側にして、交差点ごとにトレースする境界を変更する。
-小さすぎるカーブはやはりトレースしきれなかったので、交差点として認識させ、トレースする境界をカーブの外側に変更した。
*最後まで残った課題 [#y3e83f43]
-ロボットの重心が前過ぎて、境界をトレースするたびにロボットが大きく揺れてしまう。
-白と黒の両極端のプログラムで作ったため、安定して前に進まない。
終了行:
[[2018a/Member]]
*課題 [#e2b82ceb]
-下の図の黒い線に沿って空き缶を移動させる。
#ref(http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2018a%2FMission2&openfile=2018a-mission2.png)
Aをスタート
Bを右折
Jで一時停止の後、Yの空き缶をキャッチしてJに戻る
JからKに向かい、Kを直進
Lを直進
Iを左折
Hで一時停止の後、左折
Gで一時停止の後、右折
Fで一時停止の後、右折
Eを直進
Dで一時停止の後、空き缶をXに置いてDに戻り、Cに向かう
Cで一時停止の後、直進
Bを直進
Aで停止
*ロボット [#t389e4a6]
#ref(robo2.jpg)
#ref(robo1.jpg)
-2枚目の写真で分かるように、小さなタイヤを内側につけている。
**工夫した点 [#pf79b874]
-センサーとタイヤの間隔が大すぎると進まなくなり、大きすぎると急なカーブがあるところをトレースできないためロボットの真下、タイヤの少し前にライトセンサーを取り付けた。
-ハサミを大きくしないと、缶をつかめないが、大きすぎるとつかむ前に缶にぶつかってしまうため、ハサミを右側に寄せて左回りで缶をつかむようにした。
-タイヤとタイヤの間隔が広すぎると急なカーブをトレースできないためタイヤを小さくしてロボットの内側につけた。
-ハサミの間にゴムをつけることでつかみやすくした。
*プログラム [#pb521fea]
-黒い線の右、または左の境界を明るさの差によって赤外線センサーで認識させる。
**交差点の認識 [#pcef75aa]
-赤外線センサーが交差点の内側にくる(右折する交差点なら、赤外線センサーが黒い線の右側にある状態)ようにあらかじめプログラムしておき、内側をトレースさせる。そうすることで、交差点にさしかかったときに赤外線センサーが黒を連続で認識するようになる。
-nという変数を使い、赤外線センサーが黒(黒い線の上に乗っている状態)を連続で認識したときにカウントし、黒をいくつかの値まで(交差点Jなら270)認識すると、交差点と判断させる。
**プログラム [#j200ef3c]
#define llt OnRev(OUT_A,50); OnFwd(OUT_C,30); Wait(1);//大きく左に回る
#define lrt OnFwd(OUT_A,30); OnRev(OUT_C,50); Wait(1);//大きく右に回る
#define ternleft OnRev(OUT_A,50); OnFwd(OUT_C,10);//左に回る
#define ternright OnFwd(OUT_A,10); OnRev(OUT_C,50);//右に回る
#define go OnRev(OUT_A,50); OnRev(OUT_C,50);//直進する
#define back OnFwd(OUT_A,50); OnFwd(OUT_C,50);//後退する
#define close RotateMotor(OUT_B,50,90);
#define open RotateMotor(OUT_B,50,-90);
task main()
{
SetSensorLight(S3);
int n=0;
while(n<=250) //bまで
{
if(SENSOR_3<45) //B
{
lrt; n++;
}
else if(SENSOR_3<52) //G
{
go; n=0;
}
else
{
llt; n=0; // W
}
}
Off(OUT_AC);
Wait(1000);
RotateMotor(OUT_C,50,-200);
while(n<=270) //Jまで
{
if(SENSOR_3<45) //B
{
lrt; n++;
}
else if(SENSOR_3<52) //G
{
go; n=0;
}
else
{
llt; n=0; // W
}
}
Off(OUT_AC);
Wait(1000);
close; //缶を掴む
RotateMotor(OUT_A,50,-350);
n=0;
while(n<=200)
{
if(SENSOR_3<45) //B
{
llt; n++;
}
else if(SENSOR_3<51) //G
{
go; n=0;
}
else
{
ternright; n=0; // W
}
}
Off(OUT_AC);
Wait(1000);
RotateMotor(OUT_C,50,-90);
Off(OUT_C);
n=0;
while(n<=210)
{
if(SENSOR_3<45) //B
{
llt; n++;
}
else if(SENSOR_3<51) //G
{
go; n=0;
}
else
{
ternright; n=0; // W
}
}
Off(OUT_AC);
Wait(1000);
RotateMotor(OUT_C,50,-90); //L通過
Off(OUT_C);
n=0;
while(n<=200)
{
if(SENSOR_3<45) //B
{
llt; n++;
}
else if(SENSOR_3<51) //G
{
go; n=0;
}
else
{
ternright; n=0; // W
}
}
Off(OUT_AC);
Wait(1000); //H stop
n=0;
while(n<=400)
{
if(SENSOR_3<45) //B
{
llt; n++;
}
else if(SENSOR_3<51) //G
{
go; n=0;
}
else
{
ternright; n=0; // W
}
}
Off(OUT_AC);
go;
Wait(500); //s1
n=0;
while(n<=400)
{
if(SENSOR_3<45) //B
{
lrt; n++;
}
else if(SENSOR_3<52) //G
{
go; n=0;
}
else
{
llt; n=0; // W
}
}
Off(OUT_AC);
go;
Wait(500); //s2 stop
n=0;
while(n<=200)
{
if(SENSOR_3<45) //B
{
llt; n++;
}
else if(SENSOR_3<52) //G
{
go; n=0;
}
else
{
lrt; n=0; // W
}
}
Off(OUT_AC);
Wait(1000); //G stop
RotateMotor(OUT_C,50,-310);
n=0;
while(n<=200)
{
if(SENSOR_3<45) //B
{
lrt; n++;
}
else if(SENSOR_3<52) //G
{
go; n=0;
}
else
{
llt; n=0; // W
}
}
Off(OUT_AC);
Wait(1000);
RotateMotor(OUT_C,50,-90); //F通過
n=0;
while(n<=200)
{
if(SENSOR_3<45) //B
{
lrt; n++;
}
else if(SENSOR_3<52) //G
{
go; n=0;
}
else
{
llt; n=0; // W
}
}
Off(OUT_AC);
Wait(1000);
RotateMotor(OUT_C,50,-90); //E通過
n=0;
while(n<=200)
{
if(SENSOR_3<45) //B
{
lrt; n++;
}
else if(SENSOR_3<52) //G
{
go; n=0;
}
else
{
llt; n=0; // W
}
}
Off(OUT_AC);
Wait(1000); //D stop
RotateMotor(OUT_C,50,90);
Off(OUT_C);
open;
back;
Wait(250);
RotateMotor(OUT_A,50,60);
Off(OUT_A);
go;
until(SENSOR_3 <= 45);
n=0;
while(n<=250)
{
if(SENSOR_3<45) //B
{
lrt; n++;
}
else if(SENSOR_3<52) //G
{
go; n=0;
}
else
{
llt; n=0; // W
}
}
Off(OUT_AC);
Wait(1000);
while(n<=250) //bまで
{
if(SENSOR_3<45) //B
{
lrt; n++;
}
else if(SENSOR_3<52) //G
{
go; n=0;
}
else
{
llt; n=0; // W
}
}
Off(OUT_AC);
Wait(1000);
RotateMotor(OUT_A,50,-130);
while(n<=250) //bまで
{
if(SENSOR_3<45) //B
{
lrt; n++;
}
else if(SENSOR_3<52) //G
{
go; n=0;
}
else
{
llt; n=0; // W
}
}
Off(OUT_AC);
}
**工夫した点 [#g9a6f3cd]
-交差点を認識するため、トレースする白と黒の境界を交差点がある側にして、交差点ごとにトレースする境界を変更する。
-小さすぎるカーブはやはりトレースしきれなかったので、交差点として認識させ、トレースする境界をカーブの外側に変更した。
*最後まで残った課題 [#y3e83f43]
-ロボットの重心が前過ぎて、境界をトレースするたびにロボットが大きく揺れてしまう。
-白と黒の両極端のプログラムで作ったため、安定して前に進まない。
ページ名: