0

私はNXTレゴマインドストームロボットに取り組んでおり、単一の反射光センサーを備えたラインフォロワーロボットを構築しており、C言語でプログラミングしています。

センサーは生のアナログ値を 0 ~ 1023 の範囲のデジタル値に変換します。

線が黒の場合はモーターが前進し、線がない場合 (白ベース) は停止し、灰色 (白と黒の線の間) がある場合は右に少し移動し、次に左に異なる方法で移動することをコーディングする必要があります。失われた黒い線を見つけます。

したがって、コードは次のようになります

While (1)
{
a=ecrobot_get_light_sensor(port_led); //storing the A/D converted value in variable

while (a<300)   // White area
{
ecrobot_status_monitor("White Area");
nxt_motor_set_speed(port_motor_l, 0, 1); // left motor turns off
nxt_motor_set_speed(port_motor_r, 0, 1); // right motor turns off
}
while (a>=600) // Black Line
{
ecrobot_status_monitor("Black Area");
nxt_motor_set_speed(port_motor_l, 100, 1); // left motor turns on
nxt_motor_set_speed(port_motor_r, 100, 1); // right motor turns on
}

while (a>=300 || a<600) // Robot loosing the black line
{
ecrobot_status_monitor("grey Area");
nxt_motor_set_speed(port_motor_l, 50, 1); // left motor move forward
nxt_motor_set_speed(port_motor_r, -50, 1); // right motor move backward

delay_ms(200)
nxt_motor_set_speed(port_motor_l, -50, 1); // left motor move backward
nxt_motor_set_speed(port_motor_r, 50, 1); // right motor move forward
delay_ms(200)

}

問題は、ロボットがラインを失った場合、停止せずに時計回りに動き始め、200 ミリ秒遅れて反時計回りに動くことです。

私のコードの問題は何ですか?

この間隔の後にモーターを停止するにはどうすればよいですか。モーターは、この間隔の後にラインを探して他の方向に移動する必要があり、その後、確実にラインを見つけることができます

ありがとう!

4

2 に答える 2

1

1 つの解決策は、while(1) ループ内のすべての while ステートメントを if ステートメントに変更することです。

たとえば、最後の while ステートメントで、ロボットが黒い線を緩めると、センサーから読み取った新しい値に関係なく、ロボットは時計回りに回転し、次に反時計回りに各方向に 200 ミリ秒回転します。これは、aが更新される前に、最後の while ステートメントが最初に実行を終了するためです。

于 2013-11-05T01:23:20.753 に答える
0

私はいくつかのことを見ます、

  • 一部のセミコロンがありません。コンパイルすらできないので、実際のコードではそうではないと確信しています。また、ステートメントに適切な括弧を付けてみてください(より良い方法:-)

  • また、デッドロックを回避するために、ループ中にセンサーを再読み取りする必要があります!!!

  • また、前述のように、大きな while ループで if/else if ステートメントを使用します。

  • いくつかのしきい値を追加して、よりスムーズにすることができます:-)

幸運を

于 2013-11-05T01:40:11.777 に答える