我正在使用 RobotC 为 Lego NXT 编写一个程序来模仿小狗的行为。这段代码应该旋转连接到电机端口 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])第一次旋转时,NXT 屏幕上会出现错误 0002EA Type2。起初我们认为这是因为我们过度旋转电机导致其被阻塞,所以我们尝试调整等待时间,但没有什么区别。
任何关于导致此错误的原因或如何修复该错误的想法将不胜感激。
为什么只有 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]。
在调试时,我开始放置断点以查看错误所在,并且它总是发生在
motor[3] = -SPEED/2;
行上,事实证明,对于第三个电机,正确的语法是使用 motor[motorA]=-SPEED/2;
。我不确定为什么只有这个电机返回此错误,因为我正在使用另外两个电机,我使用它们设置了新速度
motor[1]=SPEED;
motor[2]=SPEED;
然而,这是消除错误的方法。