マイクロマウス製作六十四日目


こんにちは~

一晩中扇風機を付けっぱなしにして寝ていたら、ちょっと喉を痛めてしまったようです…。
クーラーか、扇風機か…どちらが快適なんでしょう~。

今日も昨日に引き続き、壁切れ補正のプログラムを書いて試していきます。
※Straight_for_fast全文→こちら
 昨日のブログ→こちら

昨日と違うところ…それは、のり先生の手を離れたところです!!
だんだんPi:Co Classicが走る仕組み(モータの特性などはまだわからないことが多いのですが、ステップ数=距離といったイメージはつかめている感じ!)は理解してきたので、
基本的にひとりで目標に向かって試行錯誤して、本を読んでもわからないところをのり先生に聞く、というステップに入りました~!
ちょっと独り立ちですw

前回のブログで、最短走行の「行き」はうまく壁切れを補正をして走ったのに、
帰り道の「2区画以上左折時」に、「最低速度で律儀に走る」モードに入ってしまいました…。

それを克服するために、以下のようなプログラムを書いてみました。


//最短走行時の超信地旋回前壁切れ補正

if(len < SECTION*2) //2区画以上走る場合
{
   while(len - STEP2LEN(step_r + step_l) > SECTION*1); //停止する1区間前まで走る

   if(sen_r.is_wall == true)//右壁がある場合
   {
     step_r = step_l = 0; //ステップ数カウントのリセット
     while((step_r + step_l) < LEN2STEP(len_remains)); //あと走るべき距離走る

  }
  else if(sen_l.is_wall == true)//左壁がある場合
  {
   step_r = step_l = 0;//ステップ数カウントのリセット
   while((step_r + step_l) < LEN2STEP(len_remains)); //あと走るべき距離走る
  }

}

else
{
 while((step_r + step_l) < obj_step); //目標地点まで走行
}

MTU2.TSTR.BIT.CST3 = 0; //モータのカウントをストップ
MTU2.TSTR.BIT.CST4 = 0; //モータのカウントをストップ

}

「else if」を使って、左壁がある場合の処理も足してあげてみた次第です。

すると、こうなりました。

大成功!!
松崎は「else if」を覚えたw

そこでのり先生に自慢しに行ったところ…
のり先生「壁があればこれでいいけど、もし柱しかなかったら…?」といわれてしまいました!

いろいろな場合を考えていかなる状況でも確実に動作するプログラムを作らなければならない。。。ということで、
こんな風に修整してみました。

	//最短走行時の超信地旋回前壁切れ補正
	
	if(len > SECTION*2)							//2区画以上走る場合

	{
		while(len - STEP2LEN(step_r + step_l) > SECTION*1);			//停止する1区間前まで走る
		
		if(sen_r.is_wall == true)									//右壁がある場合
		{
			step_r = step_l = 0;									//ステップ数カウントのリセット
			while((step_r + step_l) < LEN2STEP(len_remains));		//あと走るべき距離走る
		}
		else if(sen_l.is_wall == true)								//左壁がある場合
		{
			step_r = step_l = 0;
			while((step_r + step_l) < LEN2STEP(len_remains));		//あと走るべき距離走る		
		}
		
		else
		{
			while(len - STEP2LEN(step_r + step_l) == SECTION*1);       //あと走るべき距離走る
			
			MTU2.TSTR.BIT.CST3 = 0;							//モータのカウントをストップ
			MTU2.TSTR.BIT.CST4 = 0;							//モータのカウントをストップ
		}
			
	}
			
	else												//2区画以内しか走らない場合
	{
		while((step_r + step_l) < obj_step);			//目標地点まで走行
	
	}
	
	MTU2.TSTR.BIT.CST3 = 0;							//モータのカウントをストップ
	MTU2.TSTR.BIT.CST4 = 0;							//モータのカウントをストップ
	
}

このプログラムで試走したらこんな感じになりました。

まだうまく走らないな~~う~~んなどなどとやっておりましたら、
さきほど、今日のブログの今までの展開を覆す事実が発覚!!!!!!!!!!

のり先生の手を離れたとたんに、松崎はいそいそとプログラムを書き換え、
昨日の変な動きをプログラムで回避したものの、
なんと!

壁切れさえもなくしてしまっていたのでしたw

最初にコピペしたプログラムをご覧ください…。
昨日まではwhile文で一定位置まで走って、壁切れを読んでからさらに一定区間走るという方法で壁切れ補正をしました。
(右に壁があるうちは走って、なくなったところをきっかけに…という感じ。まさに壁切れ。)
今日はそのwhile文をif文にしてしまったので、壁切れ補正ではなくなっちゃったのです…(;_;)
(もし右壁があったら…なので、壁の切れ目は見ていない!)

独り立ち一日目にしてミスorz
のり先生に爆笑された…orz

うーん…。
なかなか満足のいくプログラムを書くことは難しいですね。
一見うまくいっているように見えても、実は意図の通り制御できていないということもあるのね、、と勉強になりますw
ありとあらゆる場合を想定して、
また、目に見えるマウスの動きだけではなく、
実際にどのようにプログラムが走ってそのような動きをしているのかをちゃんと理解してあげることが大切ですね。

しかし、書いたプログラムが「走り」としてすぐに確認できるのはとても楽しいw
書き換えて、ビルドしてエラー0のたびにニヤリ、走らせて思惑通り走るたびにニヤリw

9月にはマウスハッカソンが行われますが、
みなさんどのようにソフトを変えて、それでPi:Co Classicがどういう走りになるのか、とても楽しみです♪


Posted in Report on the assembly of Pi:Co Classic