- 追加された行はこの色です。
- 削除された行はこの色です。
[[2011a]]
**目次 [#pec07b45]
#contents
*チーム紹介 [#ja2f2090]
-ヤスノ
-ソリョン
*課題について [#d44ad96e]
**指令 [#r73096db]
交差点、ろたり、近道、直角、急カブがある黒いセンのマップを移動する。
**ルール [#paf9dd69]
キットだけを使う。
*ロボット紹介 [#w95a86a4]
**ロボット全体 [#s9cc2597]
車輪の部分は課題1のときの車輪をそのまま利用。
センサの部分は極簡単に構成。
<上>
#ref(up.jpg)
<前>
#ref(mae.jpg)
<下>
#ref(sita.jpg)
<センサ>
#ref(senser.jpg)
**概要 [#y7729e5e]
-見た目より実用性重視!
-なるべく簡単にロボットを作ってプログラムに集中!
**問題点 [#h7d0aba0]
-黒い線をどうやって認識して移動するか。
-二つの光センサの役割をどうするか。
-交差点をどうやって通るか。
-ろたりをどうやって渡るか。
-近道をどうやって認識し利用するか。
-急カーブをどうやって通過するか。
-最後にどうやって止まるか。
**工夫した点と改善点 [#bc8307cb]
*プログラム紹介 [#xf289056]
ソリョン
#define THRESHOLD 40// 閾値 40基準に黒いところと明るいところを判別する
task main ()
{
int michi=0;//なんかい交差点に入ったのかを覚えている変数
int check;//センサ1が黒い線を探すときに必要な変数
SetSensor(SENSOR_1, SENSOR_LIGHT);//せんさ1をつかう
SetSensor(SENSOR_3, SENSOR_LIGHT);//せんさ3をつかう
while (michi<=7) //せんさ1、3が七回め黒い線に入ったときが終わり
{
if ((SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD))//センサ1が線のうえ、センサ3が白のうえにあるばあい
{
OnFwd(OUT_A+OUT_C); //前に移動する
}
if ((SENSOR_1 < THRESHOLD)&&(SENSOR_3 < THRESHOLD))//せんさ1、3が同時に黒い線に入るとイベント発生
{
Off(OUT_A+OUT_C);//せんさ1、3が同時に黒い線に入ったと教えてあげた後
PlaySound(SOUND_UP); //交差点に入ったことを教えってくれる音
Wait(150);
if(michi==2) //michi2のばあいはロタリに入ったのでロタリ通過プログラム発動
{//すなわちロタリ左にいくため左にちょっとだけ回る
Off(OUT_A+OUT_C);
Wait(10);
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(25);
Off(OUT_A+OUT_C);
}
if(michi==4) //michi4のばあいは近道に入ったので近道通過プログラム発動
{//この部分は完全に入力されたプログラムで動く
OnFwd(OUT_A+OUT_C);
Wait(30);
OnRev(OUT_C);
Wait(120);
OnFwd(OUT_C);
Wait(200);
OnRev(OUT_C);
Wait(140);
Off(OUT_A+OUT_C);
}
if(michi==5)//michi5のばあいはまたロタリに入ったのでロタリ通過プログラム発動
{//すなわちロタリ左にいくため左にちょっとだけ回る
Off(OUT_A+OUT_C);
Wait(10);
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(25);
Off(OUT_A+OUT_C);
}
OnFwd(OUT_A+OUT_C);//得に何でもない交差点はそのまま通過する
Wait(35);
Off(OUT_A+OUT_C);
michi=michi+1; //交差点を通過したので交差点カウンタ michiは+1
}
if (SENSOR_1 > THRESHOLD)//黒い線をさがすための部分、センサ1が線からはなれて白い部分に入ると
{
check=1;
ClearTimer(0);
while((Timer(0)<=5)&&(check))//まず黒線を探すため右にまがる 、Timerを使って一定時間移動
{
OnFwd(OUT_A);
OnRev(OUT_C);
if(SENSOR_1 < THRESHOLD) //探したらcheck=0になって線探し中止
{check=0;}
}//while
if(check==1)
{ClearTimer(0);
while((Timer(0)<=10)&&(check))//もし右に回るとき探さなかったら、左に回る
{
OnFwd(OUT_C); //migini chotto magate michi wo sagasu
OnRev(OUT_A);
if(SENSOR_1 < THRESHOLD)
{check=0;}
}//while
}
}//if
}
Off(OUT_A+OUT_C);//得に指定されてない交差点はそのまま通過する。
PlaySound(SOUND_UP);//終了を教えてくれる音
Wait(150);
PlaySound(SOUND_UP);
Wait(150);
PlaySound(SOUND_UP);
Wait(150);
}
ヤスノ
#define THRESHOLD 40 // 閾値
task main ()
{
int rcx=0; //何回、交差点に入ったのかを覚えている変数
int check; //センサが黒線を探すときに必要な変数
SetSensor(SENSOR_1, SENSOR_LIGHT); //センサ1に光センサを使う
SetSensor(SENSOR_3, SENSOR_LIGHT); //センサ3に光センサを使う
while (rcx<=5) //五回目にセンサ1、2が黒線にかかった時、終わり
{
if ((SENSOR_1 >= THRESHOLD)&&(SENSOR_3 >= THRESHOLD)) // 黒線上から外れている時 {
OnFwd(OUT_A+OUT_C);
}
else if ((SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD)) // センサ1が黒線上の時 {
OnRev(OUT_A);
OnFwd(OUT_C);
}
else if ((SENSOR_1 > THRESHOLD)&&(SENSOR_3 < THRESHOLD)) // センサ3が黒線上の時 {
OnRev(OUT_C);
OnFwd(OUT_A);
}
else if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 < THRESHOLD)) //センサ1センサ3がどちらも黒線上の時
{
PlaySound(SOUND_UP);Wait(150);
if(rcx==1){
OnFwd(OUT_A);
OnFwd(OUT_C);}
if(rcx==2){
OnFwd(OUT_A);
OnFwd(OUT_C);}
if(rcx==3) //ロータリーに入った
{
Off(OUT_A+OUT_C);
Wait(20);
OnRev(OUT_A);
OnFwd(OUT_C);
Wait(30);
OnFwd(OUT_A+OUT_C);
Wait(150);
OnRev(OUT_A);
OnFwd(OUT_C);
Wait(30);
OnFwd(OUT_A+OUT_C);}
if(rcx==4) //二回目のロータリーに入った
{
Off(OUT_A+OUT_C);
Wait(20);
OnRev(OUT_A);
OnFwd(OUT_C);
Wait(30);
OnFwd(OUT_A+OUT_C);
Wait(150);
OnRev(OUT_A);
OnFwd(OUT_C);
Wait(30);
OnFwd(OUT_A+OUT_C);}
if(rcx==5) //終わり
{
Off(OUT_A+OUT_C);
}
}
}
}
*まとめ [#h2772fc9]
**まとめ [#rada20a7]
-ヤスノ
センサ1とセンサ3で、黒線をはさむ形をとりました。
センサ1が黒線にかかる(SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD)と左に、
センサ3が黒線にかかる(SENSOR_1 > THRESHOLD)&&(SENSOR_3 < THRESHOLD)と右に、
曲がる様にプログラムしました。
曲がる時は、曲がりたい方向のタイヤを後退、反対の方のタイヤを前進させることで、より細かな動きにし、この副作用なのかなんなのか直角を曲がってくれるようになりました。^^
曲がる時は、曲がりたい方向のタイヤを後退、反対の方のタイヤを前進させることで、より細かな動きにし、直角を曲がるようにしました。
センサ1とセンサ3が同時に黒線にかかった時は、その回数に応じて別のプログラムが起動する様になっています。
ここまで出来るのに時間がかかり過ぎました。次回は(ってか、今回は)頑張ろうと思います。
-ソリョン
黒い線を追いかけていくためにセンサ1だけをつかいました。
で基本的にせんさ1が黒いところにいて、センサ3は白いところにある時の条件式
if(SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD)使って前に進む用にしました。
またセンサ1が黒いところから離れた場合、if(SENSOR_1 > THRESHOLD)使って黒い線を探すために
Timerを使って一定時間のあいだ右とか左回ってさがせようにせいました。
でセンサ3を使って交差点にif ((SENSOR_1 < THRESHOLD)&&(SENSOR_3 < THRESHOLD))ように
センサ1とセンサ3が同時に入った瞬間をとらえて普通の交差点はそのまま渡ったり、ロタリは
決まった規則で移動したり、近道の方に動けようにしたり、終わりを把握し止まったり
別々に順番に合わせてプログラムをしました。
PlaySound(SOUND_UP)を使って交差点に入ったときと、終わりの時をしらせてくれます。
<プログラムの図解>
#ref(map.jpg)
青い矢印の部分は黒い線を次のプログラムで
if ((SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD)) //in black
{
OnFwd(OUT_A+OUT_C);
}
SENSOR_1がくろいせんの上にあってSENSOR_3が白い部分にあった場合そのまま先進します。
そおでSENSOR_1が黒い線から離れたとき、つぎのプログラムによって
if (SENSOR_1 > THRESHOLD) //in white
{
check=1;
ClearTimer(0);
while((Timer(0)<=5)&&(check))
{
OnFwd(OUT_A); //migini chotto magate michi wo sagasu
OnRev(OUT_C);
if(SENSOR_1 < THRESHOLD)
{check=0;}
}//while
if(check==1)
{ClearTimer(0);
while((Timer(0)<=10)&&(check))
{
OnFwd(OUT_C); //migini chotto magate michi wo sagasu
OnRev(OUT_A);
if(SENSOR_1 < THRESHOLD)
{check=0;}
}//while
}
}//if
ひだり、みぎ両方1秒づつ回りながら黒い線をさがします。
赤い矢印は他にSENSOR_1と、SENSOR_3が同時に黒い部分にはいるところで決まったプログラムどうりにうごきます。
次のif ((SENSOR_1 < THRESHOLD)&&(SENSOR_3 < THRESHOLD))の中にかいています。