ページ 11

ライントレースできません

Posted: 2011年7月14日(木) 09:59
by
C言語でライントレースをしたいのですが、黒のライン上をうまく走りません
センサは1つです

Re: ライントレースできません

Posted: 2011年7月14日(木) 10:15
by softya(ソフト屋)
あ さんが書きました:C言語でライントレースをしたいのですが、黒のライン上をうまく走りません
センサは1つです
それだけだと、さっぱり分かりません。
一言で言えば「バグです」としか応えられないわけです。

ソースコードや使っているマイコン、開発環境、ライントレースロボットの名前(ホームページ)など詳細な情報が欲しいです。

あと、なるべくちゃんとした名前をつけてくださいね。

Re: ライントレースできません

Posted: 2011年7月14日(木) 10:23
by
すいません。急いでるので・・・

codeタグを追加しました。 by softya(ソフト屋)

コード:

#include "kernel.h"
#include "kernel_id.h"
#include "ecrobot_interface.h"

#define LIGHT  520

/* OSEK 宣言文 */
/* Declare:宣言 */
DeclareCounter(SysTimerCnt);
DeclareTask(TaskLCD);

/* LEJOS OSEK hooks */
/* OSEK起動時に行う動作 */
void ecrobot_device_initialize()
{
	nxt_motor_set_speed(NXT_PORT_A, 0, 1);
	nxt_motor_set_speed(NXT_PORT_B, 0, 1);
	ecrobot_set_light_sensor_active(NXT_PORT_S1);
	
}

/* RAN→STOP時に行う動作 */
void ecrobot_device_terminate()
{
	nxt_motor_set_speed(NXT_PORT_A, 0, 1);
	nxt_motor_set_speed(NXT_PORT_B, 0, 1);
}

/* LEJOS OSEK hook to be invoked from an ISR in category 2 */
/* 1m秒ごとの割り込み処理 */
void user_1ms_isr_type2(void)
{
	StatusType ercd;

	ercd = SignalCounter(SysTimerCnt); /* Increment OSEK Alarm Counter */
	if(ercd != E_OK)
	{
		ShutdownOS(ercd);
	}
}


/*↓*↓*↓*↓*↓*修正を加えるのは以下↓*↓*↓*↓*↓*/


	
		



void STEP1();
void STEP2();
void STEP3();
void STEP4();
void STEP5();


int step=1;

/* TaskLCD executed every 1msec */
TASK(TaskLCD)
{

	// ステップで処理を分ける
	switch(step)
	{
	case 1:
		STEP1();
		break;
		
	case 2:
		STEP2();
		break;
		
	case 3:
		STEP3();
		break;
		
		
	case 4:
		STEP4();
		break;
			
	case 5:
		STEP5();
		break;
		
		
	}
	
	/* タスクの終了 */
	TerminateTask();
} 

void STEP1()
{
	if (ecrobot_get_light_sensor(NXT_PORT_S1)<=520)
	{
	nxt_motor_set_speed(NXT_PORT_A, 30, 1);
		nxt_motor_set_speed(NXT_PORT_C, 30, 1);
	}
	else 
	{nxt_motor_set_speed(NXT_PORT_A, 30, 1);
		nxt_motor_set_speed(NXT_PORT_C, -30, 1);
	}
	// 最初の動き

	// 最初の動きが終わったら
	// 
	// {
		// 	step =3 ;
	// }
}




void STEP2()
	{  if(ecrobot_get_light_sensor(NXT_PORT_S1)<=520)
		{	nxt_motor_set_speed(NXT_PORT_A,-30, 1);
		nxt_motor_set_speed(NXT_PORT_C, -30, 1);
		}
	else 
	{nxt_motor_set_speed(NXT_PORT_A, -30, 1);
		nxt_motor_set_speed(NXT_PORT_C, 30, 1);
	}
	 
	 //if (ecrobot_get_light_sensor(NXT_PORT_S1)>=520)
      // {
	 //	step = 4;
	// }
		
}
	
void STEP3()
	{  if(ecrobot_get_light_sensor(NXT_PORT_S1)<=520)
		{
	
	nxt_motor_set_speed(NXT_PORT_A, 30, 1);
	nxt_motor_set_speed(NXT_PORT_C, -30, 1);
		}
		else 
	{nxt_motor_set_speed(NXT_PORT_A, 30, 1);
		nxt_motor_set_speed(NXT_PORT_C, -30, 1);
	}
		// 2個目の動き

	// 2個目の動きが終わったら
	// if (systick_wait_ms(2000))
	// {
	// 	step = 2;
	// }
}
	
