2018b/Member

課題2

課題2のコース file?plugin=attach&pcmd=open&file=2018b-mission2.png&refer=2018b%2FMember%2Fyuto%2FMission2

このコースで、次のルートを通る

   ロボットを正方形X内におき、Lをスタート
   Eを一時停止して直進
   Iを一時停止して左折
   Hを直進
   Kを直進
   Jを左折
   Cを一時停止して右折
   Eを一時停止して直進
   Gを一時停止して直進
   長方形X内に入って停止

ロボットの概要

S__232890381.jpg

今回はこちらのロボットを作った。

光センサー

S__232890383.jpg

光センサーを使って線の濃さを見分ける

超音波センサー

S__232890382.jpg

超音波センサーを使って缶との距離を測る

ボールを当てる機能

S__232890384.jpg

ボールは転がして落とすことで当てるようにした

プログラミング

ロボットを動かすためのプログラミングを作る。まずおおもとの定義を

#define migi0 OnFwd(OUT_A,15);OnRev(OUT_C,10);//右旋回 
#define migi1 OnFwd(OUT_A,15);Off(OUT_C);//右曲がり 
#define hidari0 OnFwd(OUT_C,15);OnRev(OUT_A,10);//左曲がり 
#define hidari1 OnFwd(OUT_C,15);Off(OUT_A);//左旋回 
#define middle 48//光の値の中心 
#define go(time) OnFwd(OUT_AC,15);Wait(time);Off(OUT_AC);//前に進む 
#define back(time) OnRev(OUT_AC,15);Wait(time);Off(OUT_AC);//後ろに進む 
#define LEFT(angle) OnFwd(OUT_C,15);OnRev(OUT_A,10);Wait(angle);Off(OUT_AC);//左に曲がる 
#define RIGHT(angle) OnFwd(OUT_A,15);OnRev(OUT_C,10);Wait(angle);Off(OUT_AC);//右に曲がる

まず、通常のラインを進んでいくプログラミングは

sub Line()
{
SetSensorLight(S1);
long t0=CurrentTick();
while(CurrentTick()-t0<=28) 
	{
	if(SENSOR_1>middle+8)//光センサーの値が56より大きければ
		{
		migi0;//右旋回
		t0=CurrentTick();
		}
	else if(SENSOR_1>middle+4)//52より大きければ
		{
		migi1;右へ曲がる
		t0=CurrentTick();
		}
	else if(SENSOR_1>middle)//48より大きければ
		{
		OnFwd(OUT_AC,30);//直進
		t0=CurrentTick();
               }
	else if(SENSOR_1>middle-4)//44より大きければ
		{
		hidari0;//左へ曲がる
		t0=CurrentTick();
		}
	else
		{
		hidari1;//左旋回
             t0=CurrentTick();
		}
	}
Off(OUT_AC); 
}

なお、全てにおいてCurrentTick();が入っているのは、そこでタイムをリセットするためである つぎに、1つだけある急カーブのために、ある一定時間は曲がらないプログラムを作る。

sub Line2() 
{
SetSensorLight(S1);
long t0=CurrentTick();
while(CurrentTick()-t0<=2500)
	{
	if(SENSOR_1>middle+8)
		{
		migi0;
		}
	else if(SENSOR_1>middle+4)
		{
		migi1;
		}
	else if(SENSOR_1>middle)
		{
		OnFwd(OUT_AC,30); 
		}
	else if(SENSOR_1>middle-4)
		{
		hidari0;
               }
	else
		{
		hidari1;
		}
	}
Off(OUT_AC);
}

次は、空き缶を見つけるためのプログラムである

void mitsukeru()
{
  ResetTachoCount(OUT_ABC);
  OnFwd(OUT_A,50);
  OnRev(OUT_C,50);
  SetSensorLowspeed(S4);            
  int d1;
  d1=1000;//仮の最小値  
  long t0=CurrentTick();
  long t1=CurrentTick();
  long t2=CurrentTick();
  while(t2-t0<=3570){
      t2=CurrentTick();
      if(SensorUS(S4)<d1){
          d1=SensorUS(S4);//最小値より小さい値が出た時、そこを新しい最小値とする
          t1=CurrentTick();//時間をリセットする
      }
      t2=CurrentTick();
  }
  t0=CurrentTick();
  Off(OUT_AC);
  OnFwd(OUT_C,50);
  OnRev(OUT_A,50);
  Wait(t0-t1);//最後に、最小値をとった場所まで回る
}

これらをすべて合わせたプログラミングがこちらである

task main()
{
Line();//AからB
RIGHT(15);//Bを右折
Line();//BからK
Wait(1000);//一時停止
LEFT(15);//Kを左折
Line();//KからJ
go(50);//微調節
Line();//KからJ
go(100);//微調節
mitsukeru();//缶を探す
OnFwd(OUT_B,30);//缶を落とす
Wait(2000);
Off(OUT_B);
Line();//JからI
go(50)//微調節
Line();//IからH
LEFT(15);//左に曲がる
Line();//HからG
Wait(1000);//一時停止
LEFT(15);//Gで左折
Line2();//ある場所まで進み続ける
Line();//そこからEmまで
Wait(1000);//一時停止
RIGHT(15);//Eを曲がる
Line();//Lまで行く
go(100);//ゴールに入る
Off(OUT_BC);// 
}

感想と考察

・道を走るだけでこんなにも難しいものだと知った ・自動運転の技術は本当にすごいんだなと思った ・前回の反省を生かし、しっかりと短めで終わらせた ・次回はもっと工夫したプログラミングを作りたい


添付ファイル: fileS__232890384.jpg 1件 [詳細] fileS__232890382.jpg [詳細] fileS__232890383.jpg 1件 [詳細] fileS__232890381.jpg 2件 [詳細] fileaaa.png [詳細] file2018b-mission2.png 2件 [詳細] file課題2のコース.desktop 2件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-01-12 (土) 18:35:30 (3d)