因此,在使用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);
}发布于 2017-08-27 02:02:48
您的测试顺序有问题:
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;
}
}https://stackoverflow.com/questions/45898099
复制相似问题