0

我正在为 Lego NXT 编写一个使用RobotC的程序来模仿小狗的行为。这段代码应该是旋转连接到电机端口 3 的磁头并读取超声波传感器上的值。如果在转动头部的同时,狗被召唤,它会转向它已经面对的方向。当超声波传感器读取到一个值(意味着机器人已经接近墙壁)时,会调用以下函数:

可见的

void SonarSensor()
{

int sensorValleft;

int sensorValright;
bool alreadyTurned = false;

int i,j;
i = 0;
j = 0;

motor[1] = 0;
motor[2] = 0;

motor[3] = -SPEED/2;
wait10Msec(15);
motor[3] = 0;
sensorValleft = SensorValue[3];

while(i<100)
{
    if(SensorValue[4] > 40)//calibrate sound sensor
    {
        //turn left
        motor[1]=SPEED;
        motor[2] = -SPEED;
        wait10Msec(25);
        i = 1000;
        j = 1000;
        alreadyTurned = true;
    }
    else
    {
        i++;
        wait1Msec(5);

    }
}
motor[3] = SPEED/2;
wait10Msec(30);
motor[3] = 0;
sensorValright = SensorValue[3];

while(j<100)
{
    if(SensorValue[3] > 1)//calibrate sound sensor
    {
        //turn right
        motor[1]-=SPEED;
        motor[2] = SPEED;
        wait10Msec(25);
        j = 1000;
        alreadyTurned = true;
    }
    else
    {
        j++;
        wait1Msec(5);

    }
}
if(alreadyTurned == false)
{
    if(sensorValleft > sensorValright)
    {
        //turn left
        motor[1]=SPEED;
        motor[2] = -SPEED;
        wait10Msec(25);
    }
    else
    {
        //turn right
        motor[1]=-SPEED;
        motor[2] = SPEED;
        wait10Msec(25);
    }
}

}可见的

当磁头(电机[3])第一次旋转时,错误 0002EA Type2 出现在 NXT 屏幕上。起初我们认为这是因为我们过度旋转电机导致它被阻塞,所以我们试图玩弄等待时间,但没有任何区别。

任何有关导致此错误的原因或如何解决此错误的想法将不胜感激。

谢谢, 多米尼克

4

2 回答 2

1

关于为什么只有 motor[3] 会导致错误的答案实际上非常简单。motorA、motorB 和 motorC 值在枚举中定义,其中 motorA=0、motorB=1 和 motorC=2。因此,motor[1] 和 motor[2] 等价于调用 motor[motorB] 和 motor[motorC]。然而,motor[3] 并不等同于任何东西。它试图设置一个不存在的电机的功率。但是,motor[0] 可以,并且对应于 motor[motorA]。

于 2015-05-23T19:59:22.613 回答
0

在调试时,我开始设置断点以查看错误在哪里,并且它总是发生在行上motor[3] = -SPEED/2;,事实证明对于第三个电机,正确的语法是使用motor[motorA]=-SPEED/2;. 我不确定为什么只有这个电机会返回此错误,因为我正在使用另外两个电机,我使用这些电机设置了新速度

motor[1]=SPEED;
motor[2]=SPEED;

但是,这是消除错误的方法。

于 2013-03-25T16:00:18.847 回答