- 追加された行はこの色です。
- 削除された行はこの色です。
[[2011a]]
目次
#contents
*課題2 ライントレース [#fdc5bc96]
次のような周回コース(黒い線)を動くロボットを作成せよ。
* 通常の交差点が2箇所以上ある
* ロータリー型の交差点が1箇所以上ある (ロータリーでは反時計まわりに進む)
* 直角に曲がるコーナーおよびそのコーナーをショートカットするコース(点線)が存在する
* 急なヘアピンカーブが1箇所以上ある
* スタート地点に目印がある
* 黒い線の幅は15〜20mm程度
*メンバー紹介 [#mabcf438]
-大丈V
-ばるす!
*コース紹介 [#l6bc2e3b]
こんな感じ
*ロボット紹介 [#u61f190a]
-お名前
美智子(道を走るから美智子)
-FRONT
#ref(032.JPG)
-SIDE
#ref(033.JPG)
*プログラム紹介 [#q090dbb2]
-大丈V
#define go OnFwd(OUT_A+OUT_C); //前進
#define back(bt) OnRev(OUT_A+OUT_C);Wait(bt);Off(OUT_A+OUT_C); //後退
#define turn_l OnRev(OUT_A);OnFwd(OUT_C); //左回り
#define turn_r OnFwd(OUT_A);OnRev(OUT_C); //右回り
task main()
{SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
int t = 0;
while( t <= 2 ){if((SENSOR_1 > 40) && (SENSOR_3 > 40)) //もし両方白だったら前進
{go;}
if((SENSOR_1 > 40) && (SENSOR_3 < 40)) //もしセンサー3が黒だったら右回転
{turn_r;}
if((SENSOR_1 < 40) && (SENSOR_3 > 40)) //もしセンサー1が黒だったら左回転
{turn_l;}
if((SENSOR_1 < 40) && (SENSOR_3 < 40)) //もし両方黒だったら0.5秒前進(この動作を2回行ったらwhile内は終了)
{t = t+1;
Off(OUT_A+OUT_C);go;Wait(50);Off(OUT_A+OUT_C);}
}
back(30); //ちょっと後退
turn_r;Wait(60); //右回転(ロータリー開始)
int u = 0;
while( u <= 1 ){if((SENSOR_1 > 40) && (SENSOR_3 > 40))
{go;}
if((SENSOR_1 > 40) && (SENSOR_3 < 40))
{u = u+1;Off(OUT_A+OUT_C);go;Wait(10);}
if((SENSOR_1 < 40) && (SENSOR_3 > 40))
{turn_l;}
}
turn_r;Wait(60); //右回転(ロータリー終わり)
ClearTimer(0);
while(Timer(0) <= 44){if((SENSOR_1 > 40) && (SENSOR_3 > 40))
{go;}
if((SENSOR_1 > 40) && (SENSOR_3 < 40))
{turn_r;}
if((SENSOR_1 < 40) && (SENSOR_3 > 40))
{turn_l;}
}
turn_l;Wait(65); //近道に進入
go;Wait(200);Off(OUT_A+OUT_C); //近道を進む
turn_l;until(SENSOR_3 < 40); //左に回る
int s = 0;
while( s <= 0 ){if((SENSOR_1 > 40) && (SENSOR_3 > 40)) //トレース開始
{go;}
if((SENSOR_1 > 40) && (SENSOR_3 < 40))
{turn_r;}
if((SENSOR_1 < 40) && (SENSOR_3 > 40))
{turn_l;}
if((SENSOR_1 < 40) && (SENSOR_3 < 40))
{s = s+1;
Off(OUT_A+OUT_C);go;Wait(50);Off(OUT_A+OUT_C);}
}
back(30); //ロータリーに進入して少しバックする
turn_r;Wait(60); //右に回って
int r = 0;
while( r <= 1 ){if((SENSOR_1 > 40) && (SENSOR_3 > 40)) //ロータリーを進む
{go;}
if((SENSOR_1 > 40) && (SENSOR_3 < 40)) //もし外側が黒になったら少し前進
{r = r+1;Off(OUT_A+OUT_C);go;Wait(5);}
if((SENSOR_1 < 40) && (SENSOR_3 > 40))
{turn_l;}
}
turn_r;Wait(60);
int p = 0;
while( p <= 2 ){if((SENSOR_1 > 40) && (SENSOR_3 > 40)) //ゴールまでトレース
{go;}
if((SENSOR_1 > 40) && (SENSOR_3 < 40))
{turn_r;}
if((SENSOR_1 < 40) && (SENSOR_3 > 40))
{turn_l;}
if((SENSOR_1 < 40) && (SENSOR_3 < 40))
{p = p+1;
Off(OUT_A+OUT_C);go;Wait(50);Off(OUT_A+OUT_C);}
}
}
-ばるす!
//逆走直角
#define THRESHOLD 40 // 閾値
#define Do 554
#define Re 1175
#define Mi 1319
#define Fa 1480
#define Sol 1568
#define Si 494
task play_music1() // 音楽を演奏するタスク(ロータリーまでVer)
{
while (true)
{
PlayTone(Re,10); Wait(15); // Wait の時間の方を少し長くして
PlayTone(Mi,10);Wait(15);
PlayTone(Fa,25);Wait(30);
PlayTone(Fa,25);Wait(30);
PlayTone(Fa,25);Wait(30);
PlayTone(Re,10); Wait(15); // Wait の時間の方を少し長くして
PlayTone(Mi,10);Wait(15);
PlayTone(Fa,25);Wait(30);
PlayTone(Fa,25);Wait(30);
PlayTone(Fa,25);Wait(30);
PlayTone(Re,10); Wait(15); // Wait の時間の方を少し長くして
PlayTone(Mi,10);Wait(15);
PlayTone(Fa,25);Wait(30);
PlayTone(Fa,25);Wait(30);
PlayTone(Sol,55);Wait(70);
PlayTone(Fa,10);Wait(15);
PlayTone(Mi,45);Wait(90);
PlayTone(Do,10);Wait(15);
PlayTone(Re,10);Wait(15);
PlayTone(Mi,25);Wait(30);
PlayTone(Mi,25);Wait(30);
PlayTone(Mi,25);Wait(30);
PlayTone(Do,10);Wait(15);
PlayTone(Re,10);Wait(15);
PlayTone(Mi,25);Wait(30);
PlayTone(Mi,25);Wait(30);
PlayTone(Mi,25);Wait(30);
PlayTone(Do,10);Wait(15);
PlayTone(Re,10);Wait(15);
PlayTone(Mi,25);Wait(30);
PlayTone(Mi,25);Wait(30);
PlayTone(Fa,15);Wait(15);
PlayTone(Mi,15);Wait(15);
PlayTone(Mi,15);Wait(15);
PlayTone(Fa,15);Wait(15);
PlayTone(Re,30);Wait(30);
}
}
task main()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
int t = 0;
int u = 0;
int v = 0;
int w = 0;
int x = 0;
start play_music1 ; // 演奏を開始
while(t <= 2 ){
if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 > THRESHOLD)) //もしも両方白線なら、
{OnFwd(OUT_A+OUT_C);} //直進して
if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 < THRESHOLD)) //もしも右が黒かったら、
{OnFwd(OUT_A);OnRev(OUT_C);} //左を進め、
if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD)) //もしも左が黒かったら、
{OnFwd(OUT_C);OnRev(OUT_A);} //右を進める。
if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 < THRESHOLD)) //で、両方黒線を踏んだら、
{
t = t+1; //tを一つ加えて
Off(OUT_A+OUT_C);OnFwd(OUT_A+OUT_C);Wait(100);} //動作を止めて無条件に1秒進む
}
stop play_music1 ; // 演奏を停止
Off(OUT_A+OUT_C);
OnRev(OUT_A+OUT_C);Wait(50);
Off(OUT_A+OUT_C);
OnFwd(OUT_A);OnRev(OUT_C);Wait(100);
while( u <= 1 ){
if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 > THRESHOLD)) //もしも両方白線なら、
{OnFwd(OUT_A+OUT_C);} //直進して
if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 < THRESHOLD)) //もしも右が黒かったら、
{u = u+1;
Off(OUT_A+OUT_C);OnFwd(OUT_A+OUT_C);Wait(10);} //uを+1
if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD)) //もしも左が黒かったら、
{OnFwd(OUT_C);Off(OUT_A);} //右を進める。
}
Off(OUT_A+OUT_C);OnFwd(OUT_A);OnRev(OUT_C);Wait(100); //ロータリー終わり
while(v <= 0 ){
if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 > THRESHOLD)) //もしも両方白線なら、
{OnFwd(OUT_A+OUT_C);} //直進して
if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 < THRESHOLD)) //もしも右が黒かったら、
{OnFwd(OUT_A);OnRev(OUT_C);} //左を進め、
if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD)) //もしも左が黒かったら、
{OnFwd(OUT_C);OnRev(OUT_A);} //右を進める。
if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 < THRESHOLD)) //で、両方黒線を踏んだら、
{
v = v+1; //vを一つ加えて
Off(OUT_A+OUT_C);OnFwd(OUT_A+OUT_C);Wait(100);} //動作を止めて無条件に1秒進む
}
Off(OUT_A+OUT_C);
OnRev(OUT_A+OUT_C);Wait(50);
Off(OUT_A+OUT_C);
OnFwd(OUT_A);OnRev(OUT_C);Wait(100);
while(w <= 2 ){
if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 > THRESHOLD)) //もしも両方白線なら、
{OnFwd(OUT_A+OUT_C);} //直進して
if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 < THRESHOLD)) //もしも右が黒かったら、
{OnFwd(OUT_A);OnRev(OUT_C);} //左を進め、
if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD)) //もしも左が黒かったら、
{OnFwd(OUT_C);OnRev(OUT_A);} //右を進める。
if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 < THRESHOLD)) //で、両方黒線を踏んだら、
{
w = w+1; //tを一つ加えて
Off(OUT_A+OUT_C);OnFwd(OUT_A+OUT_C);Wait(100);} //動作を止めて無条件に1秒進む
}
Off(OUT_A+OUT_C);
OnRev(OUT_A+OUT_C);Wait(50);
Off(OUT_A+OUT_C);
OnFwd(OUT_A);OnRev(OUT_C);Wait(100);
while( x <= 1 ){
if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 > THRESHOLD)) //もしも両方白線なら、
{OnFwd(OUT_A+OUT_C);} //直進して
if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 < THRESHOLD)) //もしも右が黒かったら、
{x = x+1;
Off(OUT_A+OUT_C);OnFwd(OUT_A+OUT_C);Wait(10);} //uを+1
if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD)) //もしも左が黒かったら、
{OnFwd(OUT_C);Off(OUT_A);} //右を進める。
}
Off(OUT_A+OUT_C);OnFwd(OUT_A);OnRev(OUT_C);Wait(100);} //ロータリー終わり
*まとめ紹介 [#v21ef617]
-今回はプログラムに重点を置いた。交差点を無視して進む方法やロータリー内の線の超え方を考えるのに苦労した。なるべくタイマーに頼らないようなプログラムを作ることができた。
*コメントしてくらさい [#xd227bf5]
- コースを学校に忘れたからあとで写真載せます -- [[大丈V]] &new{2011-06-24 (金) 13:22:22};
- 終わったりー -- [[ばるす!]] &new{2011-06-17 (金) 17:51:03};
- それぞれの変数の役割も説明してください。 -- [[松本]] &new{2011-06-30 (木) 16:07:21};
#comment