[[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}; #comment