C言語でライントレースをしたいのですが、黒のライン上をうまく走りません
センサは1つです
ライントレースできません
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: ライントレースできません
それだけだと、さっぱり分かりません。あ さんが書きました:C言語でライントレースをしたいのですが、黒のライン上をうまく走りません
センサは1つです
一言で言えば「バグです」としか応えられないわけです。
ソースコードや使っているマイコン、開発環境、ライントレースロボットの名前(ホームページ)など詳細な情報が欲しいです。
あと、なるべくちゃんとした名前をつけてくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
あ
Re: ライントレースできません
すいません。急いでるので・・・
codeタグを追加しました。 by softya(ソフト屋)
おねがいします。
ロボットはLEGOです。
白に十字型黒のラインです
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です。
白に十字型黒のラインです
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: ライントレースできません
急がれているようですが、締切りは何時ですか?
あとLEGOは未経験なので、お答えできるか自信はありません。
資料サイトなど有ったら教えてください。
あとLEGOは未経験なので、お答えできるか自信はありません。
資料サイトなど有ったら教えてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: ライントレースできません
数々の疑問が、
まず、
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が外部の何に接続されているかも教えてください。
まず、
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が外部の何に接続されているかも教えてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ライントレースできません
期限があると言うことは、学校の課題でしょうに。
なぜ、わからないことを先生に聞けないのでしょうか?
>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が外部の何に接続されているかも教えてください。
そんなの、私たちがわかるわけがない。組み立てた本人がわからないのに。
なぜ、わからないことを先生に聞けないのでしょうか?
>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が外部の何に接続されているかも教えてください。
そんなの、私たちがわかるわけがない。組み立てた本人がわからないのに。
non
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: ライントレースできません
nonさん、相手を間違えてません?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ライントレースできません
softyaさん
大変失礼しました。確かに、質問者を勘違いしてました。すみません。
参考になるHPを見つけました。
http://www2.denshi.numazu-ct.ac.jp/lego ... index.html
大変失礼しました。確かに、質問者を勘違いしてました。すみません。
参考になるHPを見つけました。
http://www2.denshi.numazu-ct.ac.jp/lego ... index.html
non
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: ライントレースできません
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);
}単センサのライントレースは右旋回・左旋回を繰り返しながら前進しないとまずいと思うのですけどね。
>前進、回転、バック、前進、右折、反転、前進、回転、バック
これのトリガになる条件も不明ですし、ライントレースを無視する動作にも感じますね。
ライントレースとどう両立するか説明をお願いしたいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。