如何打破跑步的同时'循环基于按钮按下(Arduino)?

时间:2016-07-10 22:33:43

标签: arduino arduino-uno

所以我正在制作一个障碍避免机器人。到目前为止一切正常,除此之外:

我有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

2 个答案:

答案 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;
}