我的线传感器Arduino机器人上的右电机即使在不满足运行它的要求时也会运行

时间:2017-08-26 17:41:55

标签: arduino

因此,在使用RedBot线传感器的线传感器机器人的Arduino代码中,即使两个传感器都检测到黑色(一条线),右侧电机似乎也在运行。这不会发生在正确的电机上,所以我怀疑它与第一个" if"言。

当只有正确的传感器检测到黑色时,电机会停止,这只会使左电机运转。我不确定问题是什么,即使在没有满足条件的情况下也能使正确的电机运转,这对于传感器btw来说不是问题。我正在使用L293D电机驱动器来控制电机,但我怀疑它与此有什么关系。

#include <RedBot.h>

RedBotSensor right_sen = RedBotSensor(A5);  
RedBotSensor left_sen = RedBotSensor(A4); 
int lineStandard = 650;
int motorPinRight = 12;
int motorPinLeft = 10;

void setup()  
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(motorPinRight, OUTPUT);
  pinMode(motorPinLeft, OUTPUT);
  Serial.begin(9600);
  Serial.println("IR Sensor Readings:: ");
  delay(1000);
}

void loop() {
  if(left_sen.read() > lineStandard) {
   left();
   digitalWrite(LED_BUILTIN, HIGH);
  } else if(right_sen.read() > lineStandard) {
    right();
    digitalWrite(LED_BUILTIN, HIGH);
  } else if((left_sen.read() < lineStandard) && (right_sen.read() < lineStandard)) {
    forward();
    digitalWrite(LED_BUILTIN, LOW);
  } else if((left_sen.read() > lineStandard) && (right_sen.read() > lineStandard)) {
    halt();
    digitalWrite(LED_BUILTIN, HIGH);
  } else {
    halt();
  }
  delay(10);
}

void forward() {
  digitalWrite(motorPinRight, HIGH);
  digitalWrite(motorPinLeft, HIGH);
}

void left() {
  digitalWrite(motorPinRight, HIGH);
  digitalWrite(motorPinLeft, LOW);
}

void right() {
  digitalWrite(motorPinRight, LOW);
  digitalWrite(motorPinLeft, HIGH);
}

void halt() {
  digitalWrite(motorPinRight, LOW);
  digitalWrite(motorPinLeft, LOW);
}

1 个答案:

答案 0 :(得分:1)

测试顺序有问题:

 if(left_sen.read() > lineStandard){ /* ...*/ }
 else if(right_sen.read() > lineStandard){ /* ...*/ }
 else if((left_sen.read() < lineStandard) && (right_sen.read() < lineStandard)) { /* ...*/ }
 else if((left_sen.read() > lineStandard) && (right_sen.read() > lineStandard)) 
     { /* this block cannot be reached, because of first test  */ 
       /* should be moved to first position, because it's more */
       /* restrictive than both tests 1 and 2                  */ }
 else { /* ...*/ }

要避免此问题,您应该首先从最严格的条件开始重新排序测试,或者使用switch语句重写代码,这将使代码更清晰。

#define LEFT_DETECT  (1 << 0)
#define RIGHT_DETECT (1 << 1)
// ...


void movementControl()
{
    char detect;
    detect = (left_sen.read() > lineStandard) ? LEFT_DETECT : 0;
    detect += (right_sen.read() > lineStandard) ? RIGHT_DETECT : 0;

    switch(detect)
    {
    case LEFT_DETECT:
        left(); 
        digitalWrite(LED_BUILTIN, HIGH);  
        break;

    case RIGHT_DETECT:
        right();
        digitalWrite(LED_BUILTIN, HIGH);  
        break;

    default:
    case LEFT_DETECT + RIGHT_DETECT:
         halt();
         break;

    case 0:
        forward();
        digitalWrite(LED_BUILTIN, LOW);  
        break;
    }
}