void STEP4()
{      if(ecrobot_get_light_sensor(NXT_PORT_S1)<=520)
	{
	nxt_motor_set_speed(NXT_PORT_A, 30, 1);
		nxt_motor_set_speed(NXT_PORT_C, 30, 1);
	}
	
	
	else 
	{nxt_motor_set_speed(NXT_PORT_A, 30, 1);
		nxt_motor_set_speed(NXT_PORT_C, -30, 1);
	}//4個目の動き

		 // 4個目の動きが終わったら
		 // if (ecrobot_get_light_sensor(NXT_PORT_S1)>=520)
		 // {
		// 	step = 5 ;
		 //}
}

void STEP5()
{
	if(ecrobot_get_light_sensor(NXT_PORT_S1)<=520)
	{nxt_motor_set_speed(NXT_PORT_A, 30, 1);
		nxt_motor_set_speed(NXT_PORT_C, -30, 1);
	}
	else 
	{nxt_motor_set_speed(NXT_PORT_A, 30, 1);
		nxt_motor_set_speed(NXT_PORT_C, -30, 1);
	// if (ecrobot_get_light_sensor(NXT_PORT_S1_)>=520)
	// {
	//	step = 1 ;
 //}
}
}




おねがいします。
ロボットはLEGOです。

白に十字型黒のラインです

Re: ライントレースできません

Posted: 2011年7月14日(木) 10:53
by
前進、回転、バック、前進、右折、反転、前進、回転、バック
を繰り返したいのですが・・・・・。
永遠回転したり脱線します。

Re: ライントレースできません

Posted: 2011年7月14日(木) 10:55
by softya(ソフト屋)
急がれているようですが、締切りは何時ですか?
あとLEGOは未経験なので、お答えできるか自信はありません。
資料サイトなど有ったら教えてください。

Re: ライントレースできません

Posted: 2011年7月14日(木) 11:05
by softya(ソフト屋)
数々の疑問が、

まず、
ecrobot_get_light_sensor(NXT_PORT_S1)<=520)
だと線を外れた事になるのでしょうか?

それと、これはモーターを回転させるんだと思いますが引数を説明してください。
nxt_motor_set_speed(NXT_PORT_A, 30, 1);
nxt_motor_set_speed(NXT_PORT_C, 30, 1);
A・Cが外部の何に接続されているかも教えてください。

Re: ライントレースできません

Posted: 2011年7月14日(木) 11:37
by non
期限があると言うことは、学校の課題でしょうに。
なぜ、わからないことを先生に聞けないのでしょうか?

>ecrobot_get_light_sensor(NXT_PORT_S1)<=520)
>だと線を外れた事になるのでしょうか?

反射した明かりが明るいか暗いかを数値で返しているのですね。
白か黒かの閾値を520に先生の経験から設定したのでしょう。
#define LIGHT 520
と定義されてますから、直接520と書かずに、LIGHTと書くべきでしょう。

>これはモーターを回転させるんだと思いますが引数を説明してください。
>nxt_motor_set_speed(NXT_PORT_A, 30, 1);
>nxt_motor_set_speed(NXT_PORT_C, 30, 1);

各ポートに繋がれているモータを30のパワーで回そうとしています。最後の1はブレーキですから、
ブレーキをかけて、アクセルを踏んでいる状態ですね。


>A・Cが外部の何に接続されているかも教えてください。
そんなの、私たちがわかるわけがない。組み立てた本人がわからないのに。

Re: ライントレースできません

Posted: 2011年7月14日(木) 11:40
by softya(ソフト屋)
nonさん、相手を間違えてません?

Re: ライントレースできません

Posted: 2011年7月14日(木) 11:43
by non
softyaさん
大変失礼しました。確かに、質問者を勘違いしてました。すみません。

参考になるHPを見つけました。
http://www2.denshi.numazu-ct.ac.jp/lego ... index.html

Re: ライントレースできません

Posted: 2011年7月14日(木) 11:51
by softya(ソフト屋)
nonさん、ありがとうございます。大体は分かりました。
どうしてブレーキを踏みながら、アクセルを踏んだりしているのが意味不明ですね。
ご本人に説明を願いたいところです。

コード自体もブレーキを直しても

コード:

if (ecrobot_get_light_sensor(NXT_PORT_S1)<=520)
    {
    nxt_motor_set_speed(NXT_PORT_A, 30, 0);
        nxt_motor_set_speed(NXT_PORT_C, 30,0);
    }
    else 
    {nxt_motor_set_speed(NXT_PORT_A, 30, 0);
        nxt_motor_set_speed(NXT_PORT_C, -30, 0);
    }
この前進と回転の切り替えは急すぎないかとか、片方への旋回でことが済むのかなど疑問ありまくりです。
単センサのライントレースは右旋回・左旋回を繰り返しながら前進しないとまずいと思うのですけどね。

>前進、回転、バック、前進、右折、反転、前進、回転、バック
これのトリガになる条件も不明ですし、ライントレースを無視する動作にも感じますね。
ライントレースとどう両立するか説明をお願いしたいです。