所以我正在制作一个障碍避免机器人。到目前为止一切正常,除此之外:
我有2种模式。空闲和避障。空闲基本上是闪烁一些LED并停止机器人可能正在执行的任何活动。只需按一下按钮即可进行模式切换。这是执行此操作的功能:
void manageRobotState() {
if (digitalRead(button) == LOW) {
robotState = 0;
halt();
idlePose();
blinkLED(leftLED, 1000);
blinkLED(rightLED, 1000);
} else if (digitalRead(button) == HIGH) {
robotState = 1;
digitalWrite(leftLED, HIGH);
digitalWrite(rightLED, HIGH);
simpleObstacleAvoidence();
}
delay(100);
}
所以关键是点击按钮后robotState
变量会发生变化。现在这个代码工作,除了机器人转向时的情况。
void smartTurnLeft() {
turning();
while (currentDistanceAhead <= minimumDistance) {
Serial.println("turning");
if (robotState == 0) {
break;
}
scanAhead();
leftMotor.setSpeed(50);
rightMotor.setSpeed(50);
leftMotor.run(BACKWARD);
rightMotor.run(BACKWARD);
blinkLED(leftLED, 20);
digitalWrite(rightLED, LOW);
delay(20);
}
}
我觉得当这个循环运行时别的什么都不会发生?我按下按钮然后这个循环继续执行。有什么可以做的吗?
可以看到完整的代码HERE
答案 0 :(得分:1)
免责声明:我对Arduino一无所知,但认为它就像C一样。
所以我在Arduino中找到了关于volatile
关键字的this引用。它的工作方式与C类似。问题是您的if (robotState == 0)
测试正在优化,因为编译器可以看到robotState
未在循环中更新。
volatile
关键字告诉编译器该内存地址可能在正常程序流之外更新(因为它是硬件寄存器,或者因为它可能通过另一个执行线程更新)。因此,您需要进行的代码更改是robotState
的声明。您可能与其他变量有类似的问题。
答案 1 :(得分:0)
我认为您唯一要做的就是在manageRobotState()
函数的while loop
内调用smartTurnLeft()
函数,就像这样
manageRobotState();
if (robotState == 0) {
break;
}