#contents *課題 [#i22953a3] 黒い線に沿って動き、紙コップを移動させるロボットを製作 Dをスタート➡ Cを直進➡ Bを左折➡ Pを左折(一時停止)➡ Qを直進➡ Rを左折➡ Fを左折➡ Sを直進(一時停止)➡ Y地点の紙コップを取得してコースに戻る➡ Sを直進(一時停止)➡ Qを左折(一時停止)➡ Rを直進➡ X地点に紙コップを置いてコースに戻る➡ Pを左折➡ B を左折(一時停止)➡ A地点へ(ゴール) #ref(2017b/Member/yan/Mission2/16.png,16.7kb) *ロボットの本体説明 [#m0cc17e8] コップを取る部分とセンサ。一つのモーターはコップを取る部分の昇降をコントロールする。写真の赤丸で囲ってあるものが光センサになります。光センサは、ライントレースする際に白か黒(明暗)かの判断をするためにあります。光センサーと紙を平行にする。そうすることで、光センサの判断がされてからすぐにモーターが動き、誤動作が少なくなると考えたからです。 *全体の部分 [#mc185717] #ref(2017b/Member/yan/Mission2/23.jpg,82.8kb) 側面図 #ref(2017b/Member/yan/Mission2/8.jpg,17.2kb) 正面図 #ref(2017b/Member/yan/Mission2/9.png,47.0kb) *センサーとコップをとる部分[#i673c9bc] センサーの位置をできるだけ前輪の車軸の近くにすることで急カーブでもスムーズに動作するロボットを作ることができた #ref(2017b/Member/yan/Mission2/20.jpg,177.8kb) *コップをX点に置く時に、赤い部分は上がるとコップを前に押す。 [#c159a37d] #ref(2017b/Member/yan/Mission2/21.jpg,197.1kb) *プログラミングの全体説明 [#e0a273b4] 光の強さによって五段階に分かれる #ref(2017b/Member/yan/Mission2/6.png,26.1kb) 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秒ごとに実行する * 交差点の判別 [#o850eacb] #ref(2017b/Member/yan/Mission2/24.png,5.9kb) 「PB」の値は線の中央の濃い黒を連続で認識できる時間である。 PBの値は線の中央の濃い黒を連続で認識できる時間である。 PBの値は180より小さいの場合、濃い黒を連続で0.18秒間以内と認識される、 while内のプログラムは実行される。濃い黒を連続で0.18秒間以外と認識される、 while内のプログラムは実行されなくなる。 *例えば [#d63f624e] 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); } *ライントレースのプログラム [#cf080611] *DC間のプログラミング [#r861e643] 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); } *右の線から左の線に移動 [#sbfd5be1] TLL; Wait(400); go; Wait(300); #ref(2017b/Member/yan/Mission2/22.jpg,14.2kb) *CB間のプログラミング [#l53443e4] 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; } *BP間のプログラミング [#a432d379] 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); } *PQ間のプログラミング [#j6bb6b1c] 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; } *QREF間のプログラミング [#u0328929] 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); } } *EF間のプログラミング [#p4718f6b] 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; } *FS間のプログラミング [#mf169723] 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); } *SS間のプログラミング [#za8830df] 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); } *SQ間のプログラミング [#bf26a6f9] 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; } *QR間のプログラミング [#xb29a5a4] 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); } *RP間のプログラミング [#ib94a851] 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); } } *PB間のプログラミング [#yef0155f] 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); } *BA間のプログラミング [#ie9b5d28] 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 mian [#c3c5a1c0] task main() { DC(); CB(); BP(); BP(); PQ(); QREF(); EF(); FS(); TR2; SS(); SQ(); QR(); RP(); PB(); BA(); } *結果 [#h52f0df7] ライントレースを完成しましたが、コップを置くことは最後まで行けなかった。 *感想 [#w69168a0] ライントレースを完成した時とてもうれしかったが、コップを置くことは最後まで行けなかったので残念でした、本番の時電池の残量によって交差点を判断できなくなる。次の課題を頑張ります。