#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]
ライントレースを完成した時とてもうれしかったが、コップを置くことは最後まで行けなかったので残念でした、本番の時電池の残量によって交差点を判断できなくなる。次の課題を頑張ります。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS