黒い線に沿って動き、紙コップを移動させるロボットを製作
Dをスタート➡ Cを直進➡ Bを左折➡ Pを左折(一時停止)➡ Qを直進➡ Rを左折➡ Fを左折➡ Sを直進(一時停止)➡ Y地点の紙コップを取得してコースに戻る➡ Sを直進(一時停止)➡ Qを左折(一時停止)➡ Rを直進➡ X地点に紙コップを置いてコースに戻る➡ Pを左折➡ B を左折(一時停止)➡ A地点へ(ゴール)
コップを取る部分とセンサ。一つのモーターはコップを取る部分の昇降をコントロールする。写真の赤丸で囲ってあるものが光センサになります。光センサは、ライントレースする際に白か黒(明暗)かの判断をするためにあります。光センサーと紙を平行にする。そうすることで、光センサの判断がされてからすぐにモーターが動き、誤動作が少なくなると考えたからです。
側面図
正面図
センサーの位置をできるだけ前輪の車軸の近くにすることで急カーブでもスムーズに動作するロボットを作ることができた
光の強さによって五段階に分かれる
task mainやサブルーチンで使用するものを以下のように定義した。
#define TLL OnFwd(OUT_A,30); OnRev(OUT_C,30); 左に回る #define TLL2 OnFwd(OUT_A,60); OnRev(OUT_C,50); 大きく左に回る #define TL OnFwd(OUT_A,50); OnFwd(OUT_C,5); 左に回る(右タイヤと左タイヤのスピード違う #define TLR OnRev(OUT_A,30); OnFwd(OUT_C,30); 大きく右に回る #define TR OnFwd(OUT_A,5); OnFwd(OUT_C,50); 右に回る #define TR2 OnRev(OUT_A,30);OnFwd(OUT_C,30); 右に回る #define go OnFwd(OUT_A,30); OnFwd(OUT_C,30); 前に進む #define DOWN OnFwd(OUT_B,30); Wait(700); Off(OUT_B); コップを取る腕を下げる #define UP OnRev(OUT_B,30); Wait(700); Off(OUT_B); コップを取る腕を上げる #define STEP 1 0.001秒ごとに実行する
PBの値は線の中央の濃い黒を連続で認識できる時間である。 PBの値は180より小さいの場合、濃い黒を連続で0.18秒間以内と認識される、 while内のプログラムは実行される。濃い黒を連続で0.18秒間以外と認識される、 while内のプログラムは実行されなくなる。
sub FS() { SetSensorLight(S1); int PB = 0; while(PB<180) //PBの値は180となると、while内のプログラミングは実行される { if(SENSOR_1<30)//光の強さは30以下時に左に大きく回る { TLL; PB++; } else if(SENSOR_1<40)//光の強さは30-40間に左に回る { TL; PB = 0; } else if(SENSOR_1<45) // 光の強さは40-45間に前に進む { go; PB = 0; } else if(SENSOR_1<50)//光の強さは45-50間に右に回る { TR; PB = 0; } else { TLR; PB = 0; } Wait(STEP); //PBの値は180以上となると、交差点と認識する、while内のプログラムは実行されなくなる。次の動作は実行される。 } Off(OUT_AC); Wait(1000); go; Wait(200); TR; Wait(100); }
sub DC() { SetSensorLight(S1); long t0 = CurrentTick();//測定時間を初期化 while(CurrentTick()-t0 <= 3000) { if(SENSOR_1<30) //光の強さは30以下時に右に大きく回る { TLR; } else if(SENSOR_1<40) //光の強さは30-40間に右に回る { TR; } else if(SENSOR_1<45) // 光の強さは40-45間に前に進む { go; } else if(SENSOR_1<50) //光の強さは45-50間に左に回る { TL; } else { TLL; } Wait(STEP); }
TLL; Wait(400); go; Wait(300);
sub CB() { SetSensorLight(S1); int PB = 0; while(PB<180) センサーが30以下の値を連続0.18秒以上読み取らなければwhileは実行される { if(SENSOR_1<30) //光の強さは30以下時に左に大きく回る { TLL; PB++; } else if(SENSOR_1<40) //光の強さは30-40間に左に回る { TL; PB = 0; } else if(SENSOR_1<45) // 光の強さは40-45間に前に進む { go; PB = 0; } else if(SENSOR_1<50) //光の強さは45-50間に右に回る { TR; PB = 0; } else { TLR; // 白い部分で右に大きく回る PB = 0; } Wait(STEP); } Off(OUT_AC); TLL2; Wait(100); PB = 0; }
sub BP() {
SetSensorLight(S1); int PB = 0; while(PB<180) { if(SENSOR_1<30) //光の強さは30以下時に左に大きく回る { TLL; PB++; } else if(SENSOR_1<40) //光の強さは30-40間に左に回る { TL; PB = 0; } else if(SENSOR_1<45) // 光の強さは40-45間に前に進む { go; PB = 0; } else if(SENSOR_1<50) //光の強さは45-50間に右に回る { TR; PB = 0; } else // 白い部分で右に大きく回る { TLR; PB = 0; } Wait(STEP); } Off(OUT_AC); 1秒停止 Wait(1000); TLL2; Wait(200); }
sub PQ() {
SetSensorLight(S1); int PB = 0; while(PB<180) { if(SENSOR_1<30) //光の強さは30以下時に左に大きく回る { TLL; PB++; } else if(SENSOR_1<40) //光の強さは30-40間に左に回る
{ TL; PB = 0; } else if(SENSOR_1<45) // 光の強さは40-45間に前に進む { go; PB = 0; } else if(SENSOR_1<50) //光の強さは45-50間に右に回る { TR; PB = 0; } else { TLR; PB = 0; } Wait(STEP); } TR; Wait(600); go; Wait(100); PB = 0; }
sub QREF() {
SetSensorLight(S1); long t0 = CurrentTick(); while(CurrentTick()-t0 <= 15000) { if(SENSOR_1<30) //光の強さは30以下時に左に大きく回る { TLL; } else if(SENSOR_1<40) //光の強さは30-40間に左に回る { TL; } else if(SENSOR_1<45) // 光の強さは40-45間に前に進む { go; } else if(SENSOR_1<50) //光の強さは45-50間に右に回る { TR; } else { TLR; } Wait(STEP); } }
sub EF() {
SetSensorLight(S1); int PB = 0; while(PB<140) { if(SENSOR_1<30) //光の強さは30以下時に左に大きく回る { TLL; PB++; } else if(SENSOR_1<40) //光の強さは30-40間に左に回る { TL; PB = 0; } else if(SENSOR_1<45) // 光の強さは40-45間に前に進む { go; PB = 0; } else if(SENSOR_1<50) //光の強さは45-50間に右に回る { TR; PB = 0; } else { TLR; PB = 0; } Wait(STEP); } Off(OUT_AC); TLL2; Wait(500); PB = 0; }
sub FS() { SetSensorLight(S1); int PB = 0; while(PB<180) { if(SENSOR_1<30) //光の強さは30以下時に左に大きく回る { TLL; PB++; } else if(SENSOR_1<40) //光の強さは30-40間に左に回る { TL; PB = 0; } else if(SENSOR_1<45) // 光の強さは40-45間に前に進む { go; PB = 0; } else if(SENSOR_1<50) //光の強さは45-50間に右に回る { TR; PB = 0; } else { TLR; PB = 0; } Wait(STEP); } Off(OUT_AC); Wait(1000); go; Wait(200); TR; Wait(100); }
sub SS() { SetSensorLight(S1); int PB = 0; while(PB<180) { if(SENSOR_1<30) //光の強さは30以下時に左に大きく回る { TLL; PB++; } else if(SENSOR_1<40) //光の強さは30-40間に左に回る { TL; PB = 0; } else if(SENSOR_1<45) // 光の強さは40-45間に前に進む { go; PB = 0; } else if(SENSOR_1<50) //光の強さは45-50間に右に回る { TR; PB = 0; } else { TLR; PB = 0; } Wait(STEP); } Off(OUT_AC); Wait(1000); go; Wait(200); TR; Wait(100); }
sub SQ() { SetSensorLight(S1); int PB = 0; while(PB<180) { if(SENSOR_1<30) //光の強さは30以下時に左に大きく回る { TLL; PB++; } else if(SENSOR_1<40) //光の強さは30-40間に左に回る { TL; PB = 0; } else if(SENSOR_1<45) // 光の強さは40-45間に前に進む { go; PB = 0; } else if(SENSOR_1<50) //光の強さは45-50間に右に回る { TR; PB = 0; } else { TLR; PB = 0; } Wait(STEP); } Off(OUT_AC); Wait(1000); UP; Wait(400); TLL; Wait(400); PB = 0; }
sub QR() { SetSensorLight(S1); int PB = 0; while(PB<180) { if(SENSOR_1<30) //光の強さは30以下時に左に大きく回る { TLL; PB++; } else if(SENSOR_1<40) //光の強さは30-40間に左に回る { TL; PB = 0; } else if(SENSOR_1<45) // 光の強さは40-45間に前に進む { go; PB = 0; } else if(SENSOR_1<50) //光の強さは45-50間に右に回る { TR; PB = 0; } else { TLR; PB = 0; } Wait(STEP); } go; Wait(300); TLR; Wait(500); }
sub RP() { SetSensorLight(S1); long t0 = CurrentTick(); while(CurrentTick()-t0 <= 4000) { if(SENSOR_1<30) //光の強さは30以下時に左に大きく回る { TLL; } else if(SENSOR_1<40) //光の強さは30-40間に左に回る { TL; } else if(SENSOR_1<45) // 光の強さは40-45間に前に進む { go; } else if(SENSOR_1<50) //光の強さは45-50間に右に回る { TR; } else { TLR; } Wait(STEP); } }
sub PB() { SetSensorLight(S1); int PB = 0; while(PB<180) { if(SENSOR_1<30) //光の強さは30以下時に左に大きく回る { TLL; PB++; } else if(SENSOR_1<40) //光の強さは30-40間に左に回る { TL; PB = 0; } else if(SENSOR_1<45) // 光の強さは40-45間に前に進む { go; PB = 0; } else if(SENSOR_1<50) //光の強さは45-50間に右に回る { TR; PB = 0; } else { TLR; PB = 0; } Wait(STEP); } Off(OUT_AC); Wait(1000); TLL2; Wait(400); }
sub BA() { SetSensorLight(S1); int PB = 0; while(PB<180) { if(SENSOR_1<30) //光の強さは30以下時に左に大きく回る { TLL; PB++; } else if(SENSOR_1<40) //光の強さは30-40間に左に回る { TL; PB = 0; } else if(SENSOR_1<45) // 光の強さは40-45間に前に進む { go; PB = 0; } else if(SENSOR_1<50) //光の強さは45-50間に右に回る { TR; PB = 0; } else { TLR; PB = 0; } Wait(STEP); } go; Wait(400); }
task main()
{ DC(); CB(); BP(); BP(); PQ(); QREF(); EF(); FS(); TR2; SS(); SQ(); QR(); RP(); PB(); BA();
}
ライントレースを完成しましたが、コップを置くことは最後まで行けなかった。
ライントレースを完成した時とてもうれしかったが、コップを置くことは最後まで行けなかったので残念でした、本番の時電池の残量によって交差点を判断できなくなる。次の課題を頑張ります。