[[2015b/Member]]
目次
#contents

*課題内容 [#w3767585]
・ライントレースカーの作成
#ref(./2015b-mission2.png,60%)
上の図が課題のコースです。

私は、A地点からB地点へ行くプログラムを作成しました。具体的には、A地点→P直進→Q直進→Q右折→P右折→Q左折→P左折→B地点の順です。

*ロボット本体 [#f282aa06]
&ref(./robo.png,40%);
&ref(./robo1.png,34%);

上の写真がロボットの全体です。赤い丸が付いているのが光センサーです。今回の課題はラインに沿て走行するものです。なので、光センサーを使用しました。光センサーは自ら光を出し、光量の測定もします。黒と白では反射する光量が異なります。それにより、線上か否かを判断します。




*プログラム [#z455f13e]
 #define go(p) Off(OUT_BC);OnFwd(OUT_BC,p);
 #define right(p,P) Off(OUT_BC);OnFwd(OUT_C,p);OnFwd(OUT_B,P);
 #define left(p,P) Off(OUT_BC);OnFwd(OUT_B,p);OnFwd(OUT_C,P);
 #define THE 53
 #define tmax 115
 #define Mu PlaySound(SOUND_CLICK);
同じ動作が多いため先にマクロで定義しました。光量の中間値は、黒と白の光量を調べその中間値を定義しました。音は、交差点をしっかり判断しているか調べるために定義しました。
 #define go(p) Off(OUT_BC);OnFwd(OUT_BC,p);                    //前進
 #define right(p,P) Off(OUT_BC);OnFwd(OUT_C,p);OnFwd(OUT_B,P); //右移動
 #define left(p,P) Off(OUT_BC);OnFwd(OUT_B,p);OnFwd(OUT_C,P);  //左移動
 #define THE 53                        //光量の中間値
 #define tmax 115                       //交差点の判断
 #define Mu PlaySound(SOUND_CLICK);              //音
 
・交差点でない場合のプログラム
 task main()
 {
 SetSensorLight(S1);
 long t0=0,t=0;
 int c=0,x=0,y=0;
 t0=CurrentTick();
 t=CurrentTick();
 while(true){
  while(CurrentTick()-t0<tmax){
 if(SENSOR_1<THE){
    if(SENSOR_1>35){
 SetSensorLight(S1);       //光センサー
 long t0=0,t=0;         //変数の宣言と初期化
 int c=0,x=0,y=0;             
 t0=CurrentTick();        
 t=CurrentTick();                
 while(true){          //繰り返し
  while(CurrentTick()-t0<tmax){ //交差点か否かの判断
 if(SENSOR_1<THE){        //黒の場合
    if(SENSOR_1>35){         //白よりの黒の場合
	left(45,10);
	t0=CurrentTick();}
    else if(SENSOR_1<35){
	left(35,-40);
	t0=CurrentTick();}    //交差点でないため時間(t0)を初期化
    else if(SENSOR_1<35){      //最も黒い場合
	left(35,-40);       
	}
	}
 else if(SENSOR_1>THE){
    if(SENSOR_1<65){
 else if(SENSOR_1>THE){          //白の場合
    if(SENSOR_1<65){         //黒よりの白の場合
	right(45,10);
	t0=CurrentTick();}
    else if(SENSOR_1>65){
    else if(SENSOR_1>65){      //最も白い場合
	right(40,-40);
	t0=CurrentTick();}
    else{
	go(50);t0=CurrentTick();}
	go(50);t0=CurrentTick();} //中間値の場合
	}}
	if(c<=1){  

・交差点かどうか判断するプログラム
	if(c<=1){                               //交差点を直進
	Mu;Off(OUT_BC);Wait(1000);right(30,50);
	Wait(300);c++;x++;y++;t0=CurrentTick();,t=CurrentTick();}
	else if(x==2&&CurrentTick()-t>6500){
タイマーも条件式に加えている理由は、コースがあまりきれいに描けなかったので円の中で交差点の処理を時々してしまうためです。上のプログラムで時間(t)を初期化しているのは、円の中を走行する時間をはかだけにすることで、設定が容易になるからです。
	else if(x==2&&CurrentTick()-t>6500){  //交差点を右折 1回目
	Mu;Off(OUT_BC);Wait(1000);right(40,-50);
	Wait(300);go(30);
	Wait(500);x++;y++;t0=CurrentTick();}
	else if(y==3){
	else if(y==3){             //交差点を右折 2回目
	Mu;Off(OUT_BC);Wait(1000);right(50,-20);Wait(400);go(30);
	Wait(500);y++;t0=CurrentTick();}
上のプログラムだけでは、最後の交差点Pを判断しないのでPを交差点だと処理させるプログラム。
	else if(y==4&&CurrentTick()-t>20000){Mu;Off(OUT_BC);
	Wait(1000);t0=CurrentTick();y++;}
	else{t0=CurrentTick();}
交差点だと判断しないプログラム
	else{t0=CurrentTick();}         
 }}

*反省・感想 [#n1d85cd1]
工夫点としては、円の中などの交差点以外の急な曲がり角で交差点の処理をさせないためにタイマーを利用したことや、回転の移動で左右のタイヤを一文で処理させることにより柔軟性を持たせたことです。

反省点は、帰ってくるときのQを交差点として判断できなかったことです。Qの交差点は曲がりが急ではないので交差点の処理ができなかったと考えています。

今回の課題は書道ロボットと違いロボット自身が判断するプログラムを作らなければいけないためとても大変でした。更に、書道ロボットはロボットのできでもプログラムを安易にできました。私は機械関係なので主に機器を作る側になると思います。なので、できる限りプログラムを安易にできるような機器を作るよう心掛けていきたいです。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS