因此,在使用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);
}
答案 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;
}
}