首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的线路传感器上的右电机Arduino机器人即使在不满足运行要求的情况下也能运行

我的线路传感器上的右电机Arduino机器人即使在不满足运行要求的情况下也能运行
EN

Stack Overflow用户
提问于 2017-08-27 01:41:55
回答 1查看 62关注 0票数 1

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

然而,当只有右侧的传感器检测到黑色时,马达就会停止,这只会使左侧的马达运行。我不确定是什么问题,使正确的电机运行,即使它的条件不满足,这不是一个问题与传感器btw。我正在使用一个L293D马达驱动器来控制马达,但我怀疑这与此有任何关系。

代码语言:javascript
复制
#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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-27 02:02:48

您的测试顺序有问题:

代码语言:javascript
复制
 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语句重写代码,这将使代码更清晰。

代码语言:javascript
复制
#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;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45898099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档