adruino使用超声波传感器连续探测两次第二次测距结果始终为0。
在小车上装载了3个超声波传感器,伸手拦在右传感器sensor[3]前(还隔着一点距离)
如图所示在loop的for循环中测量了一次sensor[3]对应的距离,for循环中的测距十分正常。
但后面再次测量时,得到的distanceR却始终为0,distanceL依然正常。
void moveStop();
void moveForward();
void moveBackward();
void turnLeft();
void turnRight();
void avoidance();
void moveRight();
void moveLeft();
// Motor 前左轮
int enFL =8;
int inFL1=2;
int inFL2=3;
// Motor 前右轮
int enFR =9;
int inFR1=4;
int inFR2=5;
// Motor 后左轮
int enBL=12;
int inBL1=6;
int inBL2=7;
// Motor 后右轮
int enBR =13;
int inBR1=10;
int inBR2=11;
int distance=0;
int sensor[4][5]={{24,22,2,0,10},{38,40,3,0,30},{28,30,0,0,11},{39,37,1,0,30}};//后左前右,前两维为端口二维数组第三维为每个绝对方向,第四维为有无墙
int maps[4];//后左前右有无墙
int backWard=0;
void setup() {
Serial.begin(9600);
for(int i=1;i<4;i++){
pinMode(sensor[i][0],OUTPUT);//trigpin
pinMode(sensor[i][1],INPUT);//echopin
}
// Set all the motor control pins to outputs
pinMode(enFL, OUTPUT);
pinMode(enFR, OUTPUT);
pinMode(enBL, OUTPUT);
pinMode(enBR, OUTPUT);
pinMode(inFL1, OUTPUT);
pinMode(inFL2, OUTPUT);
pinMode(inFR1, OUTPUT);
pinMode(inFR2, OUTPUT);
pinMode(inBL1, OUTPUT);
pinMode(inBL2, OUTPUT);
pinMode(inBR1, OUTPUT);
pinMode(inBR2, OUTPUT);
// Turn off motors - Initial state
digitalWrite(inFL1,LOW);
digitalWrite(inFL2,LOW);
digitalWrite(inFR1,LOW);
digitalWrite(inFR2,LOW);
digitalWrite(inBL1,LOW);
digitalWrite(inBL2,LOW);
digitalWrite(inBR1,LOW);
digitalWrite(inBR2,LOW);
}
void loop() {
for(int i=1;i<4;i++){
digitalWrite(sensor[i][0],LOW);
delayMicroseconds(2);
digitalWrite(sensor[i][0],HIGH);
delayMicroseconds(10);
digitalWrite(sensor[i][0],LOW);
distance = pulseIn(sensor[i][1],HIGH)/58.3;
Serial.println(distance);
if(distance<sensor[i][4]){
sensor[i][3]=1;
}}
if(sensor[3][3]==0){
moveStop();
turnRight();
moveStop();
moveForward();
delay(1100);
}
else{
if(sensor[2][3]==0){
digitalWrite(sensor[3][0],LOW);
delayMicroseconds(2);
digitalWrite(sensor[3][0],HIGH);
delayMicroseconds(10);
digitalWrite(sensor[3][0],LOW);
int distanceR = pulseIn(sensor[3][1],HIGH)/58.3;
Serial.println("L");
Serial.println(distanceR);//调试用
digitalWrite(sensor[1][0],LOW);
delayMicroseconds(2);
digitalWrite(sensor[1][0],HIGH);
delayMicroseconds(10);
digitalWrite(sensor[1][0],LOW);
int distanceL = pulseIn(sensor[1][1],HIGH)/58.3;
Serial.println("L:");
Serial.println(distanceL);//调试用
if(distanceL<=1)
{moveRight();}
else{
if(distanceR<=1 &&distanceR!=0)
{moveLeft();}
else{
moveForward();
delay(10);
}
}
}
else{
if(sensor[1][3]==0){
moveStop();
turnLeft();
moveStop();
moveForward();
delay(1100);
}
else{
if(sensor[3][3]==1 && sensor[2][3]==1 &&sensor[1][3]==1)
{
moveStop();
turnRight();
moveStop();
turnRight();
moveStop();
}
else{
moveStop();
}
}
}
}
for(int i=1;i<4;i++){
sensor[i][3]=0;
}
}
引用chatgpt内容作答:
根据您提供的代码,第二次测量距离始终为0的问题可能与以下原因相关:
超声波传感器连接问题:请确保超声波传感器的引脚连接正确,包括触发引脚(trigpin)和回响引脚(echopin)。检查传感器引脚的物理连接,确保没有松动或接触不良。
电路问题:检查电路是否存在任何短路或其他问题。确保传感器的供电和接地是正确的,并且没有其他电路问题干扰传感器的工作。
超声波传感器设置:在每次测量之前,您需要对超声波传感器进行正确的设置。根据您的代码,您使用了以下设置:
digitalWrite(sensor[i][0], LOW);
delayMicroseconds(2);
digitalWrite(sensor[i][0], HIGH);
delayMicroseconds(10);
digitalWrite(sensor[i][0], LOW);
这是触发传感器发射超声波脉冲的代码。请确保这部分代码正确设置了传感器的触发引脚。
测距延迟:在进行连续测量时,超声波传感器需要一定的时间来发送和接收超声波信号。在每次测量之间添加适当的延迟,以确保超声波信号完全返回传感器。
在您的代码中,可以尝试增加以下行来为传感器测量提供足够的延迟:
delay(100); // 在两次测量之间添加适当的延迟时间
这将在两次测量之间添加100毫秒的延迟,以确保超声波信号返回传感器。
请尝试上述建议,并确保您的超声波传感器的引脚连接和设置正确。