2019a/Member

目次

課題2

詳しくは2019a/Mission2を参照.

2019a-mission2.png 私はA→B→C→D→E→F→G→H→I→J→K→L→K→Mの道を行く.

ロボットの説明

DSC_1009.JPG DSC_1021.JPG DSC_1007.JPG

このように取り付けられたアームで,ピンポン玉を捕まえて引きずっていく.モーターと直接つながっていて,「OnFwd」「OnRev」で簡単に上下を行う.

DSC_1006.JPG なるべくRIS本体に近い位置に光センサーを取り付けた.

DSC_1016.JPG DSC_1017.JPG

ロボット本体は,説明書に載っていたものをもとに,ブロックを駆使して少し小型化した.

プログラムの説明

光センサーは2の部分に取り付けた.

連続して黒になる時間の計り方

光センサーとFastTimerを用いる.光センサーが黒を感知している間はタイマーが作動,白を感知している間は常にタイマーをリセットする.そのため連続して黒を感知するときにタイマーが作動し続ける.これは交差点を判断する際に用いる.

2019a-mission2(1).png

画像の青い線で囲まれた部分が「連続して黒になる」ところ.

サブルーチン

#define black 37
#define turn_time 67

blackの値より大きいときは白を,小さいときは黒を見ているという判断をさせる.

sub catch_pinponball()
{
	OnFwd(OUT_B);Wait(25);
	Off(OUT_B);
} 
 
 
  
sub release_pinponball()
{
	OnRev(OUT_B);Wait(25);
	Off(OUT_B);
}

「catch」でアームを下げ,「release」でアームを上げるようになっている.

sub intersection_stop_leftside()             	//線の左側をトレース//
{    
    ClearTimer(0);                                                
	while(FastTimer(0)<30)                       //タイマーの作動時間は0.3秒間//
	{

	if (SENSOR_2 > black)                          //白を見ている場合//
	{ OnFwd(OUT_A);Off(OUT_C);ClearTimer(0); }    //左側へ移動&タイマーをリセットする//


	else if (SENSOR_2 < black)                 //黒を見ている場合//
	{ OnFwd(OUT_C);Off(OUT_A); }               //右側へ移動&タイマーが作動中のため規定時間以上黒をトレースするとプログラムが終了//


	}

	Off(OUT_AC);
} 



sub intersection_stop_rightside()         	//線の右側をトレース//
{  
     ClearTimer(0);
	while(FastTimer(0)<30)                  //タイマーの作動時間は0.3秒間//
	{

	if (SENSOR_2 > black)                   //白を見ている場合//
	{ OnFwd(OUT_C);Off(OUT_A);ClearTimer(0); }         //右側へ移動&タイマーをリセットする//


	else if (SENSOR_2 < black)           //黒を見ている場合//
	{ OnFwd(OUT_A);Off(OUT_C); }          //左側へ移動&タイマーが作動中のため規定時間以上黒をトレースするとプログラムが終了//


	}

	Off(OUT_AC);
}

「intersection_stop_○○side」で,線の○○側をトレースする.「連続して黒になる時間」が規定時間以上になると,交差点にいるとみなしプログラムが終了,ロボットが停止する.

sub corner_stop()   	
{ 
	ClearTimer(0);
	while(FastTimer(0) < 63)               //タイマーの作動時間は0.63秒//
	{
 	if(SENSOR_2 < black)                     //黒を見ているとき//
  	{ OnFwd(OUT_C);Off(OUT_A);ClearTimer(0); }     //右側へ移動&タイマーをリセット//
	 
 	else if(SENSOR_2 > black)                 //白を見ているときは//
  	{ OnFwd(OUT_A);Off(OUT_C);}               //左側へ移動&タイマーが作動中のため規定時間以上白を感知するとプログラムが終了//
	}

	Off(OUT_AC);//Wait(100);//

	while(SENSOR_2 > black)
	{ OnFwd(OUT_A);OnRev(OUT_C); }

	Off(OUT_AC);//Wait(100);//

} 

E,F点を上手く曲がるためのサブルーチンである.ライントレースとは反対に,連続して白になる時間が規定時間以上になるとプログラムが終了し,ロボットが停止するようになっている.連続して白になる時間の計り方は,前述の「連続して黒になる時間の計り方」の黒と白を入れ替えたものとなっている.

sub pass_intersection()        	//黒を見ている間は//
{
	while(SENSOR_2 < black)
	{ OnFwd(OUT_AC); }
}

交差点で停止した後,その交差点を突破するためのサブルーチンである.黒を感知している間は直進するようになっている.

sub goto_pinponball()
{
	ClearTimer(1);
	FastTimer(1);

	while(FastTimer(1)<150)
	{
 	if(SENSOR_2<black)
  	{ OnFwd(OUT_C);Off(OUT_A);}
 	else
  	{ OnFwd(OUT_A);Off(OUT_C);}
	}


	Off(OUT_AC);

}

K点からL点まで行くためのサブルーチンである.1.5秒間ライントレースするようになっている.

メインプログラム

task main()
{ 
	SetSensor(SENSOR_2,SENSOR_LIGHT);
	ClearTimer(0);
	FastTimer(0);

	intersection_stop_leftside();    	//A→→D点で停止//
	Wait(100);
	pass_intersection();            	//D点通過//
	corner_stop();          	//D→E点を右折//
	corner_stop();                  //E→F点を右折//
	intersection_stop_leftside();   //F→G点で停止//
    
                                  	//円に差し掛かる//

	OnFwd(OUT_A);OnRev(OUT_C);   //(turn_time)秒間時計回りで向きを調整//
	Wait(turn_time);

	repeat(2)
	{
	intersection_stop_rightside();
	pass_intersection();
	}                            	//H点、I点通過//

    
	intersection_stop_rightside();   //J点でストップ//
	pass_intersection();         	//向きを調整//    
	intersection_stop_leftside();  	//J→K点で停止// 


	Off(OUT_AC);Wait(10);

	OnFwd(OUT_C);OnRev(OUT_A);      //反時計回りで向きを調整//
	Wait(55);                                         	 
       	 
	ClearTimer(0);
	goto_pinponball();        	//K→L点で停止//
	Wait(100);
	catch_pinponball();Wait(100);       	//ここでピンポン玉キャッチ//

	OnFwd(OUT_C);OnRev(OUT_A);Wait(190);  	//反転//

	Off(OUT_AC);Wait(50);       	//ここまでOK!!!!!//

	intersection_stop_rightside();      //L→K点で停止//
	pass_intersection();           	   //K点突破//
    
	intersection_stop_rightside();  	
	pass_intersection();                //ここの3行でK→M点で停止//
	intersection_stop_leftside();    

	release_pinponball();          	//ピンポン玉シュート//
	OnFwd(OUT_AC);Wait(80);          	//ここでゴール//
       	 
	Off(OUT_AC);
        
      
}

まとめ

予定より時間がかかったが,有用なサブルーチンを作ることができたので,課題1より苦労はなかった.しかし,数回に1回,全く予期していない動きをすることがあった.現時点で原因はわからないが,成功率を上げるためにも解決したい.


添付ファイル: file2019a-mission2(1).png 2件 [詳細] file2019a-mission2.png 6件 [詳細] fileDSC_1017.JPG 7件 [詳細] fileDSC_1016.JPG 5件 [詳細] fileDSC_1006.JPG 6件 [詳細] fileDSC_1007.JPG 8件 [詳細] fileDSC_1021.JPG 6件 [詳細] fileDSC_1009.JPG 8件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-08-13 (火) 00:56:34 (12d)