課題

黒い線に沿って動き、紙コップを移動させるロボットを製作

Dをスタート➡ Cを直進➡ Bを左折➡ Pを左折(一時停止)➡ Qを直進➡ Rを左折➡ Fを左折➡ Sを直進(一時停止)➡ Y地点の紙コップを取得してコースに戻る➡ Sを直進(一時停止)➡ Qを左折(一時停止)➡ Rを直進➡ X地点に紙コップを置いてコースに戻る➡ Pを左折➡ B を左折(一時停止)➡ A地点へ(ゴール)

16.7kb

ロボットの本体説明

 コップを取る部分とセンサ。一つのモーターはコップを取る部分の昇降をコントロールする。写真の赤丸で囲ってあるものが光センサになります。光センサは、ライントレースする際に白か黒(明暗)かの判断をするためにあります。光センサーと紙を平行にする。そうすることで、光センサの判断がされてからすぐにモーターが動き、誤動作が少なくなると考えたからです。

全体の部分

82.8kb

側面図

17.2kb

正面図

47.0kb

センサーとコップをとる部分

センサーの位置をできるだけ前輪の車軸の近くにすることで急カーブでもスムーズに動作するロボットを作ることができた

177.8kb

コップをX点に置く時に、赤い部分は上がるとコップを前に押す。

197.1kb

プログラミングの全体説明

光の強さによって五段階に分かれる
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秒ごとに実行する

交差点の判別

5.9kb
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);
}

ライントレースのプログラム

DC間のプログラミング

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);
14.2kb

CB間のプログラミング

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間のプログラミング

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間のプログラミング

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間のプログラミング

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間のプログラミング

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間のプログラミング

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間のプログラミング

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間のプログラミング

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間のプログラミング

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間のプログラミング

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間のプログラミング

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間のプログラミング

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

 task main()

{
DC();
CB();
BP();
BP();
PQ();
QREF();
EF();
FS();
TR2;
SS();
SQ();
QR();
RP();
PB();
BA();

}

結果

ライントレースを完成しましたが、コップを置くことは最後まで行けなかった。

感想

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


添付ファイル: file9.png 203件 [詳細] file8.jpg 177件 [詳細] file6.png 196件 [詳細] file24.png 195件 [詳細] file23.jpg 219件 [詳細] file22.jpg 177件 [詳細] file20.jpg 220件 [詳細] file21.jpg 262件 [詳細] file16.png 173件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-02-10 (土) 23:57:49