Closed. This question needs debugging details。它当前不接受答案。
想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。
2年前关闭。
Improve this question
我的代码有问题。我正确连接了所有电缆,但是传感器读取的值都不正确。否则我写的代码是错误的。当物体在前传感器的20cm之内时,汽车永远不会停止。而是继续行驶。 RC车通过3个超声波传感器连接到arduino。 RC电动机由H桥(不是屏蔽)驱动。注释的代码部分是RC汽车是否具有伺服的代码。但是这辆车有2个RC马达。
这是代码:
此
其他两个在这里:
每个变量都是一个新变量,该变量在定义它的作用域内是局部的(从定义到右花括号)。同样,这些已设置但从未检查过。
我认为您打算在任何函数之外声明一个全局变量:
然后,每当您要更改它时,只需分配给它,而无需重复类型:
然后,您将获得如下代码:
我不确定
这些都不能解释为什么汽车实际上并没有停止。我怀疑您从超声波传感器读取数据时也遇到问题。也许单位不是代码中表示的单位,或者您需要对读数进行一些平均(或其他滤波)以减少噪声和错误的读数。
想改善这个问题吗?更新问题,以便将其作为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