Closed. This question needs debugging details。它当前不接受答案。












想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。

2年前关闭。



Improve this question




我的代码有问题。我正确连接了所有电缆,但是传感器读取的值都不正确。否则我写的代码是错误的。当物体在前传感器的20cm之内时,汽车永远不会停止。而是继续行驶。 RC车通过3个超声波传感器连接到arduino。 RC电动机由H桥(不是屏蔽)驱动。注释的代码部分是RC汽车是否具有伺服的代码。但是这辆车有2个RC马达。
这是代码:
 //Libraries.
//#include <Servo.h>
#include <NewPing.h>

//Variables.
/*const int pos = 103; //Servo midden 103*
  const int StrLeft = 70; //Serv0 naar links.
  const int StrRight = 133; //Servo naar rechts.*/
int Left = 5;
int Right = 4;
int Forwards = 3;
int Backwards = 2;
int potPin = A0;
int speed = 0;
#define TRIGGER_PIN1 11 //Front
#define ECHO_PIN1 12
#define TRIGGER_PIN2 7 //Left
#define ECHO_PIN2 8
#define TRIGGER_PIN3  9 //Right
#define ECHO_PIN3 10
#define MAX_DISTANCE 200
#define MAX_DISTANCEF 1000

//Name of the objects.
//Servo MyServo;
NewPing sonar1(TRIGGER_PIN1, ECHO_PIN1, MAX_DISTANCEF);//Front
NewPing sonar2(TRIGGER_PIN2, ECHO_PIN2, MAX_DISTANCE);//Left
NewPing sonar3(TRIGGER_PIN3, ECHO_PIN3, MAX_DISTANCE);//Right

//Start of the program.
void setup() {
  Serial.begin(9600);
  int Fwd = false;
  /*MyServo.attach(9); //Pin number of the attached Servo.
    MyServo.write(pos); //Resets to this posistion automatically.*/
  pinMode(Left, OUTPUT);
  pinMode(Right, OUTPUT);
  pinMode(Forwards, OUTPUT);
  pinMode(Backwards, OUTPUT);
}

//During the program.
void loop() {
  //Sturen
  /*MyServo.write(pos);
    delay(1000);
    MyServo.write(StrLeft);
    Serial.print("Links");
    delay(1000);
    MyServo.write(StrRight);
    Serial.print("Rechts");
    delay(1000);
    MyServo.write(pos);
    delay(1000);*/
  //Value of the potentiometer
  speed = analogRead(potPin);
  speed = map(speed, 0, 1023, 0, 179);
  Serial.print(speed);

  //Sensor
  unsigned int distanceF = sonar1.ping_cm();//Front
  unsigned int distanceL = sonar2.ping_cm();//Left
  unsigned int distanceR = sonar2.ping_cm();//Right
  Serial.print(distanceF);
  Serial.print(distanceL);
  Serial.print(distanceR);
  Serial.print("cm");
  delay(50);

  //Values for driving
  if (distanceF > 50 ) {
    int Fwd = true;
    Serial.print("true");
  } else {
    int Fwd = false;
    Serial.print("false");
    Stp();
  }
  delay(50);
  if ((distanceF = true) && (distanceL > distanceR)) {
    fwdLeft();
  } else if ((distanceF = true) && (distanceR > distanceL)){
    fwdRight();
  }
  delay(50);
}
void fwdLeft() {
  digitalWrite(Forwards, HIGH);
  digitalWrite(Backwards, LOW);
  digitalWrite(Left, HIGH);
  digitalWrite(Right, LOW);
}
void fwdRight() {
  digitalWrite(Forwards, HIGH);
  digitalWrite(Backwards, LOW);
  digitalWrite(Left, LOW);
  digitalWrite(Right, HIGH);
}
void Stp() {
  digitalWrite(Forwards, LOW);
  digitalWrite(Backwards, LOW);
  digitalWrite(Left, LOW);
  digitalWrite(Right, LOW);
}

最佳答案

在评论中,您说过Fwd变量永不更改。请注意,您有三个不同的变量名Fwd,尽管您似乎打算拥有一个全局变量。

第一个是setup:

void setup() {
  Serial.begin(9600);
  int Fwd = false;
  // ...
}

Fwd是本地设置的。它已设置,但从未读取。 setup一旦完成,就不再存在。

其他两个在这里:
if (distanceF > 50 ) {
  int Fwd = true;
  Serial.print("true");
} else {
  int Fwd = false;
  Serial.print("false");
  Stp();
}

每个变量都是一个新变量,该变量在定义它的作用域内是局部的(从定义到右花括号)。同样,这些已设置但从未检查过。

我认为您打算在任何函数之外声明一个全局变量:
int Fwd = false;

然后,每当您要更改它时,只需分配给它,而无需重复类型:
Fwd = true;

然后,您将获得如下代码:
if ((distanceF = true) && (distanceL > distanceR))

我不确定(distanceF = true)的意图是什么,但是我不认为该代码可以实现您认为的目的。由于您只使用了一个=,因此这是一种分配,而不是一种比较。因此,您的if条件实际上是将distanceF的值更改为true,而不是检查它是否为真(或非零)。我怀疑你在那里想要Fwd:
if (Fwd && (distanceL > distanceR))

这些都不能解释为什么汽车实际上并没有停止。我怀疑您从超声波传感器读取数据时也遇到问题。也许单位不是代码中表示的单位,或者您需要对读数进行一些平均(或其他滤波)以减少噪声和错误的读数。

08-20 01:45